Назначение внешнего IP-адреса узлам Kubernetes (AWS EKS)

У меня есть служба UDP, которую мне нужно открыть в Интернете из кластера AWS EKS. Балансировщики нагрузки AWS (классические или NLB) не поддерживают UDP, поэтому я хотел бы использовать NodePort с многозначным Route53, чтобы получить циклическую балансировку нагрузки UDP на мои узлы.

Моим узлам в AWS EKS не назначен ExternalIP. Хотя экземпляры EC2, на которых работают узлы, имеют общедоступные IP-адреса, они не были назначены узлам при создании кластера.

Как я могу назначить общедоступные IP-адреса EC2 моим узлам k8s?

NAME                                          STATUS    ROLES     AGE       VERSION   EXTERNAL-IP   OS-IMAGE                                         KERNEL-VERSION               CONTAINER-RUNTIME
x.us-west-2.compute.internal   Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2
x.us-west-2.compute.internal      Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2
x.us-west-2.compute.internal   Ready     <none>    7d        v1.10.3   <none>        Amazon Linux 2 (2017.12) LTS Release Candidate   4.14.42-61.37.amzn2.x86_64   docker://17.6.2

В настоящее время я тестирую службу HTTP для удобства, и вот как выглядит моя тестовая служба:

apiVersion: v1
kind: Service
metadata:
  name: backend-api
  labels:
    app: backend-api
spec:
  selector:
    app: backend-api
  type: NodePort
  ports:
  - name: back-http
    port: 81
    targetPort: 8000
    protocol: TCP
  externalIPs:
  - x.x.x.x
  - x.x.x.x
  - x.x.x.x

В этом примере мои curl запросы никогда не попадают в службу HTTP, работающую на узлах. Я догадываюсь, что это связано с тем, что на узлах нет externalIPs.


person Francois Lebel    schedule 07.08.2018    source источник


Ответы (1)


Вы можете использовать внешний IP-контроллер для назначения IP-адресов узлам. Он предназначен для работы с кластером «голого металла», но я думаю, что он должен работать и в вашем случае.

Внешний IP-контроллер - это приложение k8s, которое развертывается поверх кластера k8s и настраивает внешние IP-адреса на рабочих узлах k8s для обеспечения IP-соединения.

Описание:

На одном из узлов запущено приложение внешнего IP-контроллера Kubernetes (реплики = 1).

  • При запуске он извлекает информацию о сервисах из kube-api и отображает все внешние IP-адреса на указанном интерфейсе (eth0 в нашем примере выше).
  • It watches kube-api for updates in services with External IPs and:
    • When new External IPs appear it brings them up.
    • Когда служба удаляется, она удаляет соответствующие внешние IP-адреса из интерфейса.
  • Kubernetes обеспечивает отказоустойчивость для внешнего IP-контроллера. Поскольку для реплик установлено значение 1, в кластере будет работать только один экземпляр, чтобы избежать дублирования IP-адресов. И когда возникает проблема с узлом k8s, внешний IP-контроллер будет создан на новом рабочем узле k8s и выведет внешние IP-адреса на этот узел.

Ознакомьтесь с демонстрацией, чтобы узнать, как это работает.

person VASャ    schedule 08.08.2018
comment
Спасибо. В итоге я выбрал AWS ECS, потому что мой сервис должен был начать работу как можно скорее. Я вернусь к этому сообщению через несколько недель и приму ваш ответ, если он будет работать на AWS EKS. - person Francois Lebel; 10.08.2018