Я запускаю установку Kubernetes с нуля и пытаюсь создать свое тестовое приложение nginx (просто созданное с помощью kubectl create deployment nginx --image=nginx
) виден удаленно со всех узлов. Идея в том, что я могу затем использовать установку HAProxy на «голом железе» для правильной маршрутизации трафика.
Из всего, что я читал, эта конфигурация должна работать и разрешать доступ через порт между узлами. Кроме того, выполнение netstat, похоже, показывает, что nodeport прослушивает все узлы -
user@kube2:~$ netstat -an | grep :30196
tcp6 0 0 :::30196 :::* LISTEN
Мой файл service.yaml -
apiVersion: v1
kind: Service
metadata:
name: test-svc
namespace: default
spec:
type: NodePort
externalTrafficPolicy: Cluster
ports:
- port: 80
targetPort: 80
protocol: TCP
name: http
- port: 443
targetPort: 443
protocol: TCP
name: https
selector:
app: nginx
Конфигурация сети моего узла -
kube1 - 192.168.1.130 (master)
kube2 - 192.168.1.131
kube3 - 192.168.1.132
Моя служба работает -
user@kube1:~$ kubectl get svc -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 18m <none>
test-svc NodePort 10.103.126.143 <none> 80:30196/TCP,443:32580/TCP 14m app=nginx
Однако, несмотря на все вышесказанное, моя служба доступна только на узле, на котором она запущена (kube3 / 192.168.1.132). Есть идеи, почему это так, или я просто понимаю Kubernetes?
Я бы посмотрел на балансировщики нагрузки и входящие данные, но что не имеет смысла, так это то, что если я перенаправляю весь трафик своему мастеру для распределения (kube1), что, если kube1 выйдет из строя? Конечно, мне нужен балансировщик нагрузки, чтобы настроить мой балансировщик нагрузки ?!
Надеюсь, кто-то может помочь!
Спасибо, Крис.
Если вы хотите предоставить службу внешнему кластеру, используйте тип службы LoadBalancer или ingree. Однако использование LoadBalancer имеет свои ограничения. Вы не можете настроить LoadBalancer для прерывания трафика HTTPS, виртуальных хостов или маршрутизации на основе пути. В Kubernetes 1.2 для этой цели введен отдельный ресурс под названием Ingress. Вот пример LoadBalancer.
apiVersion: v1
kind: Service
metadata:
labels:
app: nginx-app
name: nginx-svc
namespace: default
spec:
type: LoadBalancer # use LoadBalancer as type here
ports:
- port: 80
selector:
app: nginx-app
$ kubectl get services -l app=nginx-app -o wide
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
nginx-svc LoadBalancer <ip> a54a62300696611e88ba00af02406931-1787163476.myserver.com 80:31196/TCP 9m app=nginx-app
Опубликуйте этот тестовый URL
$curl a54a62300696611e88ba00af02406931-1787163476.myserver.com
Чтобы получить доступ к локальным POD кластера Kubernetes а NodePort
нужно создать. В NodePort
опубликует вашу услугу в каждый узел используя публичный IP-адрес и порт. Затем вы можете получить доступ к службе, используя любой из IP-адресов кластера и назначенный порт.
Определение NodePort в Kubernetes:
apiVersion: v1
kind: Service
metadata:
name: nginx-service-np
labels:
name: nginx-service-np
spec:
type: NodePort
ports:
- port: 8082 # Cluster IP, i.e. http://10.103.75.9:8082
targetPort: 8080 # Application port
nodePort: 30000 # (EXTERNAL-IP VirtualBox IPs) i.e. http://192.168.50.11:30000/ http://192.168.50.12:30000/ http://192.168.50.13:30000/
protocol: TCP
name: http
selector:
app: nginx
См. Полный пример с исходным кодом на Построение кластера Kubernetes с Vagrant и Ansible (без Minikube).
Контроллер входящего трафика nginx также можно заменить на Istio если вы хотите воспользоваться преимуществами архитектуры служебной сети для:
Видеть Установка Istio в Kubernetes под VirtualBox (без Minikube).
Еще один вариант - открыть доступ к контроллеру Nginx Ingress через NodePort (хотя не рекомендуется для производственных кластеров). Тип NodePort по-прежнему дает вам возможности LoadBalancing, и на какой конкретный под (поддерживающий конечные точки службы) должен быть отправлен трафик, вы управляете с помощью 'service.spec.sessionAffinity' и Контейнерные зонды.
Если у вас будет более 1 реплики модуля nginx в спецификации развертывания (пример Вот), вы можете управлять назначением стручка узлу через функция сродства и анти-сродства стручка.