Mengonfigurasi cgroup yang dapat ditulis untuk container

Anda dapat mengizinkan workload Google Kubernetes Engine (GKE) mengelola resource, seperti CPU dan memori, untuk proses turunan menggunakan API cgroups Linux. Dokumen ini menunjukkan cara memberi container akses baca-tulis ke cgroups API tanpa menjalankan container tersebut dalam mode istimewa.

Kapan harus menggunakan cgroup yang dapat ditulis

Secara default, Kubernetes menyediakan semua penampung Linux dengan akses hanya baca ke cgroups API dengan memasang sistem file /sys/fs/cgroup di setiap penampung. Secara opsional, Anda dapat mengizinkan GKE memasang sistem file ini dalam mode baca-tulis di Pod tertentu untuk mengizinkan proses root mengelola dan membatasi resource untuk proses turunan.

Cgroup yang dapat ditulis ini membantu meningkatkan keandalan dalam aplikasi seperti Ray yang menjalankan proses sistem dan kode pengguna dalam container yang sama. Dengan menulis ke sistem file /sys/fs/cgroup, Ray dapat mencadangkan sebagian resource penampung untuk proses penting. Anda dapat menggunakan cgroup yang dapat ditulis untuk meningkatkan keandalan di aplikasi ini tanpa risiko keamanan menggunakan mode istimewa untuk penampung.

Sebelum memulai

Sebelum memulai, pastikan Anda telah melakukan tugas berikut:

  • Aktifkan Google Kubernetes Engine API.
  • Aktifkan Google Kubernetes Engine API
  • Jika ingin menggunakan Google Cloud CLI untuk tugas ini, instal lalu lakukan inisialisasi gcloud CLI. Jika sebelumnya Anda telah menginstal gcloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update. gcloud CLI versi sebelumnya mungkin tidak mendukung menjalankan perintah dalam dokumen ini.
  • Pastikan Anda memiliki cluster Autopilot atau Standard yang menjalankan versi 1.34.1-gke.2541000 atau yang lebih baru. Untuk membuat cluster baru, lihat Membuat cluster Autopilot.
  • Pastikan cluster Anda menggunakan cgroup v2. Untuk mengetahui informasi selengkapnya, lihat artikel Memigrasikan node ke cgroup v2 Linux.

Aktifkan cgroup yang dapat ditulis untuk node Anda

Aktifkan cgroup yang dapat ditulis di node pool dengan menyesuaikan konfigurasi containerd. Anda dapat menerapkan konfigurasi ini ke seluruh cluster atau ke node pool tertentu di cluster Standard.

Di file konfigurasi containerd, tambahkan bagian writableCgroups dan tetapkan kolom enabled ke true. Untuk mengetahui informasi selengkapnya, lihat Menyesuaikan konfigurasi containerd di node GKE.

writableCgroups:
  enabled: true

Tentukan file konfigurasi yang diupdate saat Anda membuat atau mengupdate cluster atau node pool.

Menggunakan cgroup yang dapat ditulis dalam workload

Setelah mengaktifkan cgroup yang dapat ditulis untuk cluster atau node pool, konfigurasikan workload Anda agar memenuhi semua persyaratan berikut:

  • Pilih node yang mengaktifkan cgroup yang dapat ditulis.
  • Aktifkan cgroup yang dapat ditulis untuk satu atau beberapa container di Pod.
  • Gunakan kelas Kualitas Layanan (QoS) yang Dijamin dengan memenuhi salah satu kondisi berikut:

    • Untuk workload yang menentukan resource di tingkat Pod, tetapkan nilai yang sama untuk resources.requests dan resources.limits dalam spesifikasi Pod.
    • Untuk workload yang menentukan resource untuk setiap container, tetapkan nilai yang sama untuk resources.requests dan resources.limits dalam spesifikasi setiap container di Pod, termasuk container init.

Untuk mengonfigurasi persyaratan ini, ikuti langkah-langkah berikut:

  1. Untuk memilih node yang mengaktifkan cgroup yang dapat ditulis, tambahkan label node.gke.io/enable-writable-cgroups: "true" ke kolom spec.nodeSelector dalam spesifikasi Pod Anda:

    node.gke.io/enable-writable-cgroups: "true"
    
  2. Untuk mengaktifkan cgroup yang dapat ditulis untuk beban kerja Anda, tambahkan salah satu label berikut ke kolom metadata.annotations dalam spesifikasi Pod Anda:

    • Aktifkan untuk seluruh Pod:

      node.gke.io/enable-writable-cgroups: "true"
      
    • Mengaktifkan untuk container tertentu di Pod:

      node.gke.io/enable-writable-cgroups.CONTAINER_NAME: "true"
      

      Ganti CONTAINER_NAME dengan nama container.

  3. Untuk mengonfigurasi class QoS Terjamin untuk Pod Anda, tentukan permintaan dan batas CPU dan memori yang sama untuk setiap container di Pod atau untuk seluruh Pod, seperti dalam contoh berikut:

    resources:
      requests:
        cpu: "100m"
        memory: "100Mi"
      limits:
        cpu: "100m"
        memory: "100Mi"
    

    Anda harus menentukan permintaan dan batas yang sama untuk setiap container, meskipun Anda mengaktifkan cgroup yang dapat ditulis hanya untuk salah satu container di Pod.

Spesifikasi Pod akhir Anda akan mirip dengan contoh berikut.

  • Contoh ini mengaktifkan cgroup yang dapat ditulis untuk semua container dalam Pod:

    apiVersion: v1
    kind: Pod
    metadata:
      name: writable-cgroups-pod
      annotations:
        node.gke.io/enable-writable-cgroups: "true"
    spec:
      nodeSelector:
        node.gke.io/enable-writable-cgroups: "true"
      containers:
      - name: container
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
      resources:
        requests:
          cpu: "100m"
          memory: "100Mi"
        limits:
          cpu: "100m"
          memory: "100Mi"
    
  • Contoh ini mengaktifkan cgroup yang dapat ditulis untuk container tertentu dalam Pod multi-container:

    apiVersion: v1
    kind: Pod
    metadata:
      name: writable-cgroups-per-container
      annotations:
        node.gke.io/enable-writable-cgroups.busybox-container: "true"
    spec:
      nodeSelector:
        node.gke.io/enable-writable-cgroups: "true"
      containers:
      - name: busybox-container
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
          limits:
            cpu: "100m"
            memory: "100Mi"
      - name: container-disabled
        image: busybox:stable
        command: ["/bin/sh", "-c"]
        args:
        -   |
          trap 'echo "Caught SIGTERM, exiting..."; exit 0' TERM
          echo "Waiting for termination signal..."
          while true; do sleep 1; done
        resources:
          requests:
            cpu: "100m"
            memory: "100Mi"
          limits:
            cpu: "100m"
            memory: "100Mi"
    

Verifikasi bahwa sistem file cgroup dapat ditulis

Untuk memverifikasi izin pada sistem file /sys/fs/cgroup untuk Pod atau penampung, ikuti langkah-langkah berikut:

  1. Identifikasi Pod yang ingin Anda periksa. Anda dapat menggunakan salah satu contoh Pod dari bagian Menggunakan cgroup yang dapat ditulis dalam workload.
  2. Buat sesi shell di Pod:

    kubectl exec -it POD_NAME -- /bin/sh
    

    Ganti POD_NAME dengan nama Pod.

  3. Jelaskan sistem file cgroup yang terpasang:

    mount | grep cgroup
    

    Outputnya mirip dengan hal berikut ini:

    cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
    

    Dalam output ini, rw menunjukkan bahwa sistem file dapat ditulis. Jika Anda melihat ro di output, sistem file bersifat hanya baca.

Langkah berikutnya