Невозможно получить доступ к службе NGINX nodePort в кластере K8, работающем на RPI - PullRequest
5 голосов
/ 03 апреля 2020

Я установил небольшой кластер Kubernetes на Raspberry Pi, в настоящее время состоящий из 1 мастера и 1 рабочего. Я создал простое развертывание NGINX и создал для этого сервис NodePort. Мой YAML выглядит следующим образом:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
  labels:
    app: nginx
spec:
  selector:
    app: nginx
  type: NodePort
  ports:
    - nodePort: 30333
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  replicas: 2
  selector:
  matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.16.1
        imagePullPolicy: IfNotPresent

       ports:
        - containerPort: 80
          protocol: TCP
      restartPolicy: Always

PODS запущены и работают, как и служба

$ kubectl get pods
NAME                     READY   STATUS    RESTARTS   AGE
nginx-5d66cc795f-bgqdp   1/1     Running   0          65m
nginx-5d66cc795f-mb8qw   1/1     Running   0          65m

$ kubectl get svc
NAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
kubernetes      ClusterIP   10.96.0.1        <none>        443/TCP        13d
nginx-service   NodePort    10.104.133.199   <none>        80:30333/TCP   66m

Но я не могу получить доступ к NGINX с главного узла.

curl http://192.168.178.101:30333
curl: (7) Failed to connect to 192.168.178.101 port 30333: Connection timed out

Если я пытаюсь с рабочего узла, он работает нормально, и NGINX отвечает. С рабочего узла я могу использовать IP-адрес: 30333 или имя хоста: 30333, хотя localhost: 30333 не работает!

Связь с моего Master to Worker выглядит нормально. Я могу пинговать, S SH оттуда и c. либо по IP-адресу, либо по имени хоста.

Есть идеи, что я сделал неправильно?

Вывод из узлов get -o wide:

 $ kubectl get nodes -o wide
NAME        STATUS   ROLES    AGE   VERSION   INTERNAL-IP       EXTERNAL-IP   OS-IMAGE                         KERNEL-VERSION   CONTAINER-RUNTIME
k8-master   Ready    master   13d   v1.17.4   192.168.178.100   <none>        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8
k8-w1       Ready    worker   13d   v1.17.4   192.168.178.101   <none>        Raspbian GNU/Linux 10 (buster)   4.19.97-v7+      docker://19.3.8

Вывод из службы описаний:

$ kubectl describe service nginx-service
Name:                     nginx-service
Namespace:                default
Labels:                   app=nginx
Annotations:              kubectl.kubernetes.io/last-applied-configuration:
                            {"apiVersion":"v1","kind":"Service","metadata":{"annotations":{},"labels":{"app":"nginx"},"name":"nginx-service","namespace":"default"},"s...
Selector:                 app=nginx
Type:                     NodePort
IP:                       10.104.133.199
Port:                     <unset>  80/TCP
TargetPort:               80/TCP
NodePort:                 <unset>  30333/TCP
Endpoints:                10.44.0.1:80,10.44.0.2:80
Session Affinity:         None
External Traffic Policy:  Cluster
Events:                   <none>

Обновление: я попробовал простую команду Te lnet для Рабочего на NodePort 30333. Но я получаю ошибку тайм-аута соединения.

Итак, я удалил службу NodePort и попробовал простую команду Port forward

kubectl port-forward pod/nginx-545b8fdd47-brg7r 8080:80

Это сработало, и я мог подключиться через Master -> Worker через этот порт.

Но служба NodePort по-прежнему не работает!

1 Ответ

2 голосов
/ 09 апреля 2020

Итак, после многих часов и дней, я думаю, я нашел источник проблемы.

Я нашел этот блог: https://limpygnome.com/2019/09/21/raspberry-pi-kubernetes-cluster/

Что привело меня к этот отчет об ошибке: https://github.com/kubernetes-sigs/kubespray/issues/4674

Таким образом, выполнение следующего позволит соединению:

sudo iptables -P FORWARD ACCEPT

Но я не смог заставить его застрять после перезагрузки (даже используя iptables-persistent), я предполагаю, что Docker / K8s динамически обновляет правила во время запуска и после изменений.

Это привело меня к дальнейшим исследованиям, и я нашел информацию в сетевой документации Weave о проблемах, связанных с сетью K8s. с хостами, которые используют iptables v 1.8 и выше. (Похоже, это также относится к другим провайдерам сетей K8s, хотя некоторые из них могли быть решены). Затем я увидел в своих файлах журнала Weave, что он действительно отклонял запросы.

Таким образом, выполнив следующее на моих узлах, я смог получить эту работу навсегда.

sudo update-alternatives --set iptables /usr/sbin/iptables-legacy

Теперь я могу доступ через мой NodePort между всеми узлами и извне из кластера на все узлы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...