Kubernetes:自动确定另一个 pod/container 的 IP 地址
Kubernetes: Automatically determine IP Address of another pod/container
我正在使用名为 'frontend.py' 和 'interceptor.py' 的 minikube to test out a local Kubernetes scenario. I have 2 Python Flask 个应用程序。基本上我想对前端应用程序执行 GET,然后对拦截器应用程序执行 POST,并从拦截器接收响应。如果我手动找到拦截器应用程序的 IP 并在我的 'frontend.py' 脚本中提供它,我就可以正常工作。
我的问题:是否有推荐的方法来自动确定一个 pod 容器中的应用程序 运行 与另一个 pod 容器内的应用程序的 IP 地址?
我想知道如果有其他方法可以通过 Kubernetes Service 向彼此公开 pods' 信息,我是否甚至不需要自己在应用程序中收集 IP我创造了,但我还没有运气。
以下是我的服务和部署。
烧瓶前端-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
烧瓶前端-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: NodePort
selector:
app: flask
ports:
- protocol: TCP
port: 5001
targetPort: 5001
烧瓶拦截器-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
烧瓶拦截器-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)
interceptor.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
原样。这是可能的,因为您的 Pods resolv.conf
将被配置为在查询 frontend-service
.
时查找 default.svc.cluster.local
要对此进行测试(并在评论中注明),您现在应该可以更改此行:
address = 'http://172.17.0.5:5002/'
至
address = 'http://interceptor-service:5002/'
在您的 Flask 应用程序代码中。
请参阅 this 页面以获取有关 DNS for Services 和 Kubernetes 中 Pods 的更多详细信息。
我正在使用名为 'frontend.py' 和 'interceptor.py' 的 minikube to test out a local Kubernetes scenario. I have 2 Python Flask 个应用程序。基本上我想对前端应用程序执行 GET,然后对拦截器应用程序执行 POST,并从拦截器接收响应。如果我手动找到拦截器应用程序的 IP 并在我的 'frontend.py' 脚本中提供它,我就可以正常工作。
我的问题:是否有推荐的方法来自动确定一个 pod 容器中的应用程序 运行 与另一个 pod 容器内的应用程序的 IP 地址?
我想知道如果有其他方法可以通过 Kubernetes Service 向彼此公开 pods' 信息,我是否甚至不需要自己在应用程序中收集 IP我创造了,但我还没有运气。
以下是我的服务和部署。
烧瓶前端-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
烧瓶前端-service.yaml
apiVersion: v1
kind: Service
metadata:
name: frontend-service
spec:
type: NodePort
selector:
app: flask
ports:
- protocol: TCP
port: 5001
targetPort: 5001
烧瓶拦截器-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
烧瓶拦截器-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)
interceptor.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
原样。这是可能的,因为您的 Pods resolv.conf
将被配置为在查询 frontend-service
.
default.svc.cluster.local
要对此进行测试(并在评论中注明),您现在应该可以更改此行:
address = 'http://172.17.0.5:5002/'
至
address = 'http://interceptor-service:5002/'
在您的 Flask 应用程序代码中。
请参阅 this 页面以获取有关 DNS for Services 和 Kubernetes 中 Pods 的更多详细信息。