#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. Взгляните на это еще раз: вы пробовали подключить этот порт к другим узлам вашего кластера?