Kubernetes: автоматически определять IP-адрес другого модуля или контейнера
Я использую миникуб, чтобы проверить местный сценарий Кубернетеса. У меня есть 2 приложения Python Flask с именами "frontend.py" и "interceptor.py". По сути, я хочу сделать GET для внешнего приложения, которое затем выполнит POST для приложения-перехватчика и получит ответ от перехватчика. У меня это работает, если я вручную нахожу IP-адрес приложения-перехватчика и предоставляю его в своем скрипте "frontend.py".
Мой вопрос: есть ли рекомендуемый способ автоматического определения IP-адреса приложения, работающего в контейнере одного модуля, из приложения внутри контейнера другого модуля?
Мне интересно, может, мне даже не понадобится собирать IP- адреса в самих приложениях, если есть какой-то другой способ предоставления информации о модулях друг другу через созданный мною сервис Kubernetes, но мне пока не повезло,
Ниже приведены мои услуги и развертывания.
Колба-интерфейс-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)
1 ответ
Пока у вас есть kube-dns
надстройка включена в minikube
Вы должны быть в состоянии выполнить обнаружение службы на основе DNS. Я бы сказал, что это рекомендуемый способ получения IP-адресов ваших ресурсов.
Чтобы дважды проверить, что у вас есть kube-dns
включенный запуск minikube addons list
, он должен быть включен по умолчанию.
DNS-имена, созданные для вас, будут по умолчанию получены из metadata: name
поле вашего ресурса (ов). Предполагая, что вы будете использовать default
namespace, тогда ваши DNS-имена служб будут:
interceptor-service.default.svc.cluster.local
а также
frontend-service.default.svc.cluster.local
Вы можете использовать эти полностью определенные доменные имена в вашем приложении для доступа к вашим Сервисам или использовать более короткую версию, например frontend-service
как есть. Это возможно, так как ваши стручки resolv.conf
будет настроен для поиска в default.svc.cluster.local
при запросе frontend-service
,
Чтобы проверить это (и отмечено в комментариях), теперь вы сможете изменить эту строку:
address = 'http://172.17.0.5:5002/'
в
address = 'http://interceptor-service:5002/'
в коде приложения Flask.
Пожалуйста, смотрите эту страницу для более подробной информации о DNS для служб и модулей в Kubernetes.