Bermigrasi dari Docker ke image node containerd


Halaman ini menunjukkan cara memigrasikan node pool dan cluster Standard Google Kubernetes Engine (GKE) ke image node yang menggunakan runtime container di containerd.

Ringkasan

Node Kubernetes menggunakan runtime container untuk meluncurkan, mengelola, dan menghentikan container yang berjalan di Pod. Runtime container adalah runtime container standar industri yang didukung oleh GKE.

Runtime containerd menyediakan abstraksi lapisan yang memungkinkan implementasi serangkaian fitur seperti gVisor dan Streaming image untuk memperluas fungsi GKE. Runtime containerd dianggap lebih hemat resource dan aman daripada runtime Docker.

Untuk memigrasikan runtime container:

  • Mengidentifikasi node yang menggunakan runtime Docker
  • Memastikan dampak migrasi
  • Mengubah image node

Sebelum memulai

Sebelum memulai, pastikan Anda telah menjalankan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu initialize gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan gcloud components update.

Mengidentifikasi node yang menggunakan runtime Docker

Anda dapat memeriksa node mana yang menggunakan image node berbasis Docker dengan metode berikut:

  • Gunakan skrip untuk melakukan iterasi pada semua node di semua cluster GKE di seluruh project Google Cloud Anda.
  • Gunakan Google Cloud CLI, kubectl, atau konsol Google Cloud untuk mengidentifikasi image node.
  • Gunakan insight dan rekomendasi yang tidak digunakan lagi untuk mengidentifikasi cluster dan node di zona atau region tertentu dalam project Google Cloud.

Sebaiknya gunakan skrip untuk mengidentifikasi dengan cepat semua node yang perlu Anda migrasikan.

Menggunakan skrip untuk mengidentifikasi node Docker

Skrip berikut melakukan iterasi pada setiap node di setiap cluster dalam project yang tersedia dan memberi Anda rekomendasi yang dapat ditindaklanjuti, seperti:

  • Apakah penyediaan otomatis node dikonfigurasi untuk image Docker
  • Image node containerd yang disarankan untuk migrasi
  • Versi image node yang disarankan untuk migrasi
  • Perintah yang disarankan untuk dijalankan guna memigrasikan node dan setelan yang diidentifikasi

Skrip tersebut mengabaikan cluster GKE Autopilot, yang menggunakan Container-Optimized OS dengan image node containerd secara default.

Jalankan skrip berikut:

for project in $(gcloud projects list --format="value(projectId)")
do
  echo "ProjectId: $project"
  for clusters in $( \
    gcloud container clusters list \
      --project $project \
      --format="csv[no-heading](name,location,autopilot.enabled,currentMasterVersion,autoscaling.enableNodeAutoprovisioning,autoscaling.autoprovisioningNodePoolDefaults.imageType)")
  do
    IFS=',' read -r -a clustersArray <<< "$clusters"
    cluster_name="${clustersArray[0]}"
    cluster_zone="${clustersArray[1]}"
    cluster_isAutopilot="${clustersArray[2]}"
    cluster_version="${clustersArray[3]}"
    cluster_minorVersion=${cluster_version:0:4}
    cluster_autoprovisioning="${clustersArray[4]}"
    cluster_autoprovisioningImageType="${clustersArray[5]}"

    if [ "$cluster_isAutopilot" = "True" ]; then
      echo "  Cluster: $cluster_name (autopilot) (zone: $cluster_zone)"
      echo "    Autopilot clusters are running Containerd."
    else
      echo "  Cluster: $cluster_name (zone: $cluster_zone)"

      if [ "$cluster_autoprovisioning" = "True" ]; then
        if [ "$cluster_minorVersion"  \< "1.20" ]; then
          echo "    Node autoprovisioning is enabled, and new node pools will have image type 'COS'."
          echo "    This settings is not configurable on the current version of a cluster."
          echo "    Please upgrade you cluster and configure the default node autoprovisioning image type."
          echo "    "
        else
          if [ "$cluster_autoprovisioningImageType" = "COS" ]; then
            echo "    Node autoprovisioning is configured to create new node pools of type 'COS'."
            echo "    Run the following command to update:"
            echo "    gcloud container clusters update '$cluster_name' --project '$project' --zone '$cluster_zone' --enable-autoprovisioning --autoprovisioning-image-type='COS_CONTAINERD'"
            echo "    "
          fi

          if [ "$cluster_autoprovisioningImageType" = "UBUNTU" ]; then
            echo "    Node autoprovisioning is configured to create new node pools of type 'UBUNTU'."
            echo "    Run the following command to update:"
            echo "    gcloud container clusters update '$cluster_name' --project '$project' --zone '$cluster_zone' --enable-autoprovisioning --autoprovisioning-image-type='UBUNTU_CONTAINERD'"
            echo "    "
          fi
        fi
      fi

      for nodepools in $( \
        gcloud container node-pools list \
          --project $project \
          --cluster $cluster_name \
          --zone $cluster_zone \
          --format="csv[no-heading](name,version,config.imageType)")
      do
        IFS=',' read -r -a nodepoolsArray <<< "$nodepools"
        nodepool_name="${nodepoolsArray[0]}"
        nodepool_version="${nodepoolsArray[1]}"
        nodepool_imageType="${nodepoolsArray[2]}"

        nodepool_minorVersion=${nodepool_version:0:4}

        echo "    Nodepool: $nodepool_name, version: $nodepool_version ($nodepool_minorVersion), image: $nodepool_imageType"

        minorVersionWithRev="${nodepool_version/-gke./.}"
        linuxGkeMinVersion="1.14"
        windowsGkeMinVersion="1.21.1.2200"

        suggestedImageType="COS_CONTAINERD"

        if [ "$nodepool_imageType" = "UBUNTU" ]; then
          suggestedImageType="UBUNTU_CONTAINERD"
        elif [ "$nodepool_imageType" = "WINDOWS_LTSC" ]; then
          suggestedImageType="WINDOWS_LTSC_CONTAINERD"
        elif [ "$nodepool_imageType" = "WINDOWS_SAC" ]; then
          suggestedImageType="WINDOWS_SAC_CONTAINERD"
        fi

        tab=$'\n      ';
        nodepool_message="$tab Please update the nodepool to use Containerd."
        nodepool_message+="$tab Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues."
        nodepool_message+="$tab Run the following command to upgrade:"
        nodepool_message+="$tab "
        nodepool_message+="$tab gcloud container clusters upgrade '$cluster_name' --project '$project' --zone '$cluster_zone' --image-type '$suggestedImageType' --node-pool '$nodepool_name'"
        nodepool_message+="$tab "

        # see https://cloud.google.com/kubernetes-engine/docs/concepts/node-images
        if [ "$nodepool_imageType" = "COS_CONTAINERD" ] || [ "$nodepool_imageType" = "UBUNTU_CONTAINERD" ] ||
           [ "$nodepool_imageType" = "WINDOWS_LTSC_CONTAINERD" ] || [ "$nodepool_imageType" = "WINDOWS_SAC_CONTAINERD" ]; then
          nodepool_message="$tab Nodepool is using Containerd already"
        elif ( [ "$nodepool_imageType" = "WINDOWS_LTSC" ] || [ "$nodepool_imageType" = "WINDOWS_SAC" ] ) &&
               [ "$(printf '%s\n' "$windowsGkeMinVersion" "$minorVersionWithRev" | sort -V | head -n1)" != "$windowsGkeMinVersion" ]; then
          nodepool_message="$tab Upgrade nodepool to the version that supports Containerd for Windows"
        elif [ "$(printf '%s\n' "$linuxGkeMinVersion" "$minorVersionWithRev" | sort -V | head -n1)" != "$linuxGkeMinVersion" ]; then
          nodepool_message="$tab Upgrade nodepool to the version that supports Containerd"
        fi
        echo "$nodepool_message"
      done
    fi # not autopilot
  done
done

# Sample output:
#
# ProjectId:  my-project-id
#  Cluster: autopilot-cluster-1 (autopilot) (zone: us-central1)
#    Autopilot clusters are running Containerd.
#  Cluster: cluster-1 (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'default-pool'
#
#    Nodepool: pool-1, version: 1.18.12-gke.1210 (1.18), image: COS
#
#       Please update the nodepool to use Containerd.
#       Make sure to consult with the list of known issues https://cloud.google.com/kubernetes-engine/docs/concepts/using-containerd#known_issues.
#       Run the following command to upgrade:
#
#       gcloud container clusters upgrade 'cluster-1' --project 'my-project-id' --zone 'us-central1-c' --image-type 'COS_CONTAINERD' --node-pool 'pool-1'
#
#    Nodepool: winpool, version: 1.18.12-gke.1210 (1.18), image: WINDOWS_SAC
#
#       Upgrade nodepool to the version that supports Containerd for Windows
#
#  Cluster: another-test-cluster (zone: us-central1-c)
#    Nodepool: default-pool, version: 1.20.4-gke.400 (1.20), image: COS_CONTAINERD
#
#      Nodepool is using Containerd already
#

Mengidentifikasi image node menggunakan Google Cloud

Anda dapat memeriksa image node untuk node yang sudah ada menggunakan Google Cloud CLI, kubectl, atau konsol Google Cloud.

gcloud

Jalankan perintah berikut:

gcloud container node-pools list \
    --cluster=CLUSTER_NAME \
    --format="table(name,version,config.imageType)"

Ganti CLUSTER_NAME dengan nama cluster Anda.

Outputnya mirip dengan yang berikut ini:

NAME          NODE_VERSION    IMAGE_TYPE
default-pool  1.19.6-gke.600  UBUNTU

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diverifikasi.

  3. Pilih tab Node.

  4. Di bagian Node pool, periksa nilai di kolom Jenis image.

kubectl

Jalankan perintah berikut:

kubectl get nodes -o wide

Outputnya mirip dengan hal berikut ini:

# For Docker runtime
NAME         STATUS   VERSION             OS-IMAGE                             CONTAINER-RUNTIME
gke-node-1   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-2   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1
gke-node-3   Ready    v1.16.15-gke.6000   Container-Optimized OS from Google   docker://19.3.1

Nilai di kolom CONTAINER-RUNTIME menunjukkan runtime dan versi.

Mengidentifikasi cluster menggunakan insight dan rekomendasi yang tidak digunakan lagi

GKE mendeteksi penggunaan beberapa fitur dan API yang tidak digunakan lagi, termasuk image node berbasis Docker. Untuk mempelajari lebih lanjut, lihat penghentian penggunaan GKE.

Sebagai bagian dari deteksi penghentian penggunaan, GKE menghasilkan insight dan rekomendasi yang mengidentifikasi penggunaan image node berbasis Docker dengan subjenis insight DEPRECATION_K8S_1_24_DOCKERSHIM.

Sebuah penghubung insight dan rekomendasi mengidentifikasi cluster yang memiliki node yang menggunakan image node berbasis Docker. Setiap insight dan rekomendasi menyediakan daftar node pool tertentu di cluster yang menggunakan image node berbasis Docker dan harus dimigrasikan ke image node containerd.

Untuk memulai, ikuti petunjuk untuk melihat insight dan rekomendasi yang tidak digunakan lagi. Untuk perintah gcloud CLI, gunakan flag berikut untuk melihat insight penghentian penggunaan ini:

--filter="insightSubtype:DEPRECATION_K8S_1_24_DOCKERSHIM"

Setelah mengidentifikasi node pool cluster mana yang menggunakan image node berbasis Docker, ikuti petunjuk untuk mengubah image node ke image node containerd.

Memastikan dampak migrasi

Sebelum memigrasikan cluster produksi dan node pool ke image node yang menggunakan containerd, sebaiknya uji dampak migrasi di lingkungan staging untuk meminimalkan risiko masalah.

Anda sebaiknya mengupgrade node secara mandiri saat memigrasikan node, sehingga Anda dapat memisahkan variabel saat memverifikasi fungsi workload dengan konfigurasi baru. Selain itu, jika Anda mengupgrade node pool ke versi 1.24 secara bersamaan, Anda tidak dapat melakukan roll back perubahan karena versi 1.24 tidak mendukung node Docker dan Anda tidak dapat mendowngrade versi minor.

Mengubah image node menjadi image containerd

Jika menggunakan skrip untuk mengidentifikasi node Docker, Anda dapat menggunakan perintah yang disarankan yang ditampilkan oleh skrip untuk mengubah setelan penyediaan otomatis node dan image node ke containerd yang setara.

Anda juga dapat memigrasikan node dari jenis image Docker ke jenis image containerd dengan memperbarui node pool dan menetapkan image yang berbeda menggunakan gcloud CLI atau konsol Google Cloud.

GKE menggunakan strategi upgrade node dan konfigurasi yang dipilih untuk memigrasikan image node. Untuk migrasi ini, sebaiknya gunakan strategi upgrade blue-green karena jika beban kerja Anda mengalami masalah dengan image node baru selama upgrade, Anda dapat roll back ke lingkungan sebelumnya dengan konfigurasi image node asli.

gcloud

Jalankan perintah berikut:

gcloud container clusters upgrade CLUSTER_NAME \
    --image-type=NODE_IMAGE \
    --node-pool=POOL_NAME \
    --cluster-version=NODE_VERSION

Ganti kode berikut:

  • NODE_IMAGE: image node yang Anda ingin node gunakan.
  • POOL_NAME: nama node pool yang akan dimigrasikan.
  • NODE_VERSION: versi node pool yang sudah ada. Sebaiknya setel flag ini karena jika tidak, GKE akan mencoba mengupgrade versi node pool ke versi bidang kontrol dan memperbarui image node dalam operasi yang sama. Jika bidang kontrol menjalankan versi 1.24, perintah akan gagal. Jika bidang kontrol menjalankan versi 1.23, perintah akan berhasil, sehingga Anda tidak dapat menguji dua perubahan (upgrade versi dan update image) secara terpisah.

Outputnya mirip dengan hal berikut ini:

NAME          NODE_VERSION    IMAGE_TYPE
default-pool  1.23.6-gke.600  UBUNTU_CONTAINERD

Konsol

  1. Buka halaman Google Kubernetes Engine di konsol Google Cloud.

    Buka Google Kubernetes Engine

  2. Di daftar cluster, klik nama cluster yang ingin diverifikasi.

  3. Klik tab Node.

  4. Di bagian Node pool, klik nama node pool yang ingin Anda ubah.

  5. Di halaman Detail node pool, klik Edit.

  6. Di bagian Node, di bagian Jenis image, klik Ubah.

  7. Pilih salah satu jenis image containerd.

  8. Klik Ubah.

Melakukan roll back ke image node Docker

Jika node Anda dimigrasikan secara otomatis atau manual ke node containerd dan melihat masalah dengan workload, lakukan langkah berikut untuk kembali ke image node Docker:

  1. Pilih langkah berikut berdasarkan status operasi:
  2. Konfigurasikan pengecualian pemeliharaan agar mencegah GKE mencoba kembali migrasi untuk sementara.
  3. Selidiki penyebab utama masalah sehingga Anda dapat bermigrasi dari Docker dan pastikan cluster menjalankan versi GKE yang didukung.
  4. Coba lagi untuk mengubah image node ke image containerd. Jika Anda menghapus pengecualian pemeliharaan, GKE akan memicu operasi kembali.

Memperbarui konfigurasi alat Infrastructure as Code (IaC)

Jika menggunakan alat IaC seperti Terraform, Ansible, atau Pulumi untuk mengelola cluster GKE, pastikan Anda memperbarui konfigurasi untuk menggunakan image node containerd agar alat tersebut tidak merekonsiliasi status yang sebelumnya diinginkan dengan kondisi baru yang sebenarnya. Misalnya, penyedia Terraform GKE mendukung jenis image yang dapat dikonfigurasi.

Perbarui konfigurasi apa pun agar alat ini tidak memperbarui image node kembali ke image node berbasis Docker setelah Anda bermigrasi ke image node containerd.

Mengubah image node default untuk penyediaan otomatis node

Jika Anda menggunakan penyediaan otomatis node di cluster Anda, ubah jenis image default menjadi image node containerd. Perubahan pada jenis gambar default hanya berlaku untuk node pool baru yang disediakan secara otomatis. Anda harus mengubah image node secara manual untuk node pool yang disediakan secara otomatis.

Anda dapat mengubah jenis image penyediaan otomatis node default menggunakan gcloud CLI atau file konfigurasi.

gcloud

Jalankan perintah berikut:

gcloud container clusters update CLUSTER_NAME \
    --enable-autoprovisioning \
    --autoprovisioning-image-type=IMAGE_TYPE

Ganti kode berikut:

  • CLUSTER_NAME: nama cluster yang akan diperbarui.
  • IMAGE_TYPE: jenis image node, yang dapat berupa salah satu dari berikut ini:

    • cos_containerd
    • ubuntu_containerd

File

Anda dapat menggunakan file konfigurasi YAML untuk mengubah jenis image node default untuk penyediaan otomatis node. Saat menggunakan file, Anda juga harus menentukan nilai maksimum untuk resource CPU dan memori.

  1. Simpan file YAML berikut:

    resourceLimits:
      - resourceType: 'cpu'
          minimum: 4
          maximum: 10
      - resourceType: 'memory'
          maximum: 64
    autoprovisioningNodePoolDefaults:
      imageType: 'IMAGE_TYPE'
    

    Ganti IMAGE_TYPE dengan jenis image containerd.

  2. Terapkan konfigurasi:

    gcloud container clusters update CLUSTER_NAME \
        --enable-autoprovisioning \
        --autoprovisioning-config-file=FILE_NAME
    

    Ganti FILE_NAME dengan jalur ke file konfigurasi.

Pemecahan masalah

Untuk pemecahan masalah dan masalah umum dengan solusi, lihat Pemecahan masalah runtime container.

Langkah selanjutnya