Разделение трафика по весу: контроллер Nginx Ingress AKS

У меня есть простой вариант использования; У меня есть 4 микросервиса, скажем, сервис-a, сервис-b, сервис-c, сервис-d.

В целях тестирования я хочу разделить трафик по весу, например

  • 40% на сервис-а
  • 20% на услугу-б
  • 10% на обслуживание-c
  • 30% на сервис-д

Учитывая, что доступ к ним будет осуществляться по одному и тому же пути: example.com/

Я планирую использовать NGINX Ingress Controller, но увидел ограничение в документации: https://kubernetes.github.io/ingress-nginx/user-guide/nginx-configuration/annotations/#canary

В настоящее время для каждого правила Ingress можно применить максимум один канареечный вход.

Существует проблема на GitHub, связанная с тем же: https://github.com/kubernetes/ingress-nginx/issues/5848

Я не могу понять, что это на самом деле означает, и не позволит ли это ограничение мне реализовать с помощью 4 сервисов. Означает ли это, что мне нужно создать 4 канареечных входа с одним правилом входа для всех 4 служб? Все примеры разделения трафика с использованием входящего контроллера относятся к двум службам. стоит ли мне рассмотреть Istio, поскольку у него нет этого ограничения

Может кто-нибудь объяснить мне это ограничение на простом примере кода yaml?

В документе NGINX Ingress Controller отмечается, что для каждого правила входа может быть определен только один канареечный вход, а это означает, что традиционная взвешенная балансировка нагрузки между несколькими службами (как в случае с четырьмя микросервисами) напрямую не поддерживается как «канарейка». В вашем случае использования, когда трафик необходимо разделить между несколькими службами на основе заданного процента, это ограничение означает, что вы не можете добиться этого, определив несколько канареечных служб в одном правиле входящего трафика. Альтернативный подход — используйте Service Mesh, например Istio. Что-то вроде это

Arko 16.05.2024 13:09
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Развертывание модели машинного обучения с помощью Flask - Angular в Kubernetes
Kubernetes - это портативная, расширяемая платформа с открытым исходным кодом для управления контейнерными рабочими нагрузками и сервисами, которая...
1
1
282
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Если вам необходимо реализовать разделение трафика между несколькими микрослужбами в AKS с помощью балансировщика нагрузки, такого как NGINX Ingress Controller, и вы сталкиваетесь с ограничениями канареечной конфигурации, лучшим подходом может быть использование Istio, сервисной сетки, которая предоставляет расширенные возможности управления трафиком.

сначала установи и настрой istio

Создайте развертывание и сервис для каждого микросервиса (service-a, service-b, service-c и service-d), используя образ докера (здесь я буду использовать образ nginxdemos/hello)

# deployment-service-a.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: service-a
spec:
  replicas: 2
  selector:
    matchLabels:
      app: service-a
  template:
    metadata:
      labels:
        app: service-a
    spec:
      containers:
      - name: service-a
        image: nginxdemos/hello
        ports:
        - containerPort: 80

---
apiVersion: v1
kind: Service
metadata:
  name: service-a
spec:
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: service-a

повторите для b, c и d так же, как указано выше, и примените kubectl apply -f <filename>.yaml

Следующие шаги включают настройку шлюза Istio и виртуальной службы для распределения трафика в соответствии с указанными вами весами. Это позволит вам направлять входящий трафик на ваши сервисы service-a, service-b и service-c с указанными соотношениями.

Создать шлюз Istio

apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
  name: example-gateway
spec:
  selector:
    istio: ingressgateway
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

Создать Istio VirtualService

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: my-virtualservice
  namespace: default  # Ensure this is the correct namespace for your services
spec:
  hosts:
  - "*"  # This can be specific to your domain if needed
  gateways:
  - my-gateway
  http:
  - route:
    - destination:
        host: service-a.default.svc.cluster.local  # Adjust the FQDN as necessary
      weight: 40
    - destination:
        host: service-b.default.svc.cluster.your-cluster.com
      weight: 20
    - destination:
        host: service-c.default.svc.cluster.your-cluster.com
      weight: 10
    - destination:
        host: service-d.default.svc.cluster.your-cluster.com
      weight: 30


Отрегулируйте параметры namespace, host и port соответствующим образом.

kubectl apply -f istio-gateway.yaml
kubectl apply -f istio-virtualservice.yaml

kubectl get svc istio-ingressgateway -n istio-system

Теперь вы можете проверить конфигурацию VirtualService, соответствует ли она вашему разделению:

kubectl describe virtualservice my-virtualservice -n default

Спасибо или подробное объяснение. Просто небольшой вопрос, так как я новичок в Azure. Нет ли в Azure Native Load Balancer функции разделения трафика по весу? Я не нашел никакой документации, подтверждающей это. Ближайшим был диспетчер трафика, но он работает для трафика за пределами AKS, например, для каждого региона.

Jatin Mehrotra 17.05.2024 06:49

Нет, у него нет функции разделения трафика по весу. Вы правы, ближайшим вариантом является диспетчер трафика, который работает для трафика за пределами AKS, например, для каждого региона. - Лучшие практики сетевого подключения и безопасности в службе Azure Kubernetes (AKS) - Концепции сети для приложений в службе Azure Kubernetes (AKS)

Arko 17.05.2024 09:05

Однако документы, которые вы упомянули, принадлежат контроллеру входа сообщества. это возможно с использованием VirtualServer CRD NGINX Ingress Controller. Документация NGINX Ingress Controller находится здесь.

В папке примеров в репозитории есть пример разделения трафика, который я немного изменил, чтобы он был похож на ваш пример.

apiVersion: k8s.nginx.org/v1
kind: VirtualServer
metadata:
  name: example
spec:
  host: example.com
  upstreams:
  - name: service-a
    service: service-a-svc
    port: 80
  - name: service-b
    service: service-b-svc
    port: 80
  - name: service-c
    service: service-c-svc
    port: 80
  - name: service-d
    service: service-d-svc
    port: 80
  routes:
  - path: /
    splits:
    - weight: 40
      action:
        pass: service-a
    - weight: 20
      action:
        pass: service-b
    - weight: 10
      action:
        pass: service-c
    - weight: 30
      action:
        pass: service-d

В NGINX Ingress Controller ограничение на количество разбиений будет равно 100, поскольку в настоящее время в CRD разрешены только целые числа, а суммы весов должны составлять 100.

Позвольте мне уточнить NGINX Ingress Controller's VirtualServer CRD не является частью контроллера входа сообщества? Я хочу понять, чем Community Edition отличается от NGINX Ingress Controller? Функция NGINX Ingress Controller's VirtualServer CRD бесплатна?

Jatin Mehrotra 18.05.2024 03:57
f5.com/company/blog/nginx/… После прочтения приведенной выше ссылки Это мое мнение. Вы имеете в виду контроллер NGINX INGRESS с открытым исходным кодом, а не NGINX plus, что также означает, что разделение трафика, показанное вами в качестве примера, будет буть свободен. Верно ли мое понимание?
Jatin Mehrotra 18.05.2024 04:54

Да, это правильно. Существует два проекта входящих контроллеров, использующих NGINX: один — от NGINX, другой — от сообщества Kubernetes. Контроллер NGINX, называемый NGINX Ingress Controller, поддерживает NGINX OSS и NGINX Plus. Версия NGINX Ingress Controller для NGINX OSS бесплатна. Оба имеют открытый исходный код. Вы можете увидеть их на github здесь . Наконец, да, вы можете использовать VirtualServer CRD с версией OSS. Чтобы получить представление о том, какие дополнительные функции добавляет NGINX Plus, вы можете прочитать это

Jim Ryan 18.05.2024 11:16

Понял, спасибо. Я проголосую за это. Я разместил еще один вопрос stackoverflow.com/q/78499287/13126651, связанный с вашей областью знаний. Возможно ли это проверить?

Jatin Mehrotra 18.05.2024 11:39

В общем, мы не склонны регистрировать различия между входным контроллером сообщества и входным контроллером NGINX, поскольку сравнения довольно быстро устаревают. Я не согласен с мнением, что мы более ограничены, даже сравнивая версию OSS с сообществом. Скорее мы сосредоточились на другом наборе функций. У нас есть документ о переходе здесь, но с нами также легко связаться на Github, в NGINX Slack и на наших встречах сообщества, проводимых раз в две недели. Если нам не хватает чего-то, что вы хотите увидеть, дайте нам знать!

Jim Ryan 18.05.2024 12:19

Если вы хотите ответить на этот вопрос, вы можете. Я приму это.

Jatin Mehrotra 18.05.2024 14:22

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