k8s集群的CA证书过期处理

文章目录

  • 制作延期的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-fileetcd-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 {}

你可能感兴趣的:(kubernetes,云原生)