Memperpanjang sertifikat cluster yang sudah tidak berlaku secara manual

Perpanjangan sertifikat manual memungkinkan Anda memulihkan operasi bidang kontrol di Google Distributed Cloud saat sertifikat Transport Layer Security (TLS) habis masa berlakunya. Anda tidak dapat mengelola workload dan siklus proses cluster hingga Anda memperpanjang masa berlaku sertifikat TLS yang sudah tidak berlaku. Untuk mengetahui informasi selengkapnya tentang dampak masa berlaku sertifikat yang habis, lihat Masa berlaku sertifikat.

Sertifikat TLS, termasuk sertifikat etcd, memiliki masa berlaku default 1 tahun dan tidak diupdate secara otomatis. Untuk mencegah masa berlaku sertifikat berakhir dan menjaga cluster Anda tetap aman dan didukung, sebaiknya Anda mengupgrade cluster secara rutin. Google Distributed Cloud memperpanjang sertifikat ini selama upgrade cluster dan saat Anda merotasi certificate authority. Anda dapat menggunakan panduan ini untuk memulihkan cluster jika masa berlaku sertifikat berakhir sebelum upgrade. Untuk mengetahui detail terkait, lihat Peran dan tugas pengguna GKE umum.

Error yang disebabkan oleh masa berlaku sertifikat yang habis

Jika masa berlaku sertifikat TLS di cluster Anda habis, pengontrol inti tidak dapat membuat koneksi TLS dengan server Kubernetes API. Kurangnya konektivitas ini menyebabkan error berikut:

  • Unable to connect to the server: x509

    Saat Anda menggunakan kubectl untuk mendapatkan node cluster, responsnya akan menyertakan error bahwa sertifikat Anda telah habis masa berlakunya, mirip dengan contoh output berikut:

    Unable to connect to the server: x509: certificate has expired or is not yet valid
    
  • could not connect: x509 atau rejected connection

    Sertifikat yang sudah tidak berlaku akan memblokir akses ke cluster etcd, karena peer tidak dapat berkomunikasi satu sama lain. Log etcd mungkin berisi entri error seperti berikut:

    W | rafthttp: health check for peer 6221a1d241bb2d0a could not connect: x509: certificate
    has expired or is not yet valid
    I | embed: rejected connection from "10.200.0.4:46108" (error "remote error: tls: bad
    certificate", ServerName "")
    

Memeriksa waktu habis masa berlaku sertifikat

Untuk memeriksa waktu habis masa berlaku sertifikat, lakukan langkah-langkah berikut pada setiap node bidang kontrol:

  1. Login ke salah satu mesin node bidang kontrol dan jalankan perintah berikut:

    sudo kubeadm certs check-expiration
    

    Output perintah mencantumkan sertifikat yang dibuat oleh kubeadm untuk komponen bidang kontrol dan masa berlakunya, seperti yang ditunjukkan dalam contoh output berikut:

    CERTIFICATE                EXPIRES                  RESIDUAL TIME   CERTIFICATE AUTHORITY   EXTERNALLY MANAGED
    admin.conf                 Nov 28, 2021 19:09 UTC   53m                                     no
    apiserver                  Nov 28, 2021 19:09 UTC   53m             ca                      no
    apiserver-etcd-client      Nov 28, 2021 19:09 UTC   53m             etcd-ca                 no
    apiserver-kubelet-client   Nov 28, 2021 19:09 UTC   53m             ca                      no
    controller-manager.conf    Nov 28, 2021 19:09 UTC   53m                                     no
    etcd-healthcheck-client    Nov 28, 2021 19:09 UTC   53m             etcd-ca                 no
    etcd-peer                  Nov 28, 2021 19:09 UTC   53m             etcd-ca                 no
    etcd-server                Nov 28, 2021 19:09 UTC   53m             etcd-ca                 no
    front-proxy-client         Nov 28, 2021 19:09 UTC   53m             front-proxy-ca          no
    scheduler.conf             Nov 28, 2021 19:09 UTC   53m                                     no
    
    CERTIFICATE AUTHORITY   EXPIRES                  RESIDUAL TIME   EXTERNALLY MANAGED
    ca                      Nov 26, 2031 18:06 UTC   9y              no
    etcd-ca                 Nov 26, 2031 18:06 UTC   9y              no
    front-proxy-ca          Nov 26, 2031 18:06 UTC   9y              no
    
  2. Jalankan perintah berikut untuk memeriksa waktu habis masa berlaku sertifikat kubelet:

    sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2
    sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
    

    Respons untuk setiap perintah terlihat seperti contoh output berikut:

    Validity
        Not Before: Sep 17 22:27:53 2021 GMT
        Not After : Sep 17 22:33:16 2022 GMT
    

    Jika semua node bidang kontrol telah di-bootstrap pada saat yang sama, waktu habis masa berlaku sertifikat akan berada dalam hitungan menit satu sama lain. Hubungan pengaturan waktu ini berlaku di semua node bidang kontrol. Anda dapat memverifikasi waktu habis masa berlaku dengan menjalankan perintah sebelumnya di setiap node bidang kontrol.

  3. Jalankan perintah berikut di workstation admin untuk memeriksa waktu habis masa berlaku sertifikat klien dalam file kubeconfig cluster:

    grep 'client-certificate-data' KUBECONFIG_PATH | \
        awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
    

    Responsnya akan terlihat seperti contoh output berikut:

    Validity
        Not Before: Sep 17 22:27:53 2021 GMT
        Not After : Sep 17 22:33:16 2022 GMT
    
  4. Jalankan perintah berikut untuk mencari masa berlaku sertifikat untuk kubeconfig cluster di cluster admin:

    kubectl get secret/CLUSTER_NAME-kubeconfig \
        -n CLUSTER_NAMESPACE \
        --kubeconfig ADMIN_KUBECONFIG \
        -o jsonpath='{.data.value}' | base64 --decode | grep client-certificate-data | \
        awk '{print $2}' | base64 -d | openssl x509 -text | grep Validity -A2
    

    Ganti kode berikut:

    • ADMIN_KUBECONFIG: jalur file kubeconfig cluster admin.

    • CLUSTER_NAME: nama cluster yang sertifikatnya Anda perpanjang.

    • CLUSTER_NAMESPACE: namespace cluster yang sertifikatnya Anda perpanjang.

    Responsnya akan terlihat seperti contoh output berikut:

    Validity
        Not Before: Sep 17 22:27:53 2021 GMT
        Not After : Sep 17 22:33:16 2022 GMT
    

    Sertifikat kubeconfig di cluster admin dan sertifikat dalam file kubeconfig di workstation admin adalah sama. Oleh karena itu, output untuk perintah ini dan perintah dari langkah sebelumnya harus cocok.

Memperpanjang sertifikat secara manual

Untuk memperpanjang sertifikat TLS secara manual untuk cluster, gunakan petunjuk di bagian berikut.

Memperpanjang sertifikat di setiap node bidang kontrol

Lakukan langkah-langkah berikut pada setiap node bidang kontrol cluster yang terpengaruh:

  1. Cadangkan folder /etc/kubernetes.

  2. Jalankan perintah kubeadm berikut untuk memperpanjang semua sertifikat. Perintah ini memperpanjang sertifikat menggunakan Certificate Authority (CA) yang ada di mesin:

    sudo kubeadm certs renew all
    

    Output perintah mirip dengan contoh berikut:

    certificate embedded in the kubeconfig file for the admin to use and for kubeadm itself renewed
    certificate for serving the Kubernetes API renewed
    certificate the apiserver uses to access etcd renewed
    certificate for the API server to connect to kubelet renewed
    certificate embedded in the kubeconfig file for the controller manager to use renewed
    certificate for liveness probes to healthcheck etcd renewed
    certificate for etcd nodes to communicate with each other renewed
    certificate for serving etcd renewed
    certificate for the front proxy client renewed
    certificate embedded in the kubeconfig file for the scheduler manager to use renewed
    
  3. Pastikan sertifikat memiliki waktu habis masa berlaku baru dengan menjalankan perintah berikut:

    sudo kubeadm certs check-expiration
    
  4. Tidak semua komponen bidang kontrol mendukung pemuatan ulang sertifikat dinamis. Untuk mengambil sertifikat yang diperpanjang, langkah-langkah berikut akan memulai ulang container berikut: kube-apiserver, kube-scheduler, dan kube-controller-manager.

    Ulangi langkah-langkah berikut untuk setiap dari empat penampung:

    1. Temukan ID container untuk setiap container:

      sudo crictl ps | grep CONTAINER_NAME
      

      Ganti CONTAINER_NAME dengan nama container berikut: kube-apiserver, kube-scheduler, atau kube-controller-manager.

      Responsnya mirip dengan output berikut:

      c331ade490cb6       28df10594cd92      26 hours ago       Running          kube-apiserver ...
      

      ID penampung adalah nilai di kolom pertama.

    2. Hentikan setiap container:

      sudo crictl stop CONTAINER_ID
      

      Ganti CONTAINER_ID dengan ID penampung dari langkah sebelumnya.

      Saat container yang dihentikan keluar, kubelet akan membuat container baru di tempatnya dan menghapus container yang dihentikan. Jika Anda mengalami error, seperti context deadline exceeded (kode error DeadlineExceeded), jalankan kembali perintah tersebut.

Memastikan konektivitas telah dipulihkan

Sertifikat kubeadm sekarang akan diperpanjang di semua node bidang kontrol. Jika Anda memperpanjang sertifikat yang sudah tidak berlaku, lakukan langkah berikut:

  • Untuk memverifikasi koneksi dengan server Kubernetes API, jalankan perintah kubectl berikut di node bidang kontrol mana pun:

    kubectl get nodes --kubeconfig /etc/kubernetes/admin.conf
    

Respons akan menampilkan daftar node untuk cluster. Jika sertifikat Anda diperpanjang dengan benar, tidak ada error TLS atau sertifikat yang ditampilkan.

Memperbarui secret kubeconfig di cluster

Langkah-langkah berikut menggunakan sertifikat yang diperpanjang dari file admin.conf untuk memperbarui secret kubeconfig untuk cluster Anda. Namun, konten file admin.conf yang diperbarui tidak dapat digunakan apa adanya. Anda harus membuat salinan file admin.conf dengan beberapa pengeditan yang diperlukan terlebih dahulu.

Untuk mengupdate kubeconfig baru ke secret, lakukan langkah-langkah berikut pada node bidang kontrol:

  1. Gunakan sed untuk mengganti kubernetes dalam file admin.conf dengan nama cluster Anda dan tulis perubahan ke file baru, kubeconfig_secret.conf:

    sed "s/kubernetes/CLUSTER_NAME/g" \
        /etc/kubernetes/admin.conf > /etc/kubernetes/kubeconfig_secret.conf
    
  2. Gunakan diff untuk mengonfirmasi bahwa file kubeconfig_secret.conf telah diperbarui:

    diff /etc/kubernetes/admin.conf /etc/kubernetes/kubeconfig_secret.conf
    

    Respons akan menampilkan semua tempat di mana file kubeconfig_secret.conf berbeda dengan file admin.conf yang diperbarui. Misalnya, jika Anda melakukan langkah sebelumnya untuk cluster bernama demo-cluster, output-nya akan terlihat seperti berikut:

    6c6
    <   name: kubernetes
    ---
    >   name: demo-cluster
    9,12c9,12
    <     cluster: kubernetes
    <     user: kubernetes-admin
    <   name: kubernetes-admin@kubernetes
    < current-context: kubernetes-admin@kubernetes
    ---
    >     cluster: demo-cluster
    >     user: demo-cluster-admin
    >   name: demo-cluster-admin@demo-cluster
    > current-context: demo-cluster-admin@demo-cluster
    16c16
    < - name: kubernetes-admin
    ---
    > - name: demo-cluster-admin
    
  3. Jalankan perintah berikut untuk mengupdate secret kubeconfig di cluster Anda:

    CLUSTER_KUBECONFIG_BASE64=$(base64 /etc/kubernetes/kubeconfig_secret.conf -w 0)
    
    kubectl get secret/CLUSTER_NAME-kubeconfig \
        -n CLUSTER_NAMESPACE \
        --kubeconfig /etc/kubernetes/admin.conf -o json | jq \
        --arg conf "${CLUSTER_KUBECONFIG_BASE64}" '.data."value" |= $conf' | kubectl apply \
        --kubeconfig /etc/kubernetes/admin.conf -f -
    

Mengganti file kubeconfig cluster

Untuk mengganti file kubeconfig untuk cluster Anda dengan file yang memiliki sertifikat yang diperpanjang, gunakan langkah-langkah berikut:

  1. Salin file admin.conf dari salah satu node bidang kontrol cluster ke workstation admin.

    Seperti yang disebutkan di bagian sebelumnya, file admin.conf dapat ditemukan di direktori etc/kubernetes pada node bidang kontrol cluster.

  2. Untuk membuat file kubeconfig baru, jalankan perintah kubectl berikut di workstation admin:

    kubectl --kubeconfig ADMIN_CONF_PATH get secret/CLUSTER_NAME-kubeconfig  \
        -n "CLUSTER_NAMESPACE" -o jsonpath='{.data.value}'  | \
        base64 --decode > new_kubeconfig.conf
    

    Ganti kode berikut:

    • ADMIN_CONF_PATH: jalur file admin.conf yang telah disalin ke workstation admin dari node bidang kontrol.

    • CLUSTER_NAME: nama cluster yang sertifikatnya Anda perpanjang.

    • CLUSTER_NAMESPACE: namespace cluster yang sertifikatnya Anda perpanjang.

    File new_kubeconfig.conf berisi data sertifikat yang diperbarui.

  3. Pastikan kubeconfig baru berfungsi dengan menjalankan perintah kubectl apa pun, menggunakan kredensial baru:

    kubectl get nodes --kubeconfig new_kubeconfig.conf
    
  4. Ganti konten file kubeconfig lama yang disimpan di direktori cluster di workstation admin dengan konten file kubeconfig baru new-kubeconfig.conf.

    Secara default, jalur ke file konfigurasi cluster adalah bmctl-workspace/CLUSTER_NAME/CLUSTER_NAME-kubeconfig.

Memverifikasi sertifikat kubelet dan memulai ulang etcd-defrag

Untuk menyelesaikan proses perpanjangan sertifikat cluster secara manual, lakukan langkah-langkah berikut untuk setiap node bidang kontrol:

  1. Login ke node bidang kontrol dan verifikasi waktu habis masa berlaku sertifikat klien dan penyajian kubelet dengan menjalankan perintah berikut:

    Sertifikat kubelet dirotasi secara otomatis selama bidang kontrol dapat dijangkau. Periode perpanjangan otomatis sertifikat kubelet lebih singkat daripada periode habis masa berlaku sertifikat komponen bidang kontrol. Oleh karena itu, kemungkinan sertifikat kubelet telah diperpanjang sebelum:

    sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-client-current.pem -text | grep Validity -A2
    sudo openssl x509 -in /var/lib/kubelet/pki/kubelet-server-current.pem -text | grep Validity -A2
    

    Output dari salah satu perintah akan terlihat seperti contoh berikut:

    Validity
        Not Before: Nov 28 18:04:57 2022 GMT
        Not After : Nov 28 19:04:57 2023 GMT
    
  2. Gunakan perintah berikut untuk memulai ulang container etcd-defrag:

    Container etcd-defrag menggunakan sertifikat klien apiserver-etcd untuk berkomunikasi dengan etcd dan harus dimulai ulang untuk mengambil sertifikat yang diperbarui.

    kubectl rollout restart daemonset etcd-defrag -n kube-system --kubeconfig KUBECONFIG_PATH
    

Setelah Anda menyelesaikan langkah-langkah manual ini untuk memperpanjang sertifikat cluster, pastikan semua Pod berjalan dengan benar dan tidak ada error TLS yang dilaporkan untuk container bidang kontrol.

Langkah berikutnya

Jika Anda memerlukan bantuan tambahan, hubungi Cloud Customer Care. Anda juga dapat melihat Mendapatkan dukungan untuk mengetahui informasi selengkapnya tentang referensi dukungan, termasuk referensi berikut:

  • Persyaratan untuk membuka kasus dukungan.
  • Alat untuk membantu Anda memecahkan masalah, seperti konfigurasi lingkungan, log, dan metrik.
  • Komponen yang didukung.