Почему кластер Kubernetes на экземплярах виртуальных машин Google Cloud не может подключиться к узлу с NodePort? - PullRequest
0 голосов
/ 10 октября 2018

Я установил кластер kubernetes, используя это учебное пособие . Когда я настроил его на VM Virtual Box - мой хост может нормально соединяться с NodePort.Когда я попробовал его на экземпляре виртуальной машины Compute Engine, кластер Kubernetes не может соединить хост с NodePort?

Я прикрепил две картинки.Спасибо за вашу поддержку.

Кластер Kubernetes (чистый металл) в Local Virtual Virtual Box Кластер Kubernetes (чистый металл) в облачной среде Google Instances VM Platform

Ответы [ 3 ]

0 голосов
/ 10 октября 2018

Вы также можете получить информацию об IP, используя,

kubectl describe nodes

Затем выполните команду ping, пытаясь подключиться к вашему хосту, используя соответствующий IP.

0 голосов
/ 24 октября 2018

Мне потребовалось некоторое время, чтобы проверить, но у меня наконец есть результат.Таким образом, выясняется, что причиной вашей проблемы является брандмауэр Calico и GCP.Чтобы быть более конкретным, вы должны добавить правила брандмауэра, прежде чем вы сможете добиться успеха с подключением.После этого документа об установке Calico for GCE:

GCE по умолчанию блокирует трафик между хостами;выполните следующую команду, чтобы позволить трафику Calico проходить между контейнерами на разных хостах (где параметр source-range предполагает, что вы создали свой проект с параметрами сети GCE по умолчанию - измените диапазон адресов, если ваш отличается):

Таким образом, вам нужно разрешить трафик проходить между контейнерами:

gcloud compute firewall-rules create calico-ipip --allow 4 --network "default" --source-ranges "10.128.0.0/9"

Обратите внимание, что этот IP-адрес следует изменить.Вы можете использовать в тестовых целях 10.0.0.0/8, но это способ широкого диапазона, поэтому , пожалуйста, сузьте его до своих потребностей.

Затем приступите к настройке экземпляров для мастера и узлов.На самом деле вы можете пропустить большинство шагов из учебника, который вы опубликовали, так как подключение определяется поставщиком облачных услуг.Вот действительно простой скрипт, который я использую для Kubeadm на виртуальных машинах.Вы также можете выполнить это шаг за шагом.

#!/bin/bash
swapoff -a
echo net/bridge/bridge-nf-call-ip6tables = 1 >> /etc/ufw/sysctl.conf
echo net/bridge/bridge-nf-call-iptables = 1 >> /etc/ufw/sysctl.conf
echo net/bridge/bridge-nf-call-arptables = 1 >> /etc/ufw/sysctl.conf
apt-get install -y ebtables ethtool
apt-get update
apt-get install -y docker.io
apt-get install -y apt-transport-https
apt-get install -y curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb http://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
kubeadm init --pod-network-cidr=192.168.0.0/16
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
kubectl apply -f https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/rbac-kdd.yaml
kubectl apply -f https://docs.projectcalico.org/v3.2/getting-started/kubernetes/installation/hosted/kubernetes-datastore/calico-networking/1.7/calico.yaml
kubectl taint nodes --all node-role.kubernetes.io/master-

В моем случае я использовал простое приложение Redis из Kubernetes Документация

root@calico-master:/home/xxx# kubectl get svc
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)    AGE
kubernetes     ClusterIP   10.96.0.1       <none>        443/TCP    29m
redis-master   ClusterIP   10.107.41.117   <none>        6379/TCP   26m

root@calico-master:/home/xxx# kubectl get pods -o wide
NAME                            READY   STATUS    RESTARTS   AGE   IP            NODE     NOMINATED NODE
redis-master-57fc67768d-5lx92   1/1     Running   0          27m   192.168.1.4   calico   <none>

root@calico-master:/home/xxx# ping 192.168.1.4
PING 192.168.1.4 (192.168.1.4) 56(84) bytes of data.
64 bytes from 192.168.1.4: icmp_seq=1 ttl=63 time=1.48 ms

До правил брандмауэра и обычной установки Calico я не мог пинговать,ни wget из службы, после этого нет проблем с проверкой IP-адреса или имени хоста, а также работает wget:

> root@calico-master:/home/xxx# wget http://10.107.41.117:6379
> --2018-10-24 13:24:43--  http://10.107.41.117:6379/ Connecting to 10.107.41.117:6379... connected. HTTP request sent, awaiting response... 200 No headers, assuming HTTP/0.9 Length: unspecified
> Saving to: ‘index.html.2’

Шаги, описанные выше, также были протестированы на type: NodePort, и это также работает.

Другой способ - использовать Flannel , который я также протестировал, и он работал из коробки для нужд тестирования вашей проблемы.Не забудьте прочитать больше о CNI, чтобы вы могли выбрать тот, который соответствует вашим потребностям.Надеюсь, это решит вашу проблему.

0 голосов
/ 10 октября 2018

Это потому, что в миникубе есть только один узел для всего, а виртуальная машина является этим узлом.Поэтому, если вы находитесь в виртуальной машине, вы можете подключиться к NodePort локально или по localhost.

. В случае GCP вы обычно не запускаете работу мастера (ов) и узлов нате же виртуальные машины.Поэтому вам нужно получить ответ от одного из узлов (ВМ), где ваш модуль прослушивает.

Чтобы получить список узлов в вашем кластере, вы можете просто запустить:

kubectl get nodes -o=wide

Вы должны увидеть, например, Internal IP для ваших узлов.Тогда вы можете попробовать

curl http://<Internal IP>:<NodePort>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...