mise à jour en ligne du certificat kubernetes

Heure d'expiration de chaque certificat

/etc/kubernetes/pki/apiserver.crt                #1年有效期
/etc/kubernetes/pki/front-proxy-ca.crt           #10年有效期
/etc/kubernetes/pki/ca.crt                       #10年有效期
/etc/kubernetes/pki/apiserver-etcd-client.crt    #1年有效期
/etc/kubernetes/pki/front-proxy-client.crt       #1年有效期
/etc/kubernetes/pki/etcd/server.crt              #1年有效期
/etc/kubernetes/pki/etcd/ca.crt                  #10年有效期
/etc/kubernetes/pki/etcd/peer.crt                #1年有效期
/etc/kubernetes/pki/etcd/healthcheck-client.crt  #1年有效期
/etc/kubernetes/pki/apiserver-kubelet-client.crt #1年有效期

Peut être utilisé pour vérifier l'heure d'expiration du certificat:

méthode 1

kubeadm alpha certs check-expiration

Méthode 2

openssl x509 -noout -dates -in /etc/kubernetes/pki/apiserver.crt
kubeadm alpha certs 命令详解:
Available Commands:
  certificate-key  生成证书和key
  check-expiration  检测证书过期时间
  renew            续订Kubernetes集群的证书
  kubeadm alpha certs命令仅支持v1.15及其以上的版本。
kubeadm alpha certs check-expiration

Cette commande affiche le certificat client dans le dossier / etc / kubernetes / pki et le temps d'expiration / temps restant du certificat client intégré dans le fichier KUBECONFIG utilisé par kubeadm.

Si vous exécutez un cluster hautement disponible, cette commande doit être exécutée sur tous les nœuds du panneau de commande.

Ensuite, mettons à jour notre certificat de cluster. Les opérations suivantes sont effectuées sur le nœud maître. Tout d'abord, sauvegardez le certificat d'origine:

mkdir /etc/kubernetes.bak
cp -r /etc/kubernetes/pki/ /etc/kubernetes.bak
cp /etc/kubernetes/*.conf /etc/kubernetes.bak
然后备份 etcd 数据目录:
cp -r /var/lib/etcd /var/lib/etcd.bak

Mettre à jour le certificat avec l'API de certificat Kubernetes

Outre la mise à jour manuelle du certificat en un clic mentionnée ci-dessus, vous pouvez également utiliser l'API de certificat Kubernetes pour effectuer une mise à jour manuelle du certificat. Pour l'environnement en ligne, il se peut que nous ne prenions pas le risque de mettre à jour fréquemment le cluster ou de mettre à jour le certificat. Ce sont des risques après tout. Par conséquent, nous espérons que la période de validité du certificat généré est suffisamment longue. Bien que cela ne soit pas recommandé du point de vue de la sécurité, ce n'est pas recommandé. Dans certains scénarios, une période de validité de certificat suffisamment longue est également très nécessaire. De nombreux administrateurs modifient manuellement le code source de kubeadm sur 10 ans, puis recompilent pour créer un cluster. Bien que cette méthode puisse atteindre l'objectif, il n'est pas recommandé d'utiliser cette méthode, en particulier lorsque vous souhaitez mettre à jour le cluster. Il doit être mis à jour avec la nouvelle version. En fait, Kubernetes fournit une méthode API pour nous aider à générer une période de validité de certificat suffisamment longue.
Pour utiliser la méthode API intégrée pour signer, nous devons d'abord configurer le paramètre --experimental-cluster-signature-duration du composant kube-controller-manager et l'ajuster à 10 ans. Voici le cluster installé par kubeadm, nous modifions donc directement la statique Le fichier yaml du pod peut être:

vim /etc/kubernetes/manifests/kube-controller-manager.yaml
......
spec:
  containers:
  - command:
    - kube-controller-manager
     #设置证书有效期为 10 年
    - --experimental-cluster-signing-duration=87600h 
    - --client-ca-file=/etc/kubernetes/pki/ca.crt
......

Une fois la modification terminée, kube-controller-manager redémarrera automatiquement pour prendre effet. Ensuite, nous devons utiliser la commande suivante pour créer une demande de signature de certificat pour l'API de certificat Kubernetes. Si vous configurez un signataire externe tel que cert-manager, les demandes de signature de certificat (CSR) seront automatiquement approuvées. Sinon, vous devez approuver manuellement le certificat à l'aide de la commande kubectl certificate. La commande kubeadm suivante génère le nom du certificat à approuver, puis attend que l'approbation se produise:

kubeadm alpha certs renew all --use-api --config kubeadm.yaml &

La sortie est similaire à ce qui suit:

[1] 2890
[certs] Certificate request "kubeadm-cert-kubernetes-admin-pn99f" created

#然后接下来我们需要去手动批准证书:

kubectl get csr
NAME                                  AGE   REQUESTOR          CONDITION
kubeadm-cert-kubernetes-admin-pn99f   64s   kubernetes-admin   Pending

Approuver manuellement le certificat

kubectl certificate approve kubeadm-cert-kubernetes-admin-pn99f
certificatesigningrequest.certificates.k8s.io/kubeadm-cert-kubernetes-admin-pn99f approved 

用同样的方式为处于 Pending 状态的 csr 执行批准操作,直到所有的 csr 都批准完成为止。最后所有的 csr 列表状态如下所示:

kubectl get csr
NAME                                                AGE     REQUESTOR          CONDITION
kubeadm-cert-front-proxy-client-llhrj               30s     kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-2s6kf                   2m43s   kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-etcd-client-t9pkx       2m7s    kubernetes-admin   Approved,Issued
kubeadm-cert-kube-apiserver-kubelet-client-pjbjm    108s    kubernetes-admin   Approved,Issued
kubeadm-cert-kube-etcd-healthcheck-client-8dcn8     64s     kubernetes-admin   Approved,Issued
kubeadm-cert-kubernetes-admin-pn99f                 4m29s   kubernetes-admin   Approved,Issued
kubeadm-cert-system:kube-controller-manager-mr86h   79s     kubernetes-admin   Approved,Issued
kubeadm-cert-system:kube-scheduler-t8lnw            17s     kubernetes-admin   Approved,Issued
kubeadm-cert-ydzs-master-cqh4s                      52s     kubernetes-admin   Approved,Issued
kubeadm-cert-ydzs-master-lvbr5                      41s     kubernetes-admin   Approved,Issued

Vérifiez la période de validité du certificat après approbation:

kubeadm alpha certs check-expiration
CERTIFICATE                EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
admin.conf                 Nov 05, 2029 11:53 UTC   9y              no
apiserver                  Nov 05, 2029 11:54 UTC   9y              no
apiserver-etcd-client      Nov 05, 2029 11:53 UTC   9y              no
apiserver-kubelet-client   Nov 05, 2029 11:54 UTC   9y              no
controller-manager.conf    Nov 05, 2029 11:54 UTC   9y              no
etcd-healthcheck-client    Nov 05, 2029 11:53 UTC   9y              no
etcd-peer                  Nov 05, 2029 11:53 UTC   9y              no
etcd-server                Nov 05, 2029 11:54 UTC   9y              no
front-proxy-client         Nov 05, 2029 11:54 UTC   9y              no
scheduler.conf             Nov 05, 2029 11:53 UTC   9y              no

On constate qu'il a été prolongé de 10 ans, car la période de validité du certificat CA n'est que de 10 ans.

Mais maintenant, nous ne pouvons pas redémarrer directement plusieurs composants du panneau de contrôle, car le etcd correspondant au cluster installé avec kubeadm utilise le certificat /etc/kubernetes/pki/etcd/ca.crt pour effectuer l'étape précédente par défaut. Le certificat approuvé par la commande kubectl certificate approve est émis avec le certificat par défaut /etc/kubernetes/pki/ca.crt, nous devons donc remplacer le certificat CA dans etcd:

Copiez d'abord la liste des ressources de pod statiques

cp -r /etc/kubernetes/manifests/ /etc/kubernetes/manifests.bak
vi /etc/kubernetes/manifests/etcd.yaml
......
spec:
  containers:
  - command:
    - etcd
    # 修改为 CA 文件
    - --peer-trusted-ca-file=/etc/kubernetes/pki/ca.crt
    - --trusted-ca-file=/etc/kubernetes/pki/ca.crt
......
    volumeMounts:
    - mountPath: /var/lib/etcd
      name: etcd-data
    - mountPath: /etc/kubernetes/pki  # 更改证书目录
      name: etcd-certs
  volumes:
  - hostPath:
      path: /etc/kubernetes/pki  # 将 pki 目录挂载到 etcd 中去
      type: DirectoryOrCreate
    name: etcd-certs
  - hostPath:
      path: /var/lib/etcd 
      type: DirectoryOrCreate
    name: etcd-data
......

Puisque kube-apiserver doit se connecter au cluster etcd, le fichier ca etcd correspondant doit également être révisé:

vim /etc/kubernetes/manifests/kube-apiserver.yaml
......
spec:
  containers:
  - command:
    - kube-apiserver
    # 将etcd ca文件修改为默认的ca.crt文件
    - --etcd-cafile=/etc/kubernetes/pki/ca.crt
......

De plus, vous devez remplacer le fichier requestheader-client-ca-file, la valeur par défaut est le fichier /etc/kubernetes/pki/front-proxy-ca.crt, et maintenant vous devez le remplacer par le fichier CA par défaut, sinon utilisez l'API d'agrégation, telle que Après avoir installé le serveur de métriques et exécuté la commande kubectl top, une erreur sera signalée:

cp /etc/kubernetes/pki/ca.crt /etc/kubernetes/pki/front-proxy-ca.crt
cp /etc/kubernetes/pki/ca.key /etc/kubernetes/pki/front-proxy-ca.key

Puisqu'il s'agit d'un pod statique, les composants ci-dessus redémarreront automatiquement pour prendre effet une fois la modification terminée. Étant donné que notre version actuelle de kubelet a la rotation automatique des certificats activée par défaut, le certificat kubelet n'a plus besoin d'être géré, je vais donc mettre à jour le certificat à une période de validité de 10. Veillez à sauvegarder le répertoire de certificats avant l'opération pour éviter la restauration des erreurs d'opération.

Je suppose que tu aimes

Origine blog.51cto.com/14034751/2552331
conseillé
Classement