kubeadm升级证书-集群已GG

集群GG了,一查默认的证书失效只有一年。恢复吧,手生啊。

kubeadm 是 kubernetes 提供的一个初始化集群的工具,使用起来非常方便,但是它创建的 apiserver、controller-manager 等证书默认只有一年的有效期,
同时 kubelet 证书也只有一年有效期,一年之后 kubernetes 将停止服务。
方法总结下来有以下几个:
1、官方推荐:一年之内 kubeadm upgrade 更新一次 kubernetes 系统。
2、坊间方法:源代码编译,使得 kubeadm 生成的证书时间边长。
3、手动更新证书( kubeadm alpha phase )。
4、启用自动轮换 kubelet 证书

查询api证书过期时间
openssl x509 -in /etc/kubernetes/pki/apiserver.crt -noout -text |grep ' Not '
查询etcd证书过期时间
openssl x509 -in /etc/kubernetes/pki/etcd/healthcheck-client.crt -noout -text |grep ' Not '

一、环境GG的情况下更新证书
1、准备 kube-config.yaml
kubeadm命令升级master证书时,它也会默认从墙外读取一个stable.txt的文件,生产环境没有墙外线是绝对访问不到的。
这时候就需要自备的kube-config.yaml文件。生成方式如下命令:

kubeadm config view > kube-config.yaml

实际情况集群挂了的时候这个命令也是无法执行,可以自己写一个,但是担心版本问题,之前也没备份。好在我司用的集群是我标准化过的。
找台机器重新部署一个同版本的,>kubeadm config view > kube-config.yaml 生成一个kube-config.yaml当然新生成的yml要修改里边的apiserver地址为master地址。应该是替换/etc/kube下的同名文件,记得备份。补的文档,记不太清楚了,当时也没标注这个。应该是没问题。
修改:

apiVersion: kubeadm.k8s.io/v1beta1  
kind: ClusterConfiguration  
kubernetesVersion: v1.14.1 #-->这里改成你集群对应的版本  
imageRepository: registry.cn-hangzhou.aliyuncs.com/google_containers  
#这里使用国内的镜像仓库,否则在重新签发的时候会报错:could not fetch a Kubernetes version from the internet: unable to get URL "https://dl.k8s.io/release/stable-1.txt"

2、备份证书
cp -r /etc/kubernetes /etc/kubernetes.bak
移动证书和配置【注意!必须移动,不然会使用现有的证书,不会重新生成】

cd /etc/kubernetes
mkdir ./pki_bak
mkdir ./pki_bak/etcd
mkdir ./conf_bak
mv pki/apiserver* ./pki_bak/
mv pki/front-proxy-client.* ./pki_bak/
mv pki/etcd/healthcheck-client.* ./pki_bak/etcd/
mv pki/etcd/peer.* ./pki_bak/etcd/
mv pki/etcd/server.* ./pki_bak/etcd/
mv ./admin.conf ./conf_bak/
mv ./kubelet.conf ./conf_bak/
mv ./controller-manager.conf ./conf_bak/
mv ./scheduler.conf ./conf_bak/

3、生成证书

kubeadm alpha phase certs all --config=cluster.yaml
版本不一致执行的命令也不一样,需要查看对应版本alpha命令
参考文档:
https://www.cnblogs.com/skymyyang/p/11093686.html
https://hacpai.com/article/1575013191401 ()
有相关介绍,不过我参考的是第二个,第一个尝试失败

4、更新配置文件

kubeadm alpha phase kubeconfig all --config=cluster.yaml
mv $HOME/.kube/config $HOME/.kube/config.old
cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
chown $(id -u):$(id -g) $HOME/.kube/config
sudo chmod 777 $HOME/.kube/config

完成后重启kube-apiserver,kube-controller,kube-scheduler,etcd这4个容器,亲测systemctl rstart docker 也可以

报错:
error: Error loading config file "/etc/kubernetes/scheduler.conf": read /etc/kubernetes/scheduler.conf: is a directory

diff kube-config.yaml cluster.yaml 发现nodename不一致,可能是他导致的,试试
kubeadm config view > kube-config.yaml
rm -rf /etc/kubernetes/scheduler.conf 我这里secheduler.conf现在是个目录,不知道啥情况。
单独更新scheduler的证书就行
kubeadm alpha phase kubeconfig scheduler --config=/root/kube-config.yaml

完成
二、启用自动轮换 kubelet 证书
kubelet 证书分为 server 和 client 两种, k8s 1.9 默认启用了 client 证书的自动轮换,但 server 证书自动轮换需要用户开启.

1、增加 kubelet 参数
在/etc/systemd/system/kubelet.service.d/10-kubeadm.conf 增加如下参数
Environment="KUBELET_EXTRA_ARGS=--feature-gates=RotateKubeletServerCertificate=true"
增加 controller-manager 参数
在/etc/kubernetes/manifests/kube-controller-manager.yaml 添加如下参数

  • command:
    • kube-controller-manager
    • --experimental-cluster-signing-duration=87600h0m0s
    • --feature-gates=RotateKubeletServerCertificate=true
    • ....

2、创建 rbac 对象
创建rbac对象,允许节点轮换kubelet server证书:
cat > ca-update.yaml << EOF
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
annotations:
rbac.authorization.kubernetes.io/autoupdate: "true"
labels:
kubernetes.io/bootstrapping: rbac-defaults
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
rules:

  • apiGroups:
    • certificates.k8s.io
      resources:
    • certificatesigningrequests/selfnodeserver
      verbs:
    • create

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
name: kubeadm:node-autoapprove-certificate-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeserver
subjects:

  • apiGroup: rbac.authorization.k8s.io
    kind: Group
    name: system:nodes
    EOF

3、开启轮换
kubectl create –f ca-update.yaml

posted @ 2020-07-11 01:24  名字很长容易被惦记  阅读(1494)  评论(0编辑  收藏  举报