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
- certificates.k8s.io
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