二进制部署的k8sv1.22.15,

[root@matser ~]# kubectl  get nodes
NAME    STATUS     ROLES    AGE    VERSION
node1   NotReady   <none>   5h5m   v1.22.15
node2   NotReady   <none>   5h4m   v1.22.15
[root@matser ~]# 

这是因为没有安装网络插件。现在我们来安装flannel 网络插件:

wget https://raw.githubusercontent.com/flannel-io/flannel/master/Documentation/kube-flannel.yml
kubectl apply -f kube-flannel.yml

发现pod一致启动不了,一致处于失败,重启,失败,重启的状态。

#查看kubelet的日志,发现下面的报错信息
11月 02 19:08:41 node1 kubelet[29281]: E1102 19:08:41.359431   29281 pod_workers.go:951]
"Error syncing pod, skipping" err="failed to \"StartContainer\" 
for \"kube-flannel\" with CrashLoopBackOff: \"back-off 20s restarting failed 
container=kube-flannel pod=kube-flannel-ds-26dlf_kube-flannel(daa2f808-65df-410c-8436-b1beaecb731d)\""
pod="kube-flannel/kube-flannel-ds-26dlf" podUID=daa2f808-65df-410c-8436-b1beaecb731d
#查看pod的日志,发现下面的报错
 Failed to create SubnetManager: error retrieving pod spec for 
 'kube-flannel/kube-flannel-ds-26dlf': Get "https://10.0.0.1:443/api/v1/namespaces/kube-flannel/pods/kube-flannel-ds-26dlf": x509: certificate is valid for 192.168.118.140, 10.11.0.1, not 10.0.0.1

#这该死的字面有个10.0.0.1这个ip的
grep '10.0.0.1' kube-flannel.yml  				 #既不是kube-flannel.yml里面定义的
grep -r  '10.0.0.1' /opt/kubernetes/config/*	#又不是配置证书的时候定义的
grep -r  '10.0.0.1'  /opt/TLS/k8s/*

#嘛的,这个10.0.0.1 IP到底是哪里的呢?它怎么要用这个IP+443端口去连apisever呢?冷静冷静,仔细想想,这个IP既不是kube-flannel.yml里面
#定义的,也不是部署证书时或创建配置文件时指定的,那回事哪里的呢?我们配置配置证书或创建配置文件时,也没指定这个IP。
#我们配置的api-server的端口是6443,等下,443端口,443端口不是k8s集群里面service的端口吗,靠,知道了,10.0.0.1是k8s创建的第一个service的ip地址。

#查看kube-apiserver配置文件,果然,service的ip定义范围--service-cluster-ip-range=10.0.0.0/24 
#那么它既然要这个ip去访问api-server,所以我们需要把这个service的IP加入server-csr.json证书。如下:
```bash
cat > server-csr.json << EOF
{
    "CN": "kubernetes",
    "hosts": [
      "192.168.118.140",	#这个是主机IP地址,必须写上
      "10.0.0.1",			#这个是service的第一个地址,必须写上(我就是没写才导致后面部署网络插件踩坑的)
	  "10.11.0.1"			#这个是预留的
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "L": "Shenzhen",
            "ST": "Shenzhen",
            "O": "k8s",
            "OU": "System"
        }
    ]
}
EOF


#重新使用命令生成证书,然后替换原来的证书,重启api-server即可,重新部署网络插件,终于正常。


Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐