背景:
之前在阿里云主機上使用kubeadm安裝的kubernates(版本號為:1.8.3),使用了一年以后琳骡,突然出現(xiàn)問題。
問題狀態(tài)為不管使用kubectl 的什么指令祈纯,都報出以下的異常:
Unable to connect to the server: x509: certificate has expired or is not yet valid
通過異常關鍵字查詢令宿,最后定位是默認安裝中,kubenates的apiserver與kubelet的訪問授信證書是一年腕窥,官方的說法是通過這種方式粒没,讓用戶不斷的升級版本。現(xiàn)在這套環(huán)境上跑著用戶的生產環(huán)境簇爆,不可能去做升級或是重裝的事情癞松,這個影響太大了,所以需要在不重裝kubernates的前提上入蛆,把這個問題解決掉响蓉。
思路
方案1
源碼去掉證書判定邏輯,重新編譯
這個方式沒有驗證哨毁,但需要下載對應版本的源碼枫甲,重新編譯相應組件。這個方式如果是與原作者的k8s版本一致可以試一下挑庶,或是對go語言熟悉的用戶可以找對應的處理邏輯代碼進行修改言秸。
方案2
重新生成證書
其中有位大胡子說:
備注:因為內容太多软能,這里沒有辦法截圖完整方案迎捺,可以通過鏈接自己查看。大概意思就是說他是1.8以下版本的k8s集群環(huán)境,按照以下步驟可以解決問題查排。并且有多人回復說按照大胡子的方式處理已經成功解決問題凳枝。
樓下出現(xiàn)一個小人說:
大概意思就是說他是非集群的環(huán)境,按照大胡子的1-6步損傷也成功了。
解決
有了上面的方案做參照岖瑰,就有了自己的思路叛买。基于本人的實際情況蹋订。還是考慮使用方案2的方式來解決率挣,只是根據自己的情況對步驟進行裁減,最后問題得到了解決露戒。下面將環(huán)境椒功,處理步驟以操作過程中出現(xiàn)的問題敘述如下:
環(huán)境
在阿里云的云主機上使用kubeadm安裝的1.8.3版本的單結點的kubernates。
處理步驟
備份證書
sudo mv /etc/kubernetes/pki/apiserver.key /etc/kubernetes/pki/apiserver.key.old
sudo mv /etc/kubernetes/pki/apiserver.crt /etc/kubernetes/pki/apiserver.crt.old
sudo mv /etc/kubernetes/pki/apiserver-kubelet-client.crt /etc/kubernetes/pki/apiserver-kubelet-client.crt.old
sudo mv /etc/kubernetes/pki/apiserver-kubelet-client.key /etc/kubernetes/pki/apiserver-kubelet-client.key.old
sudo mv /etc/kubernetes/pki/front-proxy-client.crt /etc/kubernetes/pki/front-proxy-client.crt.old
sudo mv /etc/kubernetes/pki/front-proxy-client.key /etc/kubernetes/pki/front-proxy-client.key.old
產生新的證書
sudo kubeadm alpha phase certs apiserver --apiserver-advertise-address 127.0.0.1
sudo kubeadm alpha phase certs apiserver-kubelet-client
sudo kubeadm alpha phase certs front-proxy-client
備份老的配置文件
sudo mv /etc/kubernetes/admin.conf /etc/kubernetes/admin.conf.old
sudo mv /etc/kubernetes/kubelet.conf /etc/kubernetes/kubelet.conf.old
sudo mv /etc/kubernetes/controller-manager.conf /etc/kubernetes/controller-manager.conf.old
sudo mv /etc/kubernetes/scheduler.conf /etc/kubernetes/scheduler.conf.old
產生新的配置文件
sudo kubeadm alpha phase kubeconfig all --apiserver-advertise-address 127.0.0.1
確認kubectl正在查找正確的配置文件路徑
mv $HOME/.kube/config $HOME/.kube/config.old
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
sudo chmod 777 $HOME/.kube/config
export KUBECONFIG=$HOME/.kube/config
重啟kube-apiserver智什,kube-controller-manager, kube-scheduler
通過docker ps找到kube-apiserver动漾,kube-controller-manager, kube-scheduler容器,然后指令殺掉容器荠锭,讓他重新加載旱眯。
下面以kube-apiserver為例:
docker ps | grep ${keyword}
docker kill -s HUP ${容器ID}
及
備注:
在生成證書時會莫名的訪問google的網址,因為google已經被封了证九,所以會報超時删豺。第一次出現(xiàn)這個異常的時候都快絕望了。
這是因為在kubeadm命令升級master證書時愧怜,它也會默認從網上讀取一個stable.txt的文件吼鳞。解決這個問題的辦法,就是生成一個集群配置的yaml文件叫搁,然后赔桌,在運行命令時指定這個Yaml文件即可。
kubeadm config view > cluster.yaml
注:如果已經無法使用該指令生成cluster.yaml文件的情況下渴逻,應該可以隨便找個文件也是可以的疾党,應該是kubeadm需要一個salt來生成證書信息,這個salt就是這個文件信息惨奕。
我的cluster.yaml文件如下:
api:
advertiseAddress: 172.19.197.5
bindPort: 6443
authorizationModes:
- Node
- RBAC
certificatesDir: /etc/kubernetes/pki
cloudProvider: ""
etcd:
caFile: ""
certFile: ""
dataDir: /var/lib/etcd
endpoints: null
image: ""
keyFile: ""
imageRepository: gcr.io/google_containers
kubernetesVersion: v1.8.3
networking:
dnsDomain: cluster.local
podSubnet: 10.244.0.0/16
serviceSubnet: 10.96.0.0/12
nodeName: kubernetes.localdomain
token: ""
tokenTTL: 24h0m0s
unifiedControlPlaneImage: ""
然后在上面的kubeadm alpha phase指令中雪位,都添加config參數(shù),指定生成證書的鹽值梨撞。如:
sudo kubeadm alpha phase certs apiserver --config /root/cluster.yaml
sudo kubeadm alpha phase certs apiserver-kubelet-client --config /root/cluster.yaml
sudo kubeadm alpha phase certs front-proxy-client --config /root/cluster.yaml
sudo kubeadm alpha phase kubeconfig all --config /root/cluster.yaml