flask - 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)
解决方案
只要您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 的更多详细信息,请参阅此页面。
推荐阅读
- sql - 每个员工每天的第一个和最后一个条目
- vba - 时间和日期字段的查询条件分别超过午夜
- c# - 检测iPad的屏幕何时关闭或Unity中的Home按钮被按下事件?
- scala - Spark:读取表并按分区过滤
- java - 是否可以通过 OptaPlanner 验证现有解决方案以检查规则如何被破坏?
- java - 执行动态创建的 JUnit 测试时出错
- excel - worksheet.calculate 方法循环
- angular - 检测 Angular Change 事件中使用的 Select
- android - 有没有办法使用 logback-android 将我的 Android 应用程序中的事件记录到 Stackdriver?
- jenkins-pipeline - Jenkins Pipeline,在 emailext 插件中使用 Env Var