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.requestsdanresources.limitsdalam spesifikasi Pod. - Untuk workload yang menentukan resource untuk setiap container, tetapkan nilai yang sama untuk
resources.requestsdanresources.limitsdalam spesifikasi setiap container di Pod, termasuk container init.
- Untuk workload yang
menentukan resource di tingkat Pod,
tetapkan nilai yang sama untuk
Untuk mengonfigurasi persyaratan ini, ikuti langkah-langkah berikut:
Untuk memilih node yang mengaktifkan cgroup yang dapat ditulis, tambahkan label
node.gke.io/enable-writable-cgroups: "true"ke kolomspec.nodeSelectordalam spesifikasi Pod Anda:node.gke.io/enable-writable-cgroups: "true"Untuk mengaktifkan cgroup yang dapat ditulis untuk beban kerja Anda, tambahkan salah satu label berikut ke kolom
metadata.annotationsdalam 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_NAMEdengan nama container.
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:
- Identifikasi Pod yang ingin Anda periksa. Anda dapat menggunakan salah satu contoh Pod dari bagian Menggunakan cgroup yang dapat ditulis dalam workload.
Buat sesi shell di Pod:
kubectl exec -it POD_NAME -- /bin/shGanti
POD_NAMEdengan nama Pod.Jelaskan sistem file cgroup yang terpasang:
mount | grep cgroupOutputnya mirip dengan hal berikut ini:
cgroup on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)Dalam output ini,
rwmenunjukkan bahwa sistem file dapat ditulis. Jika Anda melihatrodi output, sistem file bersifat hanya baca.