首页 > 解决方案 > Kubernetes:自动确定另一个 pod/容器的 IP 地址

问题描述

我正在使用minikube测试本地 Kubernetes 场景。我有 2 个名为“frontend.py”和“interceptor.py”的Python Flask应用程序。基本上,我想对前端应用程序执行 GET 操作,然后该应用程序将对拦截器应用程序执行 POST,并从拦截器接收响应。如果我手动找到拦截器应用程序的 IP 并在我的“frontend.py”脚本中提供它,我就有这个工作。

我的问题:是否有推荐的方法来从另一个 pod 容器内的应用程序自动确定在一个 pod 容器中运行的应用程序的 IP 地址?

我想知道如果有其他方法可以通过我创建的Kubernetes 服务将 Pod 的信息相互公开,我是否甚至不需要自己收集应用程序中的 IP ,但我还没有运气.

以下是我的服务和部署。

烧瓶前端部署.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

烧瓶前端服务.yaml

apiVersion: v1
kind: Service
metadata:
  name: frontend-service
spec:
  type: NodePort
  selector:
    app: flask
  ports:
  - protocol: TCP
    port: 5001
    targetPort: 5001

烧瓶拦截器部署.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

烧瓶拦截器服务.yaml

apiVersion: v1
kind: Service
metadata:
  name: interceptor-service
spec:
  ports:
  - protocol: TCP
    port: 5002

前端.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)

标签: flaskkubernetesminikube

解决方案


只要您kube-dns启用了附加组件,minikube您就应该能够执行基于 DNS 的服务发现。我想说这是获取资源 IP 地址的推荐方法。

要仔细检查您是否kube-dns启用了 run minikube addons list,它应该默认启用。

为您创建的 DNS 名称默认来自metadata: name您的资源字段。假设您将使用default命名空间,那么您的服务 DNS 名称将是:

interceptor-service.default.svc.cluster.local

frontend-service.default.svc.cluster.local

您可以在您的应用程序中使用这些完全限定的域名来访问您的服务或使用较短的版本,例如frontend-service原样。这是可能的,因为您的 Podresolv.conf将被配置为在default.svc.cluster.local查询frontend-service.

要对此进行测试(并在评论中注明),您现在应该能够更改此行:

address = 'http://172.17.0.5:5002/'

address = 'http://interceptor-service:5002/'

在您的 Flask 应用程序代码中。

有关 Kubernetes 中服务和 Pod 的 DNS 的更多详细信息,请参阅此页面。


推荐阅读