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.

Другие вопросы по тегам