Kubernetes之常见问题

1.  K8s集群的flannel显示CrashLoopBackOff

    1.  显示报错   

        

    2.  查看pod的日志        

I0517 03:22:46.175721       1 main.go:514] Determining IP address of default interface
I0517 03:22:46.176447       1 main.go:527] Using interface with name ens160 and address 172.16.1.232
I0517 03:22:46.176495       1 main.go:544] Defaulting external address to interface address (172.16.1.232)
E0517 03:22:46.191063       1 main.go:241] Failed to create SubnetManager: error retrieving pod spec for 'kube-system/kube-flannel-ds-amd64-7v8wt': Get https://10.1.0.1:443/api/v1/namespaces/kube-system/pods/kube-flannel-ds-amd64-7v8wt: x509: certificate is valid for 10.96.0.1, 172.16.1.232, not 10.1.0.1

    3.  解决方法

        这个错误的意思是, 当kubelet在使用xxxx与api-server通信时,api-server证书返回的地址列表中不包含有xxxx这个地址,导致tls证书校验不通过,可以使用以下命令来查看api-server的证书中包含的所有地址列表

        1.  查看证书的地址列表

            cd /etc/kubernetes/pki

            openssl x509 -noout -text -in apiserver.crt

            显示的结果:                                                      

            X509v3 Subject Alternative Name:
              DNS:k8s-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP Address:10.1.0.1, IP Address:172.16.1.232

            发现确实没有这个结果,所以需要把10.1.0.1增加到这个地址列表中

        2.  生成新的证书,备份/etc/kubernetes/pki这个目录            

# 生成密钥对
openssl genrsa -out apiserver.key 2048	
# 生成
openssl req -new -key apiserver.key -subj "/CN=kube-apiserver," -out apiserver.csr

# 新增 apiserver.ext文件,包含所有的地址列表,ip:xxxx即为要包含的新节点的ip, 内容如下:
subjectAltName = DNS:k8s-master, DNS:kubernetes, DNS:kubernetes.default, DNS:kubernetes.default.svc, DNS:kubernetes.default.svc.cluster.local, IP:10.1.0.1, IP:172.16.1.232

# 使用ca根证书生成新crt
openssl x509 -req -in apiserver.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -out apiserver.crt -days 3650 -extfile apiserver.ext
# apiserver.key跟apiserver.crt是一组密钥对

        3.  重新查看一下证书的地址列表

        4.  重启api-server容器,或者重启master服务器

2.  kubelet报错

    1.  kubelet的错误

        Failed to get system container stats for "/system.slice/docker.service": failed to get cgroup stats for "/system.slice/docker.service": failed to get container info for "/system.slice/docker.service": unknown container "/system.slice/docker.service"

        解决方法:

在K8S配置文件 /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf  添加
Environment="KUBELET_CGROUP_ARGS=--cgroup-driver=systemd --runtime-cgroups=/systemd/system.slice --kubelet-cgroups=/systemd/system.slice"

重启即可
systemctl daemon-reload && systemctl restart kubelet

3.  K8s的node节点故障  

    1.  问题描述

        node节点所在的服务器硬盘故障,导致node故障,并且无法修复,所以需要重新安装新的节点。

    2.  清除原有节点信息

        为什么一定要清理节点的etcd注册信息?

        因为我的新节点名称与旧节点名称相同,kube-apiserver认为这些旧节点还在,导致新的node无法正常成为Ready

        1.  在master上删除旧节点对象

            kubectl delete node k8s-node1

            kubectl delete node k8s-node2

            kubectl delete node k8s-node4

    3.  重新安装三个新节点

        系统

        docker

        kubelet

    4.  k8s-master上重新生成token

        因为时间太久,token早已过期

        kubeadm token create --print-join-command

    5.  分别在三个节点上执行加入

        kubeadm join 172.16.1.232:6443 --token srb708.o1ma4anmudn15hlu     --discovery-token-ca-cert-hash sha256:ad1546c44b615d4034896f6f789fac65b846553c4bdc0ca90b006959a2bfb3fc

    6.  加入完成后,发现node状态依然为not ready    

        查看node节点的kubelet日志,发现报错:        

Nov 20 10:20:58 k8s-node4 kubelet[12234]: E1120 10:20:58.544136   12234 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized

        因为我之前安装的网络插件是flannel,所以在k8s-master上重新安装flannel插件

        kubectl apply -f kube-flannel.yaml  

    7.  重新安装flannel以后,node状态依然为not ready

        查看node节点的kubelet日志,发现新的报错:

[failed to find plugin "flannel" in path [/opt/cni/bin]]
Nov 20 10:52:26 k8s-node1 kubelet[16864]: W1120 10:52:26.795343   16864 cni.go:237] Unable to update cni config: no valid networks found in /etc/cni/net.d
Nov 20 10:52:27 k8s-node1 kubelet[16864]: E1120 10:52:27.496429   16864 kubelet.go:2187] Container runtime network not ready: NetworkReady=false reason:NetworkPluginNotReady message:docker: network plugin is not ready: cni config uninitialized
我的node已经有/etc/cni/net.d/10-flannel.conflist文件了,master的flannel已经重装过了

        在每个node节点上,重新安装CNI二进制插件       

cd /opt/cni/bin

curl -L -o cni-plugins.tgz https://github.com/containernetworking/plugins/releases/download/v0.8.7/cni-plugins-linux-amd64-v0.8.7.tgz

tar zxvf cni-plugins.tgz

        安装完成后,重启一下kubelet

    8.  节点状态显示为Ready

posted @ 2023-05-17 15:06  奋斗史  阅读(197)  评论(0)    收藏  举报