Назад | Перейти на главную страницу

Таймауты подключения при масштабировании более чем одного экземпляра модуля в Kubernetes

Запуск Kubernetes с фланелью на локальном сервере ESXI с 3 виртуальными машинами, мастером и двумя узлами. На всех узлах у меня Kubernetes 1.15.5, Ubuntu 18.04 и Docker 18.09.7. Установка в зеленом поле.

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

kubectl apply -f nginx.yaml

  deployment.apps/nginx configured
  service/nginx unchanged

кот nginx.yaml

  apiVersion: apps/v1beta2
  kind: Deployment
  metadata:
    name: nginx
  spec:
    selector:
      matchLabels:
        app: nginx
    replicas: 1
    template:
      metadata:
        labels:
          app: nginx
      spec:
        containers:
        - name: nginx
          image: nginx:1
          ports:
          - name: http
            containerPort: 80

  ---
  apiVersion: v1
  kind: Service
  metadata:
    name: nginx
  spec:
    ports:
    - name: http
      nodePort: 32000
      port: 80
      protocol: TCP
      targetPort: 80
    selector:
      app: nginx
    type: NodePort

kubectl get services, pods, deployments, daemonsets -o wide

  NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
  service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        6d17h   <none>
  service/nginx        NodePort    10.102.48.211   <none>        80:32000/TCP   45m     app=nginx

  NAME                         READY   STATUS    RESTARTS   AGE   IP          NODE          NOMINATED NODE   READINESS GATES
  pod/nginx-6d4fbdf4df-q7jdt   1/1     Running   0          45m   10.10.2.6   kubernetes3   <none>           <none>

  NAME                          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES    SELECTOR
  deployment.extensions/nginx   1/1     1            1           45m   nginx        nginx:1   app=nginx

завиток http: // kubernetes3: 32000 возвращает страницу nginx

завиток http: // kubernetes2: 32000 возвращает тайм-аут соединения.

Увеличение масштаба до двух двух модулей

kubectl scale --replicas = 2 развертывание nginx

  deployment.extensions/nginx scaled

kubectl get services, pods, deployments, daemonsets -o wide

  NAME                 TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE     SELECTOR
  service/kubernetes   ClusterIP   10.96.0.1       <none>        443/TCP        6d17h   <none>
  service/nginx        NodePort    10.102.48.211   <none>        80:32000/TCP   48m     app=nginx

  NAME                         READY   STATUS    RESTARTS   AGE   IP          NODE          NOMINATED NODE   READINESS GATES
  pod/nginx-6d4fbdf4df-q7jdt   1/1     Running   0          48m   10.10.2.6   kubernetes3   <none>           <none>
  pod/nginx-6d4fbdf4df-zg2n5   1/1     Running   0          42s   10.10.1.5   kubernetes2   <none>           <none>

  NAME                          READY   UP-TO-DATE   AVAILABLE   AGE   CONTAINERS   IMAGES    SELECTOR
  deployment.extensions/nginx   2/2     2            2           48m   nginx        nginx:1   app=nginx

завиток http: // kubernetes3: 32000 работает половину времени и скручивается http: // kubernetes2: 32000 работает почти половину времени. Другая половина, у меня тайм-аут соединения. Если я запускаю команды на узле 3 или 2, я получаю то же самое. Telnet также получает случайные тайм-ауты, хотя порты прослушивают все узлы, и у меня есть полное соединение между всеми узлами.

   url: (7) Failed to connect to kubernetes2 port 32000: Connection timed out

telnet -d кубернетес3 32000

Trying <IP>...
setsockopt (SO_DEBUG): Permission denied

kubernetes3: ~ $ netstat -tulpn | grep 3200

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp6       0      0 :::32000                :::*                    LISTEN      -

Почему у меня возникают эти таймауты при масштабировании до двух или более экземпляров?

Flannel cidr и инициализированный кластерный cidr были разными.

Я инициировал кластер с помощью

kubeadm init --pod-network-cidr=10.10.0.0/16

Но я запустил стандартный файл фланели, который поставляется с сетью

"Network": "10.244.0.0/16"

Мое решение состояло в том, чтобы загрузить файл фланели, а затем удалить установку.

kubectl delete -f kube-flannel.yml  

Затем я изменил flannel.yml в соответствии с тем, как я инициализировал сеть.

"Network": "10.10.0.0/16"

Наконец, переустановите фланель.

kubectl apply -k kube-flannel.yml

Теперь я могу запускать команды curl без ошибок. Есть и другие способы сделать это, например, использовать подсеть, предоставляемую flannel, но это был самый простой способ, который я нашел.