使用go语言开发地证书生成工具(必须)
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
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签发的证书
openssl verify -CAfile ca-20240406.pem apiserver.crt
# 备份原CA
mv ca.crt ca-20191001.crt
mv ca-20240406.pem ca.crt
apiserver的client-ca-file参数,用于验证其他master组件、kubelet的客户端证书的合法性,默认指向/etc/kubernetes/pki/ca.crt;
ca.crt文件更新后,重启apiserver即可。
requestheader-client-ca-file、etcd-cafile参数指向的其他ca文件,如需延期,也是按照相同步骤来生成延期的新ca文件
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
更新/etc/kubernetes/scheduler.conf里的certificate-authority-data后重启scheduler
更新/etc/kubernetes/admin.conf里的certificate-authority-data;
把admin.conf复制到~/.kube/config里,供kubectl使用
检查apiserver服务端证书、检查配置文件里的客户端证书(client-certificate-data)、检查CA证书:
kubeadm certs check-expiration
controller-manager的root-ca-file更新后,会自动更新ServiceAccount secret里的CA(用于验证apiserver服务端证书的合法性);
使用了ServiceAccount来查询/管理集群配置的系统组件,如kube-proxy、calico、coredns,需要手动重启,以应用更新后的CA
kubectl rollout restart deployment coredns -n kube-system
更新/etc/kubernetes/kubelet.conf里的certificate-authority-data后重启kubelet;
kubelet及时恢复与apiserver的通讯,不会影响宿主机已运行的pod
kubelet发现CA有效期延长后,会自动申请续期自己的客户端证书
kubectl get csr
# 批量通过申请
kubectl get csr | grep 'Pending'| cut -d ' ' -f 1 |xargs -I{} kubectl certificate approve {}