Моя интеграция kubernetes AWS NLB не работает

Я пытаюсь развернуть сервис в Kubernetes, доступный через балансировщик сетевой нагрузки. Я знаю, что на данный момент это альфа-функция, но я провожу несколько тестов. У меня есть определение развертывания, которое работает нормально как есть. Мое определение службы без аннотации nlb выглядит примерно так и работает нормально:

kind: Service
apiVersion: v1
metadata:
  name: service1
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
spec:
  type: LoadBalancer
  selector:
    app: some-app
  ports:
  - port: 80
    protocol: TCP

Однако, когда я переключаюсь на NLB, даже если балансировщик нагрузки создан и настроен «правильно», цель в целевой группе AWS всегда оказывается неработоспособной, и я не могу получить доступ к службе через HTTP. Это определение службы:

kind: Service
apiVersion: v1
metadata:
  name: service1
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-internal: 0.0.0.0/0
    service.beta.kubernetes.io/aws-load-balancer-type: "nlb"
spec:
  type: LoadBalancer
  selector:
    app: some-app
  ports:
  - port: 80
    protocol: TCP
  externalTrafficPolicy: Local

person manemarron    schedule 27.03.2018    source источник


Ответы (3)


Похоже, что в группе безопасности узлов k8s отсутствовало правило, поскольку NLB пересылает IP-адрес клиента.

person manemarron    schedule 28.03.2018
comment
Какое правило? Не могли бы вы уточнить, пожалуйста? - person krish7919; 04.12.2018
comment
В документации k8s кратко объясняется эта проблема: kubernetes.io/docs/concepts/services-networking/service/ - person manemarron; 08.12.2018

Я не думаю, что проблема в NLB.

externalTrafficPolicy: Local

не поддерживается kops на AWS, и есть проблемы с некоторыми другими дистрибутивами K8s, которые работают на AWS, из-за некоторых ограничений AWS.
Попробуйте изменить его на

externalTrafficPolicy: Cluster

Существует проблема с исходным IP-адресом балансировщика нагрузки, а не с истинным внешним клиентом, которую можно обойти, используя аннотацию прокси-протокола в службе + добавив некоторую конфигурацию к входному контроллеру.

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

externalTrafficPolicy: Local


Создает конечную точку NodePort / healthz, чтобы LB отправлял трафик на подмножество узлов с конечными точками службы, а не на все рабочие узлы. Он прерывается при первоначальной инициализации, и цикл согласования также прерывается.

https://github.com/kubernetes/kubernetes/issues/80579
^ описывает проблему более подробно.

https://github.com/kubernetes/kubernetes/issues/61486
^ описывает обходной путь, чтобы заставить его работать с помощью крючка kops

но, честно говоря, вам следует просто придерживаться externalTrafficPolicy: Cluster, поскольку он всегда более стабилен.

person neokyle    schedule 14.08.2019

Ошибка в реализации групп безопасности NLB. Это исправлено в 1.11.7, 1.12.5 и, возможно, в следующем патче 1.13.

https://github.com/kubernetes/kubernetes/pull/68422

person Kelly Campbell    schedule 26.01.2019