gpt4 book ai didi

flask - Kubernetes:自动确定另一个 pod/容器的 IP 地址

转载 作者:行者123 更新时间:2023-12-03 16:04:49 25 4
gpt4 key购买 nike

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

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

我在想,如果有其他方法可以通过 Kubernetes Service 向彼此公开 pod 的信息,我是否甚至不需要在应用程序本身中收集 IP我创造的,但我还没有任何运气。

以下是我的服务和部署。

flask 前端部署.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 前端服务.yaml

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

flask 拦截器部署.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 拦截器服务.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)

最佳答案

只要您在 minikube 中启用了 kube-dns 附加组件,您就应该能够执行基于 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 原样。这是可能的,因为您的 Pod resolv.conf 将配置为在查询 frontend-service 时查看 default.svc.cluster.local

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

地址 = 'http://172.17.0.5:5002/'

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

在您的 Flask 应用代码中。

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

关于flask - Kubernetes:自动确定另一个 pod/容器的 IP 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51447374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com