Отказ в соединении при попытке подключиться к сервисам в Kubernetes - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать кластер Kubernetes для учебных целей.Итак, я создал 3 виртуальные машины с Vagrant, где мастер имеет IP-адрес 172.17.8.101, а две другие - 172.17.8.102 и 172.17.8.103.

. Понятно, что нам нужно Flannel, чтобынаши контейнеры на разных машинах могут соединяться друг с другом без сопоставления портов.И чтобы Flannel заработал, нам нужно Etcd, потому что фланель использует этот Datastore для помещения и получения своих данных.

Я установил Etcd на главном узле и поместил Flannel сетевой адрес на него с помощью команды etcdctl set /coreos.com/network/config '{"Network": "10.33.0.0/16"}'

Чтобы включить ip masquerading, а также с помощью интерфейса частной сети на виртуальной машинеЯ добавил --ip-masq --iface=enp0s8 в FLANNEL_OPTIONS в /etc/sysconfig/flannel файле.

Для того, чтобы Docker использовал Flannel сеть, я добавил --bip=${FLANNEL_SUBNET} --mtu=${FLANNEL_MTU}' в OPTIONS переменную в /etc/sysconfig/docker файле,Обратите внимание, что значения переменных FLANNEL_SUBNET и FLANNEL_MTU установлены в файле Flannel в файле /run/flannel/subnet.env.

После всех этих настроек я установил kubernetes-master и kubernetes-client на мастерузел и kubernetes-node на всех узлах.Для окончательных конфигураций я изменил значение KUBE_SERVICE_ADDRESSES в файле /etc/kubernetes/apiserver на --service-cluster-ip-range=10.33.0.0/16 и значение KUBELET_API_SERVER в файле /etc/kubernetes/kubelet на --api-servers=http://172.17.8.101:8080.

Это ссылка на k8s-Tutorial Project Репозиторий с полными файлами.

После всех этих усилий все сервисы запускаются успешно и работают нормально.Понятно, что когда я использую команду kubectl get nodes, работают 3 узла.Я могу успешно создать модуль nginx с помощью команды kubectl run nginx-pod --image=nginx --port=80 --labels="app=nginx" и создать службу с помощью команды kubectl expose pod nginx-pod --port=8000 --target-port=80 --name="service-pod".

Команда kubectl describe service service-pod выдает следующие результаты:

Name:           service-pod
Namespace:      default
Labels:         app=nginx
Selector:       app=nginx
Type:           ClusterIP
IP:             10.33.39.222
Port:           <unset> 8000/TCP
Endpoints:      10.33.72.2:80
Session Affinity:   None
No events.

Проблема в том, что когда я пытаюсь подключиться к созданному сервису с помощью curl 10.33.79.222:8000, я получаю curl: (7) Failed connect to 10.33.72.2:8000; Connection refused, но если я пытаюсь curl 10.33.72.2:80, я получаю страницу по умолчанию nginx.Кроме того, я не могу пропинговать 10.33.79.222, и все пакеты теряются.

Некоторые предлагали остановить и отключить Firewalld, но он вообще не работал на узлах.Поскольку Docker изменил FORWARD цепную политику на DROP в Iptables после версии 1.13, я изменил ее обратно на ACCEPT, но это тоже не помогло.В конце концов я попытался изменить CIDR и использовать другие IP / подсети, но не повезло.

Кто-нибудь знает, где я иду не так или как выяснить, в чем проблема, которую я не могу подключить к созданномусервис

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Единственное, что я вижу, что у вас есть конфликт, это PodCidr с Cidr, который вы используете для сервисов.

Фланелевая сеть: '{"Network": "10.33.0.0/16"}'.Затем на кубе-аписервер --service-cluster-ip-range=10.33.0.0/16.Это тот же диапазон, и он должен быть другим, поэтому ваш kube-прокси настраивает сервисы для 10.33.0.0/16, а затем у вас есть оверлей, который думает, что ему нужно перенаправить на модули, работающие на 10.33.0.0/16.Я бы начал с выбора полностью неперекрывающихся Cidrs для ваших модулей и служб.

Например, в моем кластере (я использую Calico) у меня podCidr 192.168.0.0/16, и у меня есть служба Cidr.из 10.96.0.0/12

Примечание: вы не сможете пропинговать 10.33.79.222, поскольку в этом случае ICMP не разрешен.

0 голосов
/ 05 декабря 2018

Ваш сервис относится к типу ClusterIP, что означает, что к нему могут обращаться только другие модули Kubernetes.Чтобы добиться того, что вы пытаетесь сделать, рассмотрите возможность перехода на службу типа NodePort.Затем вы можете подключиться к нему с помощью команды curl <Kubernetes-IP-address>:<exposedServicePort>

См. https://kubernetes.io/docs/tasks/access-application-cluster/service-access-application-cluster/ для примера использования NodePort.

...