在本地 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 提供的子网,但这是我发现的最简单的方法。