我正在使用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的更多详细信息。

10-01 03:01