Рубрики
Uncategorized

Использование балансировки нагрузки контейнера для высокой производительности в Kubernetes

Ачтья Шарма На Cyral одно из наших многочисленных поддерживаемых средов развертывания — Kubernetes. Мы используем руль … Помечено в DevOps, архитектуре, кубернаны, облако Google.

Ачтья Шарма

На 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.

Дальнее чтение на сетевых группах конечной точки

Оригинал: «https://dev.to/cyral/using-container-native-load-balancing-for-high-performance-networking-in-kubernetes-50om»