我正在使用minikube来测试本地Kubernetes场景。我有2个Python Flask应用程序,名为“frontend.py”和“interceptor.py”。基本上,我想对前端应用程序进行GET,然后将其执行到拦截器应用程序的POST,并从拦截器接收回响应。如果我手动找到拦截器应用程序的IP并将其提供在我的'frontend.py'脚本中,则可以正常工作。
我的问题:是否存在一种建议的方法,该方法可以从另一个容器容器中的应用程序自动确定在一个容器容器中运行的应用程序的IP地址?
我想知道是否还有其他方法可以通过我创建的Kubernetes Service向其他人公开Pod的信息,但是我还没有任何运气。
以下是我的服务和部署。
flask-frontend-deployment.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: frontend-deployment
labels:
app: flask
spec:
selector:
matchLabels:
app: flask
replicas: 1
template:
metadata:
labels:
app: flask
tier: frontend
spec:
containers:
- name: flask-frontend
image: alec/flask/frontend:1.0
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: dns
ports:
- containerPort: 5001
flask-frontend-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: NodePort
selector:
app: flask
ports:
- protocol: TCP
port: 5001
targetPort: 5001
flask-interceptor-deployment.yaml
apiVersion: apps/v1 # for versions before 1.9.0 use apps/v1beta2
kind: Deployment
metadata:
name: interceptor-deployment
labels:
app: flask
spec:
selector:
matchLabels:
app: inter
role: mid
tier: middle
replicas: 1
template:
metadata:
labels:
app: inter
role: mid
tier: middle
spec:
containers:
- name: flask-interceptor
image: alec/flask/interceptor:1.0
resources:
requests:
cpu: 100m
memory: 100Mi
env:
- name: GET_HOSTS_FROM
value: env
ports:
- containerPort: 5002
flask-interceptor-service.yaml
apiVersion: v1
kind: Service
metadata:
name: interceptor-service
spec:
ports:
- protocol: TCP
port: 5002
frontend.py
from flask import Flask
from flask import request
import requests
app = Flask(__name__)
@app.route("/")
def hello():
address = 'http://172.17.0.5:5002/' #<--- this is the IP I want to get automatically
r = requests.post(address, data="---[Token]---")
return "Frontend Here. Response from Backend = "+str(r.content)
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0',port=5001)
拦截器。py
from flask import Flask
from flask import request
import requests
app = Flask(__name__)
content = ""
@app.route("/", methods=['POST'])
def testPost():
if request.method == 'POST':
return "Received POST --->>> " + str(request.data)
else:
return "Post didnt work"
@app.route("/", methods=['GET'])
def hello():
return "Hello from the interceptor!"
if __name__ == "__main__":
app.run(debug=True,host='0.0.0.0',port=5002)
最佳答案
只要您在kube-dns
中启用了minikube
附加组件,您就应该能够执行基于DNS的服务发现。我想说这是获得资源IP地址的推荐方法。
要再次检查是否已启用kube-dns
,请运行minikube addons list
,默认情况下应启用它。
为您创建的DNS名称将默认来自资源的metadata: name
字段。假设您将使用default
命名空间,那么您的服务DNS名称将为:interceptor-service.default.svc.cluster.local
和frontend-service.default.svc.cluster.local
您可以在应用程序中使用这些完全限定的域名来访问服务,也可以使用较短的域名,例如按原样frontend-service
。这是可能的,因为您的Pods resolv.conf
将配置为在查询default.svc.cluster.local
时查找frontend-service
。
要对此进行测试(并在注释中注明),您现在应该可以更改此行:address = 'http://172.17.0.5:5002/'
至address = 'http://interceptor-service:5002/'
在您的Flask应用代码中。
请参阅this页面以获取有关Kubernetes中服务和Pod的DNS的更多详细信息。