背景

今天在部署一个平台容器版的时候redis集群始终无法正常启动,报以下错误:

Liveness probe failed: Could not connect to Redis at localhost:6379

解决过程

排除dns解析问题

因为报localhost无法访问首先修改成127.0.0.1排除是dns解析的问题,改完后仍然报错,只不过localhost改成127.0.0.1了。

Liveness probe failed: Could not connect to Redis at 127.0.0.1:6379

确定网络连接不通

这样应该是网络问题了,登陆其中一个pod测试他跟其他pod连通性

kubectl -n blueking exec bk-redis-master-0 -it -- bash
echo >/dev/tcp/172.17.0.6/6379

返回拒绝连接,进一步证实确实网络有问题了。

ip地址分配错乱

kubectl -n blueking get pod -o wide发现pod的ip地址为172.17.0网段,而flannel.1网卡为10.244.0网段,

kubectl -n kube-system edit cm kube-flannel-cfg
...
  net-conf.json: |
    {
      "Network": "10.244.0.0/16",
      "Backend": {
        "Type": "vxlan"
...

pod获取到了不正确的ip地址,没猜错的话172.17一般是docker网桥分配的地址。经过对比发现2个节点的flannel.1网卡有问题,只有一个节点有flanel.1网卡。

ip addr show flannel.1
ip route

ip route发现只有一个节点的路由里面看到了flannel.1网卡信息 image.png

iptables -F #清除防火墙规则
net.ipv4.ip_forward = 1 #检查是否开启转发
systemctl restart docker #重启docker
systemctl restart kubelet 
kubectl -n kube-system delete pod kube-flannel-ds-8vv6x kube-flannel-ds-kltmb kube-flannel-ds-nnrlg #重启flannel容器

经过不断的删除flannel容器和重启kubelet后三个节点的flannel.1网卡地址最终正常了 。

cni0网卡配置错乱

又发现没有cni0网卡,cni0网卡是flannel.1网卡通信不可或缺的部分。检查配置发现 /var/lib/kubelet/kubeadm-flags.env 这里面缺少--network-plugin=cni参数,完整参数如下:

KUBELET_KUBEADM_ARGS="--network-plugin=cni --container-runtime-endpoint=unix:///var/run/docker.sock --fail-swap-on=false --pod-infra-container-image=k8s.gcr.io/pause:3.5"

于是三个节点都加上这个参数,重启后只有master节点正常看到cni0网卡,其他2节点还是没有。

手工添加cni0网卡

想着手工添加cni0网卡

ip link add cni0 type bridge
ip addr add 10.244.1.1/24 dev cni0
ip link set cni0 mtu 1450
ip link set dev cni0 up

添加后确实三台都看到cni0了ip route也有cni0,但是pod之间的通信仍然不通。

删除节点重新加入集群

没办法,按着网友说的,把node节点给删除,重新加信集群

在master上删除node节点

kubectl delete nodes k8s-node1-10.10.10.234
kubectl delete nodes k8s-node2-10.10.10.235

node节点删除cni0和flannel.1网卡

kubeadm reset 
ip link set cni0 down
ip link set flannel.1 down
ip link del flannel.1
ip link del cni0 

master节点生成token

kubeadm token create --print-join-command

将文件传输至node

scp /etc/kubernetes/admin.conf 10.10.10.234:/etc/kubernetes/

node节点加入集群

kubeadm join 10.10.10.233:6443 --token rvcoby.df5nvmsxp2injnsc --discovery-token-ca-cert-hash sha256:df52bb42fc776849fc113c780080140e48896a68904c43c043ab88158694146d

Node加集群的时候会提示文件已经存在,将原文件备份后删除,关闭kubelet,过一会集群就加上了。其中,因为我docker升级过,加集群会提示docker版本比原来的版本高,我就把版本再次换成原来的版本后顺利加入集群。

kubectl get node
NAME                      STATUS   ROLES                  AGE      VERSION
k8s-master-10.10.10.233   Ready    control-plane,master   2y166d   v1.22.2
k8s-node1-10.10.10.234    Ready    <none>                 63m      v1.22.2
k8s-node2-10.10.10.235    Ready    <none>                 51m      v1.22.2

重启ip错乱的pod

刚加完集群后查看pod ip仍然是错乱的,干脆把错乱的全部删除。 经过不断的删除和强制删除后pod的ip地址终于变成flannel配置里面的10.244网段的地址: image.png

但是有些ip还是跟物理机ip一样有点不太懂,得继续研究下。 参考链接: https://blog.csdn.net/wangjie72270/article/details/122252830 https://blog.51cto.com/u_15773567/5692623