У меня есть простой вариант использования; У меня есть 4 микросервиса, скажем, сервис-a, сервис-b, сервис-c, сервис-d.
В целях тестирования я хочу разделить трафик по весу, например
Учитывая, что доступ к ним будет осуществляться по одному и тому же пути: 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?
Если вам необходимо реализовать разделение трафика между несколькими микрослужбами в 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, например, для каждого региона.
Нет, у него нет функции разделения трафика по весу. Вы правы, ближайшим вариантом является диспетчер трафика, который работает для трафика за пределами AKS, например, для каждого региона. - Лучшие практики сетевого подключения и безопасности в службе Azure Kubernetes (AKS) - Концепции сети для приложений в службе Azure Kubernetes (AKS)
Однако документы, которые вы упомянули, принадлежат контроллеру входа сообщества.
это возможно с использованием 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
бесплатна?
Да, это правильно. Существует два проекта входящих контроллеров, использующих NGINX: один — от NGINX, другой — от сообщества Kubernetes. Контроллер NGINX, называемый NGINX Ingress Controller, поддерживает NGINX OSS и NGINX Plus. Версия NGINX Ingress Controller для NGINX OSS бесплатна. Оба имеют открытый исходный код. Вы можете увидеть их на github здесь . Наконец, да, вы можете использовать VirtualServer CRD с версией OSS. Чтобы получить представление о том, какие дополнительные функции добавляет NGINX Plus, вы можете прочитать это
Понял, спасибо. Я проголосую за это. Я разместил еще один вопрос stackoverflow.com/q/78499287/13126651, связанный с вашей областью знаний. Возможно ли это проверить?
В общем, мы не склонны регистрировать различия между входным контроллером сообщества и входным контроллером NGINX, поскольку сравнения довольно быстро устаревают. Я не согласен с мнением, что мы более ограничены, даже сравнивая версию OSS с сообществом. Скорее мы сосредоточились на другом наборе функций. У нас есть документ о переходе здесь, но с нами также легко связаться на Github, в NGINX Slack и на наших встречах сообщества, проводимых раз в две недели. Если нам не хватает чего-то, что вы хотите увидеть, дайте нам знать!
Если вы хотите ответить на этот вопрос, вы можете. Я приму это.
В документе NGINX Ingress Controller отмечается, что для каждого правила входа может быть определен только один канареечный вход, а это означает, что традиционная взвешенная балансировка нагрузки между несколькими службами (как в случае с четырьмя микросервисами) напрямую не поддерживается как «канарейка». В вашем случае использования, когда трафик необходимо разделить между несколькими службами на основе заданного процента, это ограничение означает, что вы не можете добиться этого, определив несколько канареечных служб в одном правиле входящего трафика. Альтернативный подход — используйте Service Mesh, например Istio. Что-то вроде это