文章目录
- 制作延期的CA证书
- 获取CA全名
- 准备签发申请配置
- 生成新CA
- 验证并替换CA
- 更新master组件的CA配置
- kube-apiserver
- kube-controller-manager
- kube-scheduler
- kube-admin
- 检查证书过期时间
- 更新ServiceAccount secret
- 更新node组件配置的CA
- 更新kubelet连接配置
- 签发kubelet自动申请的客户端证书
不改变原CA的公私钥,安全地在线地更新集群CA
制作延期的CA证书
使用go语言开发地证书生成工具(必须)
获取CA全名
cfssl certinfo -cert /etc/kubernetes/pki/ca.crt
准备签发申请配置
把原CA的组织、名称信息写入申请配置,并设置新CA证书的过期时间为10年后
tee ca-cfssl-csr.json <<-'EOF'
{"CA": {"expiry": "87600h","pathlen": 2},"names":[{"C": "","ST": "","L": "","O": "","OU": ""}],"CN": "kubernetes"
}
EOF
生成新CA
cfssl会使用CA的默认用途来生成新的CA证书,传入CA私钥,就能保持新CA证书的公钥与之前一致
cfssl gencert -ca-key ca.key -initca=true ca-cfssl-csr.json | cfssljson -bare ca-20240406
不能使用openssl来生成CA,因为kubeadm、kube-apiserver是golang开发的,golang的pki工具包核对证书链时,要求CA证书的rawSubject、客户端证书里记录的rawIssuer完全一致;而cfssl、kubeadm都是golang开发的,能够把信息一致的Subject信息(CA的组织、名称信息)序列化为一致的DER字节数组(rawSubject)
验证并替换CA
确认新CA是否可以用于验证原CA签发的证书
openssl verify -CAfile ca-20240406.pem apiserver.crt
# 备份原CA
mv ca.crt ca-20191001.crt
mv ca-20240406.pem ca.crt
更新master组件的CA配置
kube-apiserver
apiserver的client-ca-file参数,用于验证其他master组件、kubelet的客户端证书的合法性,默认指向/etc/kubernetes/pki/ca.crt;
ca.crt文件更新后,重启apiserver即可。
requestheader-client-ca-file、etcd-cafile参数指向的其他ca文件,如需延期,也是按照相同步骤来生成延期的新ca文件
kube-controller-manager
controller-manager连接apiserver的配置信息,默认放在/etc/kubernetes/controller-manager.conf文件里;
controller-manager.conf文件里certificate-authority-data字段的值,就是对/etc/kubernetes/pki/ca.crt文件的base64 with padding编码;
root-ca-file参数控制的是注入到ServiceAccount secret里的CA数据,也是指向/etc/kubernetes/pki/ca.crt;
cluster-signing-cert-file参数控制的是签发客户端证书的CA,也是指向/etc/kubernetes/pki/ca.crt;
需要替换certificate-authority-data字段后重启controller-manager
kube-scheduler
更新/etc/kubernetes/scheduler.conf里的certificate-authority-data后重启scheduler
kube-admin
更新/etc/kubernetes/admin.conf里的certificate-authority-data;
把admin.conf复制到~/.kube/config里,供kubectl使用
检查证书过期时间
检查apiserver服务端证书、检查配置文件里的客户端证书(client-certificate-data)、检查CA证书:
kubeadm certs check-expiration
更新ServiceAccount secret
controller-manager的root-ca-file更新后,会自动更新ServiceAccount secret里的CA(用于验证apiserver服务端证书的合法性);
使用了ServiceAccount来查询/管理集群配置的系统组件,如kube-proxy、calico、coredns,需要手动重启,以应用更新后的CA
kubectl rollout restart deployment coredns -n kube-system
更新node组件配置的CA
更新kubelet连接配置
更新/etc/kubernetes/kubelet.conf里的certificate-authority-data后重启kubelet;
kubelet及时恢复与apiserver的通讯,不会影响宿主机已运行的pod
签发kubelet自动申请的客户端证书
kubelet发现CA有效期延长后,会自动申请续期自己的客户端证书
kubectl get csr
# 批量通过申请
kubectl get csr | grep 'Pending'| cut -d ' ' -f 1 |xargs -I{} kubectl certificate approve {}