在 Kubernetes 中扩展多个 Pod 实例时连接超时

在 Kubernetes 中扩展多个 Pod 实例时连接超时

在本地 ESXI 服务器上使用 flannel 运行 Kubernetes,该服务器有 3 个虚拟机、一个主服务器和两个节点。在所有节点上,我都有 Kubernetes 1.15.5、Ubuntu 18.04 和 Docker 18.09.7。绿地安装。

Nginx 在任一节点上使用单个 pod 时运行良好,但当扩展到两个 pod 时,curl 长时间暂停后会开始出现随机连接超时。

kubectl 应用-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 获取服务、pod、部署、守护进程集 -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返回连接超时。

扩展两个 Pod

kubectl scale --replicas=2 部署 nginx

  deployment.extensions/nginx scaled

kubectl 获取服务、pod、部署、守护进程集 -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 kubernetes3 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      -

当我扩展到两个或更多实例时,为什么会出现这些超时?

答案1

Flannel cidr 和初始化的集群 cidr 不同。

我使用以下命令初始化集群

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

但是我运行了带有网络的股票法兰绒文件

"Network": "10.244.0.0/16"

我的解决方法是下载 flannel 文件,然后删除安装。

kubectl delete -f kube-flannel.yml  

然后我修改了 flannel.yml 来匹配我初始化网络的方式。

"Network": "10.10.0.0/16"

最后,重新安装法兰绒。

kubectl apply -k kube-flannel.yml

现在我可以无错误地运行 curl 命令了。还有其他方法可以做到这一点,例如使用 flannel 提供的子网,但这是我发现的最简单的方法。

相关内容