Kubernetes, Фланель и экспозиционные услуги
У меня хорошо работает настройка kubernetes, но я не могу предоставлять внешние сервисы. Я думаю, что моя сеть не настроена правильно:
Адреса сервисов kubernetes: --service-cluster-ip-range=172.16.0.1/16
Конфигурация фланелевой сети: etcdctl get /test.lan/network/config {"Сеть":"172.17.0.0/16"}
настройка подсети докера: --bip=10.0.0.1/24
IP хост-узла: 192.168.4.57
У меня запущен сервис nginx, и я попытался показать его так:
[root@kubemaster ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-px6uy 1/1 Running 0 4m
[root@kubemaster ~]# kubectl get services
NAME LABELS SELECTOR IP(S) PORT(S) AGE
kubernetes component=apiserver,provider=kubernetes <none> 172.16.0.1 443/TCP 31m
nginx run=nginx run=nginx 172.16.84.166 9000/TCP 3m
и тогда я выставил сервис так:
kubectl expose rc nginx --port=9000 --target-port=9000 --type=NodePort
NAME LABELS SELECTOR IP(S) PORT(S) AGE
nginx run=nginx run=nginx 9000/TCP 292y
Теперь я ожидаю, что смогу получить доступ к контейнеру nginx по IP-адресу хост-узлов (192.168.4.57) - неправильно ли я понял сеть? Если у меня есть, может объяснение будет оценено:(
Примечание. Это на физическом оборудовании без балансировщика нагрузки, предоставляемого облачным провайдером, поэтому я думаю, что NodePort - единственный вариант, который у меня есть?
3 ответа
Поэтому проблема заключалась в том, что при использовании nodePort отсутствует часть головоломки.
Я также ошибался с командами.
Во-первых, вам нужно убедиться, что вы выставили правильные порты, в данном случае 80 для nginx:
kubectl expose rc nginx --port=80 --type=NodePort
Во-вторых, вам нужно использовать kubectl describe svc nginx
и он покажет вам NodePort, назначенный каждому узлу:
[root@kubemaster ~]# kubectl describe svc nginx
Name: nginx
Namespace: default
Labels: run=nginx
Selector: run=nginx
Type: NodePort
IP: 172.16.92.8
Port: <unnamed> 80/TCP
NodePort: <unnamed> 32033/TCP
Endpoints: 10.0.0.126:80,10.0.0.127:80,10.0.0.128:80
Session Affinity: None
No events.
Конечно, вы можете назначить один при развертывании, но я пропустил эту информацию при использовании случайно назначенных портов.
Если вы работаете с кластером на голом железе или не работаете с поставщиком, который предоставляет балансировщик нагрузки, вы также можете определить порт, который будет хост-портом на вашем модуле.
Вы определяете свой контейнер и порты
containers:
- name: ningx
image: nginx
ports:
- containerPort: 80
hostPort: 80
name: http
это свяжет контейнер с сетью хоста и будет использовать определенный порт.
2 ограничения здесь очевидны: 1) Вы можете иметь только один из этих модулей на каждом хосте максимум. 2) IP - это IP-адрес узла, к которому он привязан
По сути, именно так работают распределители нагрузки облачного провайдера.
Используя новый DaemonSet
функции, можно определить, на каком узле будет приземляться модуль и исправить IP. Однако это обязательно ухудшает аспект высокой доступности, но в какой-то момент выбора не так много, поскольку балансировка нагрузки на DNS не предотвратит переадресацию на мертвые узлы.
Да, вам нужно будет использовать NodePort. Когда вы нажимаете на сервис, destPort должен быть равен NodePort. DestIP для сервиса должен считаться локальным узлами. Например, вы можете использовать hostIP одного из узлов.
Балансировщик нагрузки помогает, потому что он будет обрабатывать ситуации, когда ваш узел вышел из строя, но другие узлы могут по-прежнему обрабатывать службу.