Как обновить внутренние кубовые сертификаты (1.15-1.18)
Содержание

Это примерный процесс обновления, который проверен на версиях 1.15-1.18 На более поздних версиях этот процесс должен быть сильно проще, особенно в плане обновления сертификата kubelet на master-нодах

На master-нодах

  1. Обновить сертификаты компонентов кубера с помощью kubeadm
    for cert in apiserver apiserver-kubelet-client front-proxy-client admin.conf controller-manager.conf scheduler.conf; do
        /usr/local/bin/kubeadm alpha certs renew $cert;
    done
    
  2. Обновить сертификаты kubelet
    #!/bin/bash
    set -eu -o pipefail
    
    ## kubelet
    kube_dir="/etc/kubernetes"
    
    ### v3 extensions settings
    cat << EOF > ${kube_dir}/v3_ext
    keyUsage=keyEncipherment,digitalSignature
    extendedKeyUsage=clientAuth
    EOF
    
    ### get cert and key
    cat ${kube_dir}/kubelet.conf | grep certificate-data | awk '{print $2}' | base64 -d > ${kube_dir}/kubelet.crt
    cat ${kube_dir}/kubelet.conf | grep key-data | awk '{print $2}' | base64 -d > ${kube_dir}/kubelet.key
    
    ### generate csr and sign it
    openssl x509 -x509toreq -in ${kube_dir}/kubelet.crt -out ${kube_dir}/kubelet.csr -signkey ${kube_dir}/kubelet.key
    openssl x509 -req -in ${kube_dir}/kubelet.csr -CA ${kube_dir}/ssl/ca.crt -CAkey ${kube_dir}/ssl/ca.key -CAcreateserial -out ${kube_dir}/kubelet.crt -days 365 -extfile ${kube_dir}/v3_ext
    
    ### insert cert to kubelet.conf
    cert_data=$(cat ${kube_dir}/kubelet.crt | base64 -w0)
    sed -i "s/client-certificate-data: .*$/client-certificate-data: $cert_data/" ${kube_dir}/kubelet.conf
    
    rm -f ${kube_dir}/kubelet.csr ${kube_dir}/kubelet.crt ${kube_dir}/kubelet.key ${kube_dir}/v3_ext
    

Это же можно сделать проще /usr/local/bin/kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) >/etc/kubernetes/kubelet.conf

Для версии >=1.20 можно также задать cluster-name /usr/local/bin/kubeadm alpha kubeconfig user --org system:nodes --client-name system:node:$(hostname) --cluster-name cluster.local >/etc/kubernetes/kubelet.conf

  1. Перезапустить docker и kubelet systemctl restart docker kubelet

На worker-нодах надо что-то делать только если уже не было включено автоматическое обновление

  1. Включить автоматическое обновление сертификата kubelet grep -Fr rotateCertificates /etc/kubernetes/kubelet-config.yaml || echo "rotateCertificates: true" >> /etc/kubernetes/kubelet-config.yaml

  2. Перезапустить kubelet systemctl restart kubelet