Отключить балансировку нагрузки набора реплик Kubernetes

У меня кластер Kubernetes из 3 узлов.

Пример развертывания

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80

У меня нет входящего трафика, но у меня есть внешний балансировщик нагрузки, который выполняет циклический перебор трафика в 80.11.12.10, 80.11.12.11, 80.11.12.12. Итак, я настроил свой сервис вот так.

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
    - protocol: TCP
      port: 80
  externalIPs:
    - 80.11.12.10
    - 80.11.12.11
    - 80.11.12.12

Проблема в том, что из-за существующего балансировщика нагрузки сервиса kubernetes трафик балансируется дважды. Кроме того, в этом нет необходимости, это портит постоянство соединения. Есть ли способ заставить Kubernetes перенаправлять трафик на локальный компьютерный модуль для каждого узла?


person Yuki    schedule 03.10.2020    source источник


Ответы (2)


Если вы установите service.spec.externalTrafficPolicy в значение Local, kube-proxy только проксирует запросы прокси к локальным конечным точкам и не пересылает трафик на другие узлы.

kubectl patch svc servicename -p '{"spec":{"externalTrafficPolicy":"Local"}}'

Если нет локальных конечных точек, пакеты, отправленные на узел, отбрасываются.

Для службы типа clusterIP вам необходимо использовать Топологию службы

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

Это альфа-функция, доступная в kubernetes 1.17, которую необходимо включить с помощью включение флажка функции

person Arghya Sadhu    schedule 03.10.2020
comment
Пытался использовать ключи топологии: - kubernetes.io/hostname. Не получилось, ошибок нет, мыслей нет? - person Yuki; 03.10.2020
comment
{"externalTrafficPolicy":"Local"} работает только на NodePort или LoadBalancer, поэтому у меня не работает. - person Yuki; 03.10.2020

kube-proxy использует ipvs для балансировки нагрузки в последних версиях k8s. ipvsadm можно использовать на уровне узла, чтобы выбрать, какой алгоритм балансировки нагрузки вы хотите ipvs использовать. Согласно https://linux.die.net/man/8/ipvsadm, вы можете выбрать один из 8 алгоритмов балансировки нагрузки: циклический, взвешенный циклический, наименьшее соединение, взвешенное наименьшее соединение, наименьшее соединение на основе местоположения, наименьшее соединение на основе местоположения с репликацией, хеширование места назначения и хеширование источника . Для получения дополнительной информации см. Документацию по опции --scheduler для ipvsadm.

person Fabrice Jammes    schedule 22.10.2020