2

生产K8S--calico网络问题处理

 2 weeks ago
source link: https://blog.51cto.com/u_15623120/10519000
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一.问题原因

生产环境K8S02节点,加入到现有集群成功,在k8s服务器启动POD后与原来的pod无法通信导致启动后一直处于init状态

kubectl get po
生产K8S--calico网络问题处理_节点间无法通信

二.问题定位

2.1 初步怀疑为calico分配pod IP问题

开始怀疑因为calico设置问题,导致K8S02节点启动的pod IP不为10.2.0.xxx

kubectl get pod -owide
#pod启的IP为10.0.236.xxx

生产K8S--calico网络问题处理_节点间无法通信_02

检查k8sIP资源池

kubectl get ippool
kubectl describe ippool default-ipv4-ippool
生产K8S--calico网络问题处理_calico多网卡_03

根据计算在k8s02节点生成的IP:10.2.0.xxx 没有问题,包含在14位掩码里面

生产K8S--calico网络问题处理_calico多网卡_04

2.1结论:问题不是calico IP资源池的问题

2.2 将K8S02从集群中删除,重新加入集群

根据之前的部署维护人员反馈,生产服务器有做过网络维护,所以怀疑是不是网络变动导致k8s集群出现问题;

a. 删除集群k8s02节点

#master节点操作
#驱逐k8s02节点上的服务
kubectl drain k8s02 --delete-local-data --force --ignore-daemonsets
#删除节点
kubectl delete node k8s02

b. 停止kubelet、删除已经跑的docker 容器、移除/etc/kubernetes、重启docker、 目录 

#k8s02节点操作
systemctl stop kebelet.service
docker ps -a|awk '{if(NR>1)print "docker rm -f "$1}'|sh
mv /etc/kubernetes /etc/kubernetes_20240416
kubeadm reset
systemctl restart docker

c. 添加k8s02到集群中

#k8smaster节点操作
kubeadm token create --print-join-command
#得到join语句
kubeadm join xxx.xxx.xxx.xxx:8443 --token 6pr92r.fs1xanpt8p7dvzlo --discovery-token-ca-cert-hash sha256:fbd2b5bc72515dae78e1588f5378063e26dbab0ed564ffxxx

#k8s02节点操作
kubeadm join xxx.xxx.xxx.xxx:8443 --token 6pr92r.fs1xanpt8p7dvzlo --discovery-token-ca-cert-hash sha256:fbd2b5bc72515dae78e1588f5378063e26dbab0ed564ffxxx

生产K8S--calico网络问题处理_calico多网卡_05

生产K8S--calico网络问题处理_kubernetes_06

d. 再次启动Pod到k8s02上,问题依然存在

2.2结论:与集群是否先后新增节点、网络维护无关

2.3 从各种表象来看,肯定是集群网络问题

a.删除k8s02节点calico

尝试这删除k8s02节点上的calico,打印集群重新拉起calico日志,发现问题所在,calico启动时绑定bond02网卡

#k8smaster操作
kubectl get po -n kube-system -owide
#删除k8s02上面calico-node-4rg7f 
kubectl delete po calico-node-4rg7f  -n kube-system
#查看新启动calico日志
kubectl logs -f --tail=200  calico-node-4rg7f  -n kube-system
生产K8S--calico网络问题处理_kubernetes_07
生产K8S--calico网络问题处理_节点间无法通信_08

b.查看k8smaster节点上calico日志

#k8smaste上面操作
#查看新启动calico日志
kubectl logs -f --tail=200  calico-node-tcpj7  -n kube-system
生产K8S--calico网络问题处理_kubernetes_09

2.3结论:问题已经跟明确,k8smaster calico启动时绑定的网卡是bond0,而k8s02 calico绑定的网卡为bond2 ; 根据与客户网络部门沟通,bond2网卡为客户的服务器管理口,与业务网口bond0不通;

三.问题处理

知道问题所在那么处理问题就比较简单了;因客户服务器有多张网卡,那么只需要在calico的配置上面设置需要绑定的网卡既可解决问题。

3.1 修改calico配置

#get calico-node.yaml
kubectl get ds -n kube-system calico-node -o yaml >> calico-node.yaml
#修改 calico-node.yaml
vim calico-node.yaml
#在env参数下面新增,强制配置网卡,如图
        - name: IP_AUTODETECTION_METHOD
          value: "interface=bond0"
#更新calico-node
kubectl apply -f calico-node.yaml
生产K8S--calico网络问题处理_calico多网卡_10
生产K8S--calico网络问题处理_calico多网卡_11

3.2 重启k8s02节点的calico

再次查看k8s02上面的calico日志

#删除k8s02节点的calico
kubectl delete po calico-node-4rg7f -n kube-system
#查看新启动calico日志
kubectl logs -f --tail=200 calico-node-lg8lk -n kube-system
生产K8S--calico网络问题处理_节点间无法通信_12

3.3 业务迁移、测试

将部分pod迁移到该节点,进行业务测试; 测试结果:正常

生产K8S--calico网络问题处理_calico多网卡_13

四.问题总结

本次问题主要是出在calico启动时,绑定的网卡非业务网卡,导致k8s集群k8s01/k8s02节点,网络与k8smaster业务不通,在解决该类问题的时候,首先要确认服务器的网卡数及作用;其次确定网络插件绑定的每台服务器的网卡是否一致;


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK