Могут ли две кластерные IP-службы быть связаны в Куберне? - PullRequest
2 голосов
/ 08 апреля 2020

Ситуация такова, что я хочу соединить две кластерные IP-службы, которые находятся внутри арендатора, который уже имеет Traefik в качестве NodePort, чтобы любая из этих двух служб могла быть LoadBalancer, потому что NodePort используется Traefik.

Две службы, которые я пытаюсь соединить, работают следующим образом. Первый, который я назвал «Мастер», получит сообщение от клиента с текстом и вызовет другой сервис, называемый «раб», который добавит некоторый текст («Hola Patri») к тексту, отправленному клиент. Этими двумя сервисами являются flask сервисы, определенные app.py в образе Docker. Вы можете увидеть app.py для обоих изображений ниже:

master / app.py

from flask import Flask, request
import requests                                                                                                                                                                                                                                                                                                                                                       

app = Flask(__name__)                                                              

@app.route("/", methods = ['GET', 'POST'])                                                 

def put(): 
    if request.method == 'POST':                                                    
        text = request.get_data()  
        r = requests.post("http://slave:5001",data=text)   
        result = r.text
        return result                                                        

if __name__ == '__main__':                                                         
    app.run(host="0.0.0.0", port=5000, debug=True)        

slave / app.py

from flask import Flask, request                                                                                                                                                                                                                                                                                                                                                       

app = Flask(__name__)                                                              

@app.route("/", methods = ['GET', 'POST'])                                                 

def put(): 
    if request.method == 'POST':                                                    
        text = request.get_data()
        #text = request.data
        texto_final = str(text) + 'Hola Patri'                                                      
        return texto_final                                                     

if __name__ == '__main__':                                                         
    app.run(host="0.0.0.0", port=5001, debug=True)   

Конфигурация развертываний и служб определяется в двух yamls: master_sr c .yaml и slave_sr c .yaml.

master_sr c. yaml

kind: Namespace
apiVersion: v1
metadata:
  name: innovation
  labels:
    name: innovation

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: master
  namespace: innovation
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      securityContext:
        runAsUser: 1000
        fsGroup: 1000            
      containers:
      - name: master
        imagePullPolicy: Always
        securityContext:
            runAsUser: 1000
            runAsNonRoot: true
        image: reg-dhc.app.corpintra.net/galiani/innovation:mastertest
        ports:
        - protocol: TCP
          containerPort: 5000
      imagePullSecrets:
        - name: galiani-innovation-pull-secret

---
apiVersion: v1
kind: Service
metadata:
  name: master
  namespace: innovation
spec:
  ports:
  - protocol: TCP
    port: 5000
    targetPort: 5000
  selector:
    app: myapp

slave_sr c .yaml

kind: Namespace
apiVersion: v1
metadata:
  name: innovation
  labels:
    name: innovation

---

apiVersion: apps/v1
kind: Deployment
metadata:
  name: slave
  namespace: innovation
spec:
  replicas: 1
  selector:
    matchLabels:
      app: myapp
  template:
    metadata:
      labels:
        app: myapp
    spec:
      securityContext:
        runAsUser: 1000
        fsGroup: 1000  
      containers:
      - name: slave
        imagePullPolicy: Always
        securityContext:
            runAsUser: 1000
            runAsNonRoot: true
        image: reg-dhc.app.corpintra.net/galiani/innovation:slavetest
        ports:
        - protocol: TCP
          containerPort: 5001
      imagePullSecrets:
        - name: galiani-innovation-pull-secret

---
apiVersion: v1
kind: Service
metadata:
  name: slave
  namespace: innovation
spec:
  selector:
    app: myapp
  ports:
  - protocol: TCP
    port: 5001
    targetPort: 5001

Я также создал сетевую политику, разрешающую трафик c между две услуги. Для определения сетевой политики используется yaml:

networkpolicy_sr c .yaml

kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
  name: ingress-to-all
  namespace: innovation
spec:
  podSelector:
    matchLabels:
      app: myapp
  ingress: 
  - from:
    - podSelector:
        matchLabels:
          app: myapp
    ports:
      - port: 5000
        protocol: TCP
      - port: 5001
        protocol: TCP
  policyTypes:
  - Ingress

Соединение между главной и подчиненной службами не работает. Я могу получить доступ к ведущему и подчиненному независимо. Тем не менее, когда я пытаюсь сделать POST для мастера (используя curl) и он должен подключиться к ведомому, я получаю следующую ошибку:

curl: (52) Empty reply from server

Заранее благодарю за помощь!


Для нового вопроса, который у меня есть относительно подключения с использованием traefik. Вот что такое входящий трафик:

kind: Ingress
apiVersion: extensions/v1beta1
metadata:
  name: ingress-innovation
  namespace: innovation
  annotations:
    traefik.frontend.rule.type: PathPrefixStrip
spec:  
  rules:
  - http:
      paths:
      - path: /master
        backend:
          serviceName: master
          servicePort: 5000
      - path: /slave
        backend:
          serviceName: slave
          servicePort: 5001

Я также исправил сетевую политику yaml, и теперь это:

kind: NetworkPolicy
apiVersion: extensions/v1beta1
metadata:
  name: master-to-slave
  namespace: innovation
spec:
  podSelector:
    matchLabels:
      app: app-slave
  ingress:
    - ports:
      - port: 5000
        protocol: TCP
      - port: 5001
        protocol: TCP
    - from:
      - namespaceSelector:
          matchLabels:
            app: app-master

Еще раз спасибо за вашу помощь!

1 Ответ

2 голосов
/ 08 апреля 2020

Возможно, проблема связана с одинаковой меткой app: myapp как для главного, так и для ведомого. Измените метку на app: master для основного развертывания и обслуживания и app: slave для подчиненного развертывания и обслуживания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...