Ачтья Шарма
На Cyral одно из наших многочисленных поддерживаемых средов развертывания — Kubernetes. Мы используем руль, чтобы развернуть наши боковые машины на Куберане. Для обеспечения высокой доступности у нас обычно есть несколько репликов нашего коляска, работающего в качестве репликета, а трафик к репликам Sidecar распределяется с использованием нагрузки-балансировщика. В качестве преднамеренного выбора дизайна мы не указываем какой-либо конкретный балансировщик нагрузки, оставив его в качестве выбора для пользователя.
Классическая балансировка нагрузки
В распределенной системе балансировщики нагрузки могут быть размещены, где требуется распределение трафика. N-многоуровневый стек может в конечном итоге с балансировщиками нагрузки
Использование балансировщиков нагрузки, как показано выше, оказалось доказано преимущества; Приведенная выше архитектура является популярным выбором для современных распределенных архитектур. Традиционно балансировка нагрузки будет принимать машины в качестве целей для балансировки нагрузки. Трафик, происходящий извне, будет распределен среди динамического пула машин. Тем не менее, инструменты оркестовых контейнеров, такие как Kubernetes, не предоставляют одно одному сопоставлению между машинами и стручками. Может быть больше одного POD на машине или POD, который доступен для обслуживания трафика, может находиться на другой машине. Стандартные балансировщики нагрузки по-прежнему направляют трафик на машинные экземпляры, где iptables используются для маршрута трафика на отдельные стручки, работающие на этих машинах. Это представляет хотя бы один дополнительный сетевой хоп, тем самым представляющую задержку в путешествии пакета от балансировщика нагрузки на POD.
Маршрутизация трафика непосредственно на стручки
Google представил балансировку нагрузки Cloud Found на его «следующем 18 событии и сделал его вообще доступен ранее в этом году. Введенная ключевая концепция — это новая модель данных, называемая сетью конечной группой (NEG), которая может использовать различные цели для маршрутизации трафика вместо трафика маршрутизации только на машины. Одной из возможных целей является POD, обрабатывая трафик для обслуживания. Таким образом, вместо маршруты в машину, а затем полагаться на iPtables на пути к POD, как показано выше; с отрицанием трафик идет прямо к струну. Это приводит к снижению задержки и увеличение пропускной способности по сравнению с трафиком, направленным с балансировщиками на ванильных нагрузках.
Чтобы уменьшить хмель к минимуму, мы использовали внутренний балансировщик внутреннего нагрузки Google Cloud Platform (GCP) и настроили его с негом для маршрута трафика базы данных непосредственно на наших стручков, обслуживающих трафик. В наших тестах вышеуказанная комбинация привела к значительному усилению в производительности нашего коляска для зашифрованного, так и для незашифрованного трафика.
Реальный мир Пример отрицания
Как упомянуто выше, мы используем руль для развертывания на Куберане. Мы используем аннотации, переданные через файлы значений для HELM, чтобы настроить наши диаграммы для облачных развертываний. Однако для этого поста мы будем использовать файлы конфигурации Cubernetes, поскольку они обеспечивают более четкое представление концепций Kubernetes. В следующих конфигурации Kubernetes является примером запуска развертывания Nginx с 5 репликами.
# Service apiVersion: v1 kind: Service metadata: name: nginx-internal-example annotations: cloud.google.com/load-balancer-type: "Internal" cloud.google.com/neg: '{ "exposed_ports":{ "80":{} } }' spec: type: LoadBalancer ports: - port: 80 targetPort: 80 protocol: TCP name: http-port selector: run: neg-routing-enabled --- # Deployment apiVersion: apps/v1 kind: Deployment metadata: name: nginx-deployment spec: selector: matchLabels: run: neg-routing-enabled replicas: 5 # tells deployment to run 5 pods matching the template template: metadata: labels: run: neg-routing-enabled spec: containers: - name: nginx image: nginx:1.14.2 ports: - containerPort: 80
Как показано выше, порт 80 отображается в виде конечных точек NEG и созданы соответствующие конечные точки NEG.
В примере выше аннотации:
cloud.google.com/load-balancer-type: "Internal"
Настраивает балансировщик нагрузки на внутренний балансировщик нагрузки на GCP. Картирование портов к сетевым группам конечной точки выполняется со следующей аннотацией:
cloud.google.com/neg: '{ "exposed_ports":{ "80":{} } }'
Примечания на одном примере на GCP:
Запуск развертывания на NEG в качестве внутреннего балансировщика нагрузки на GCP требует явных правил брандмауэра для проверки здоровья и достижений. Документация, описывающая этот процесс, является здесь
Вот YAML для беговой службы как внутренний балансировщик нагрузки. Чтобы получить это с помощью kubectl Run:
kubectl get service nginx-internal-example -o yaml
Выход:
apiVersion: v1 kind: Service metadata: annotations: cloud.google.com/load-balancer-type: Internal cloud.google.com/neg: '{ "exposed_ports":{ "80":{} } }' cloud.google.com/neg-status: '{"network_endpoint_groups":{"80":"k8s1-53567703-default-nginx-internal-example-80-8869d138"},"zones":["us-central1-c"]}' kubectl.kubernetes.io/last-applied-configuration: | {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{"cloud.google.com/load-balancer-type":"Internal","cloud.google.com/neg":"{ \"exposed_ports\":{ \"80\":{} } }"},"name":"nginx-internal-example","namespace":"default"},"spec":{"ports":[{"name":"http-port","port":80,"protocol":"TCP","targetPort":80}],"selector":{"run":"neg-routing-enabled"},"type":"LoadBalancer"}} creationTimestamp: "2020-08-05T22:52:31Z" finalizers: - service.kubernetes.io/load-balancer-cleanup name: nginx-internal-example namespace: default resourceVersion: "388391" selfLink: /api/v1/namespaces/default/services/nginx-internal-example uid: d6e52c50-bf46-4dc3-99a0-7746065b8e6f spec: clusterIP: 10.0.11.168 externalTrafficPolicy: Cluster ports: - name: http-port nodePort: 32431 port: 80 protocol: TCP targetPort: 80 selector: run: neg-routing-enabled sessionAffinity: None type: LoadBalancer status: loadBalancer: ingress: - ip: 10.128.0.6
Проблемы и ограничения
NEG — это относительно новая концепция, следовательно, инструмент вокруг него все еще развивается. Нам пришлось работать вокруг некоторых причудов, чтобы правильно работать на нег. Например, если у вас есть несколько портов на вашем контейнере, и вы хотите, чтобы пользователь мог настроить их при установке времени, предоставляя список портов, то получение аннотации для негправому праву может быть сложно из-за ожидаемого формата NEG Аннотация. Мы используем HELM, встроенные в первом и методе отдыха для разделения списка портов, передаваемых, чтобы соответствовать ожидаемому формату. Ниже приведен пример от наших хелм-графиков:
annotations: cloud.google.com/load-balancer-type: "Internal" cloud.google.com/neg: '{ "exposed_ports":{ {{- $tail := rest $.Values.serviceSidecarData.dataPorts -}} {{- range $tail }} "{{ . }}":{}, {{- end }} "{{ first $.Values.serviceSidecarData.dataPorts }}":{} } }'
Еще одна проблема, с которой мы столкнулись, была лимит внутреннего балансировщика Google нагрузки на пять портов; Это ограничивает нашу способность обрабатывать трафик от нескольких баз данных с одним развертыванием SideCar, если используется внутренний балансировщик нагрузки. Zonal Negs недоступны в качестве бэкэнда для внутренних балансиров нагрузки TCP или внешних балансировщиков сети TCP/UDP на GCP.
Дальнее чтение на сетевых группах конечной точки
- Средний пост Google на NEG
- NEG поддерживает несколько бэкэндуков, включая интернет, зональные или безвесочные группы. Подробная документация доступна здесь
- Сравнение производительности отрицания при использовании с HTTP-трастом по облачным тузе
Оригинал: «https://dev.to/cyral/using-container-native-load-balancing-for-high-performance-networking-in-kubernetes-50om»