Многократное nginx проникновение Kubernetes на неверные сервисы - PullRequest
1 голос
/ 06 февраля 2020

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

Подводя итог, архитектура выглядит следующим образом:

  • cluster
    • namespace1
      • app1
      • service1
      • вход1
    • пространство имен
      • app2
      • service2
      • вход2

Моя проблема в том, что когда я использую внешний ip nginx -контроллера ingress2, он попадает в мое приложение1

Я использую helm для развертывания моего приложения

Ingress.yaml

apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
  name: "{{ .Release.Name }}-ingress"
  annotations:
    nginx.ingress.kubernetes.io/ssl-redirect: "false"
    nginx.ingress.kubernetes.io/rewrite-target: /$2
    kubernetes.io/ingress.class: "nginx"
spec:
  tls:
    - hosts:
      - {{ .Values.host }}
      secretName: {{ .Release.Namespace }}-cert-secret
  rules:
  - http:
    - path: /api($|/)(.*)
      backend:
        serviceName: "{{ .Release.Name }}-api-service"
        servicePort: {{ .Values.api.service.port.api }}

service.yaml

apiVersion: v1
kind: Service
metadata:
  name: "{{ .Release.Name }}-api-service"
spec:
  selector:
    app: "{{ .Release.Name }}-api-deployment"
  ports:
    - port: {{ .Values.api.service.port.api }}
      targetPort: {{ .Values.api.deployment.port.api }}
      name: 'api'

deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: "{{ .Release.Name }}-api-deployment"
spec:
  replicas: 1
  selector:
    matchLabels:
      app: "{{ .Release.Name }}-api-deployment"
  template:
    metadata:
      labels:
        app: "{{ .Release.Name }}-api-deployment"
    spec:
      containers:
      - name: "{{ .Release.Name }}-api-deployment-container"
        imagePullPolicy: "{{ .Values.api.image.pullPolicy }}"
        image: "{{ .Values.api.image.repository }}:{{ .Values.api.image.tag }}"
        command: ["/bin/sh"]
        args:
        - "-c"
        - "node /app/server/app.js"
        env:
        - name: API_PORT
          value: {{ .Values.api.deployment.port.api | quote }}

values.yaml

api:
  image:
    repository: xxx
    tag: xxx
    pullPoliciy: Always
  deployment:
    port:
      api: 8080
    ressources:
      requests:
        memory: "1024Mi"
        cpu: "1000m"
  service:
    port:
      api: 80
    type: LoadBalancer

Для развертывания моего приложения я запускаю:

  • helm install -n namespace1 release1 .
  • helm install -n namespace2 release2 .

kubectl -n namespace1 get sv c

NAME                                       TYPE           CLUSTER-IP      EXTERNAL-IP                                                               PORT(S)                                       AGE
nginx-ingress-1581005515-controller        LoadBalancer   10.100.20.183   a661e982f48fb11ea9e440eacdf86-1089217384.eu-west-3.elb.amazonaws.com   80:32256/TCP,443:32480/TCP                    37m
nginx-ingress-1581005515-default-backend   ClusterIP      10.100.199.97   <none>                                                                    80/TCP                                        37m
release1-api-service                       LoadBalancer   10.100.87.210   af6944a7b48fb11eaa3100ae77b6d-585994672.eu-west-3.elb.amazonaws.com    80:31436/TCP,8545:32715/TCP,30300:30643/TCP   33m

kubectl -n namespace2 get sv c

NAME                                       TYPE           CLUSTER-IP       EXTERNAL-IP                                                               PORT(S)                                       AGE
nginx-ingress-1580982483-controller        LoadBalancer   10.100.177.215   ac7d0091648c511ea9e440eacdf86-762232273.eu-west-3.elb.amazonaws.com    80:32617/TCP,443:30459/TCP                    7h6m
nginx-ingress-1580982483-default-backend   ClusterIP      10.100.53.245    <none>                                                                    80/TCP                                        7h6m
release2-api-service                       LoadBalancer   10.100.108.190   a4605dedc490111ea9e440eacdf86-2005327771.eu-west-3.elb.amazonaws.com   80:32680/TCP,8545:32126/TCP,30300:30135/TCP   36s

Когда я нажимаю nginx -контроллер пространства имен2, он должен попасть в приложение app2, развернутое в release2, но вместо этого он попадает в app1. Когда я нажимаю nginx -контроллер пространства имен1, как и ожидалось, он попадает в приложение 1.

Просто для информации важен порядок, это всегда первое развернутое приложение, которое всегда нажимает

Почему второй балансировщик нагрузки не перенаправляет на мое второе приложение?

1 Ответ

2 голосов
/ 07 февраля 2020

Проблема в том, что я использовал один и тот же класс "nginx" для обоих входов. Оба контроллера nginx обслуживали один и тот же класс "nginx".

Вот вики о том, как использовать входной контроллер mutilple nginx: https://kubernetes.github.io/ingress-nginx/user-guide/multiple-ingress/

В итоге я определяю свой класс доступа следующим образом: kubernetes.io/ingress.class: nginx-{{ .Release.Namespace }}

И развертываю свой контроллер nginx следующим образом: install -n $namespace nginx-$namespace stable/nginx-ingress --set "controller.ingressClass=nginx-${namespace}"

Если вы не используете helm для развертывания вашего nginx -контроллера необходимо изменить nginx класс доступа

...