Как получить доступ к модулям Kubernetes через один IP-адрес?

#kubernetes #load-balancing

Вопрос:

У меня есть набор модулей, работающих на основе следующего парка:

 apiVersion: "agones.dev/v1"
kind: Fleet
metadata:
  name: bungee
spec:
  replicas: 2
  template:
    metadata:
      labels:
        run: bungee
    spec:
      ports:
        - name: default
          containerPort: 25565
          protocol: TCP
      template:
        spec:
          containers:
            - name: bungee
              image: a/b:test
 

Я могу получить доступ к этим блокам за пределами кластера, <node-IP>:<port> где порт является случайным для каждого модуля, заданного Агонами.

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

 apiVersion: v1
kind: Service
metadata:
  name: bungee-svc
spec:
  type: LoadBalancer
  loadBalancerIP: XXX.XX.XX.XXX
  ports:
    - port: 25565
      protocol: TCP
  selector:
    run: bungee
  externalTrafficPolicy: Local
 

Является ли такая услуга неправильным подходом здесь, и если да, то что я должен использовать вместо этого? Если это правильно, то почему это не работает?

Изменить: В поле Внешний IP указано ожидание при проверке статуса службы. Я запускаю Kubernetes на голом металле.

Правка 2: При попытке использовать порт узла, как было предложено, я вижу, что службе не был предоставлен внешний IP-адрес. Попытка подключиться <node-IP>:<nodePort> не работает. Может ли это быть проблемой, связанной с селектором?

Комментарии:

1. Проверьте статус вашей услуги?

2. Для работы службы балансировки нагрузки требуется поддержка базовой инфраструктуры. Вам нужно описать свою инфраструктуру, если вы хотите получить здесь некоторую помощь.

3. Сообщение обновлено с дополнительной информацией. Похоже ли, что служба настроена правильно @Jonas

4. Что это за Балансировщик нагрузки? Как сказал @whites11, вам нужно что-то, что обрабатывает эту часть инфраструктуры.

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

Ответ №1:

Службы балансировки нагрузки могли бы работать в кластерах, которые интегрируются с API облачного провайдера, на котором размещены ваши узлы Kubernetes (компонент cloud-controller-manager). Поскольку это не ваш случай, вы ищете службу NodePort.

Что-то вроде:

 apiVersion: v1
kind: Service
metadata:
  name: bungee-svc
spec:
  type: NodePort
  ports:
    - port: 25565
      protocol: TCP
  selector:
    run: bungee
 

Создав эту службу, вы можете проверить ее описание — или представление yaml/json:

 # kubectl describe svc xxx
Type:                     NodePort
IP:                       10.233.24.89 <- ip within SDN
Port:                     tcp-8080  8080/TCP <- ports within SDN
TargetPort:               8080/TCP <- port on your container
NodePort:                 tcp-8080  31655/TCP <- port exposed on your nodes
Endpoints:                10.233.108.232:8080 <- pod:port ...
Session Affinity:         None
 

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

Я могу подключиться к своей службе, получив доступ к любому IP-адресу узла Kubernetes, через порт, выделенный для моей службы NodePort.

 curl http://k8s-worker1.example.com:31655/
 

В качестве примечания: служба балансировки нагрузки расширяет службу порта узла. Хотя externalIP никогда не появится, обратите внимание, что вашей службе уже был выделен собственный порт, как и любой службе порта узла, которая предназначена для приема трафика от любого балансировщика нагрузки, настроенного от имени вашего кластера, в облачную инфраструктуру, с которой он интегрирован.

И… Должен сказать, что я не знаком с Агонами. Когда вы говорите: «Я могу получить доступ к этим блокам за пределами кластера, <node-IP>:<port> где порт является случайным для каждого модуля, заданного Агонами». Вы уверены, что порты распределяются по каждому модулю и привязаны к данному узлу? Или, может быть, они уже используют службу NodePort. Взгляните на это еще раз: вы пробовали подключить этот порт к другим узлам вашего кластера?