Workload dengan hak istimewa di cluster Google Kubernetes Engine (GKE) Autopilot harus dikonfigurasi dengan benar untuk menghindari masalah. Konfigurasi yang salah dapat menyebabkan kegagalan sinkronisasi dengan daftar yang diizinkan atau menyebabkan workload ditolak. Masalah ini dapat mencegah agen atau layanan penting berjalan dengan izin yang diperlukan.
Gunakan dokumen ini untuk memecahkan masalah terkait deployment workload dengan hak istimewa di Autopilot. Temukan panduan untuk mengatasi error sinkronisasi daftar yang diizinkan dan mendiagnosis alasan workload dengan hak istimewa dapat ditolak.
Informasi ini penting bagi admin dan operator Platform serta tim keamanan yang men-deploy workload dengan izin yang ditingkatkan di cluster Autopilot. Untuk mengetahui informasi selengkapnya tentang peran umum dan contoh tugas yang kami referensikan dalam Google Cloud konten, lihat Peran dan tugas pengguna GKE umum.
Masalah sinkronisasi daftar yang diizinkan
Saat Anda men-deploy AllowlistSynchronizer, GKE akan mencoba menginstal dan menyinkronkan file daftar yang diizinkan yang Anda tentukan. Jika sinkronisasi ini gagal, kolom status AllowlistSynchronizer akan melaporkan error.
Dapatkan status objek AllowlistSynchronizer:
kubectl get allowlistsynchronizer ALLOWLIST_SYNCHRONIZER_NAME -o yaml
Ganti ALLOWLIST_SYNCHRONIZER_NAME dengan nama AllowlistSynchronizer.
Outputnya mirip dengan hal berikut ini:
...
status:
conditions:
- type: Ready
status: "False"
reason: "SyncError"
message: "some allowlists failed to sync: example-allowlist-1.yaml"
lastTransitionTime: "2024-10-12T10:00:00Z"
observedGeneration: 2
managedAllowlistStatus:
- filePath: "gs://path/to/allowlist1.yaml"
generation: 1
phase: Installed
lastSuccessfulSync: "2024-10-10T10:00:00Z"
- filePath: "gs://path/to/allowlist2.yaml"
phase: Failed
lastError: "Initial install failed: invalid contents"
lastSuccessfulSync: "2024-10-08T10:00:00Z"
Kolom conditions.message dan kolom managedAllowlistStatus.lastError memberikan informasi mendetail tentang error tersebut. Gunakan informasi ini untuk mengatasi masalah tersebut.
Beberapa AllowlistSynchronizer
Di cluster GKE pada versi sebelum 1.33.4-gke.1035000, WorkloadAllowlists mungkin gagal diinstal jika ada lebih dari satu AllowlistSynchronizer.
Untuk mengatasi masalah ini, gunakan hanya satu AllowlistSynchronizer yang berisi beberapa allowlistPaths.
Atau, Anda dapat mengupgrade cluster ke versi yang lebih baru.
Pengurutan container workload
Di cluster GKE pada versi sebelum 1.34.0-gke.0000000, jika satu atau beberapa image container workload cocok dengan image container yang ditentukan dalam WorkloadAllowlist dalam cluster, container workload mungkin dibuat dan diurutkan dalam urutan abjad terbalik.
Untuk mengatasi masalah ini, coba opsi berikut:
- Upgrade cluster Anda ke versi 1.34.0-gke.0000000 atau yang lebih baru.
- Ganti nama container workload Anda sehingga diurutkan dalam urutan yang benar.
Masalah deployment workload dengan hak istimewa
Setelah berhasil menginstal daftar yang diizinkan, Anda men-deploy workload dengan hak istimewa yang sesuai di cluster Anda. Dalam beberapa kasus, GKE mungkin menolak workload.
Coba opsi resolusi berikut:
- Pastikan versi GKE cluster Anda memenuhi persyaratan versi workload.
- Pastikan workload yang Anda deploy adalah workload yang berlaku untuk file daftar yang diizinkan.
Untuk melihat alasan workload dengan hak istimewa ditolak, minta informasi mendetail dari GKE tentang pelanggaran daftar yang diizinkan:
Dapatkan daftar daftar yang diizinkan yang diinstal di cluster:
kubectl get workloadallowlistTemukan nama daftar yang diizinkan yang harus diterapkan ke workload dengan hak istimewa.
Buka manifes YAML workload dengan hak istimewa di editor teks. Jika Anda tidak dapat mengakses manifes YAML, misalnya jika proses deployment workload menggunakan alat lain, hubungi penyedia workload untuk membuka masalah. Lewati langkah-langkah yang tersisa.
Tambahkan label berikut ke bagian
spec.metadata.labelsspesifikasi Pod workload dengan hak istimewa:labels: cloud.google.com/matching-allowlist: ALLOWLIST_NAMEGanti
ALLOWLIST_NAMEdengan nama daftar yang diizinkan yang Anda dapatkan pada langkah sebelumnya. Gunakan nama dari output perintahkubectl get workloadallowlist, bukan jalur ke file daftar yang diizinkan.Simpan manifes dan terapkan workload ke cluster:
kubectl apply -f WORKLOAD_MANIFEST_FILEGanti
WORKLOAD_MANIFEST_FILEdengan jalur ke file manifes.Output memberikan informasi mendetail tentang kolom mana dalam workload yang tidak cocok dengan daftar yang diizinkan yang ditentukan, seperti dalam contoh berikut:
Error from server (GKE Warden constraints violations): error when creating "STDIN": admission webhook "warden-validating.common-webhooks.networking.gke.io" denied the request: =========================================================================== Workload Mismatches Found for Allowlist (example-allowlist-1): =========================================================================== HostNetwork Mismatch: Workload=true, Allowlist=false HostPID Mismatch: Workload=true, Allowlist=false Volume[0]: data - data not found in allowlist. Verify volume with matching name exists in allowlist. Container[0]: - Envs Mismatch: - env[0]: 'ENV_VAR1' has no matching string or regex pattern in allowlist. - env[1]: 'ENV_VAR2' has no matching string or regex pattern in allowlist. - Image Mismatch: Workload=k8s.gcr.io/diff/image, Allowlist=k8s.gcr.io/pause2. Verify that image string or regex match. - SecurityContext: - Capabilities.Add Mismatch: the following added capabilities are not permitted by the allowlist: [SYS_ADMIN SYS_PTRACE] - VolumeMount[0]: data - data not found in allowlist. Verify volumeMount with matching name exists in allowlist.Dalam contoh ini, pelanggaran berikut terjadi:
- Workload menentukan
hostNetwork: true, tetapi daftar yang diizinkan tidak menentukanhostNetwork: true. - Workload menentukan
hostPID: true, tetapi daftar yang diizinkan tidak menentukanhostPID: true. - Workload menentukan volume bernama
data, tetapi daftar yang diizinkan tidak menentukan volume bernamadata. - Container menentukan variabel lingkungan bernama
ENV_VAR1danENV_VAR2, tetapi daftar yang diizinkan tidak menentukan variabel lingkungan ini. - Container menentukan image
k8s.gcr.io/diff/image, tetapi daftar yang diizinkan menentukank8s.gcr.io/pause2. - Container menambahkan kemampuan
SYS_ADMINdanSYS_PTRACE, tetapi daftar yang diizinkan tidak mengizinkan penambahan kemampuan ini. - Container menentukan pemasangan volume bernama
data, tetapi daftar yang diizinkan tidak menentukan pemasangan volume bernamadata.
- Workload menentukan
Jika Anda men-deploy workload yang dimiliki oleh penyedia pihak ketiga, buka masalah dengan penyedia tersebut untuk mengatasi pelanggaran. Berikan output dari langkah sebelumnya dalam masalah tersebut.
Versi GKE yang tidak kompatibel
GKE mungkin menolak workload jika daftar yang diizinkan menentukan versi GKE minimum yang lebih baru dari versi GKE cluster.
Periksa apakah daftar yang diizinkan menentukan versi GKE minimum:
kubectl describe workloadallowlist ALLOWLIST_NAME | grep "minGKEVersion"Ganti
ALLOWLIST_NAMEdengan nama daftar yang diizinkan.Jika output kosong, daftar yang diizinkan tidak menentukan versi GKE minimum. Lewati bagian ini. Jika output adalah nilai, daftar yang diizinkan menentukan versi GKE minimum.
Periksa versi GKE cluster:
gcloud container clusters describe CLUSTER_NAME \ --location=CLUSTER_LOCATION \ --format="value(currentMasterVersion)"Ganti kode berikut:
CLUSTER_NAME: nama cluster.CLUSTER_LOCATION: lokasi Google Cloud cluster.
Outputnya mirip dengan hal berikut ini:
1.32.3-gke.1006000Jika versi GKE cluster lebih lama dari versi GKE minimum daftar yang diizinkan, upgrade cluster ke versi GKE minimum daftar yang diizinkan atau yang lebih baru. Untuk mengetahui informasi selengkapnya, lihat Mengupgrade cluster.
Setelah upgrade selesai, coba deploy workload ke cluster.
String tidak cocok
Kolom tertentu dalam spesifikasi WorkloadAllowlist harus cocok dengan string yang sama persis dengan kolom yang sesuai dalam spesifikasi workload.
- Buka halaman referensi WorkloadAllowlist CustomResourceDefinition (CRD).
- Untuk setiap kolom dalam spesifikasi WorkloadAllowlist, periksa apakah CRD memerlukan kecocokan string yang sama persis.
Untuk setiap kolom yang memerlukan kecocokan string yang sama persis, periksa apakah nilai dalam spesifikasi WorkloadAllowlist cocok dengan nilai yang sesuai dalam spesifikasi workload.
Misalnya, setiap perintah yang dijalankan container harus cocok dengan perintah dalam daftar yang diizinkan. Setiap penyimpangan dari perintah yang sama persis akan menyebabkan penolakan.
Jika ada ketidakcocokan, perbarui spesifikasi WorkloadAllowlist agar cocok dengan spesifikasi workload Anda.
Ekspresi reguler tidak cocok
Kolom tertentu dalam spesifikasi WorkloadAllowlist mendukung pencocokan ekspresi reguler.
- Dalam spesifikasi WorkloadAllowlist, temukan kolom yang menentukan ekspresi reguler.
Pastikan sintaksis ekspresi reguler sudah benar. WorkloadAllowlist CRD mendukung sintaksis ekspresi reguler Google RE2. Pastikan ekspresi Anda memiliki properti berikut:
- Ekspresi reguler dimulai dengan karakter
^dan diakhiri dengan karakter$. Misalnya,^example-auth\.google\.com\/go_[a-z0-9]+\/google\/path$. - Setiap karakter khusus di-escape dengan karakter escape
\. Cari karakter\tambahan atau yang tidak ada. - Jalur image dalam daftar yang diizinkan tidak menyertakan tag atau ringkasan. Misalnya,
gunakan
k8s.gcr.io/pausedan bukank8s.gcr.io/pause:3.1atauk8s.gcr.io/pause@sha256:1234567890.
- Ekspresi reguler dimulai dengan karakter
Setelah Anda memperbaiki masalah ekspresi reguler, coba deploy workload ke cluster.
Karakter escape dalam perintah dan argumen
GKE tidak dapat mencocokkan perintah dan argumen jika Anda tidak meng-escape karakter khusus. Persyaratan untuk meng-escape karakter bergantung pada cara Anda menerapkan daftar yang diizinkan. Misalnya, menerapkan daftar yang diizinkan sebagai file YAML atau JSON memiliki persyaratan escape yang berbeda dengan membuat spesifikasi daftar yang diizinkan menggunakan alat command line. Bagian ini menjelaskan persyaratan escape untuk file YAML.
Escape setiap karakter khusus di kolom commands dan args spesifikasi WorkloadAllowlist, meskipun Anda tidak menggunakan ekspresi reguler.
Untuk meng-escape karakter khusus, gunakan karakter \, seperti dalam contoh berikut:
- Perintah:
kubectl describe \$\{POD_NAME\} - Argumen:
hostname \$NODE_NAME; dcgm-exporter --remote-hostengine-info \$\(NODE_IP\) --collectors /etc/dcgm-exporter/counters.csv
Webhook mengganggu workload dalam daftar yang diizinkan
Dalam beberapa kasus, meskipun workload dikonfigurasi dengan benar agar cocok dengan daftar yang diizinkan, workload tersebut mungkin masih ditolak oleh GKE. Situasi ini dapat terjadi jika pengontrol penerimaan (webhook) lain di cluster Anda mengubah Pod yang dibuat oleh pengontrol workload setelah diizinkan oleh daftar yang diizinkan. Perubahan ini dapat menyebabkan spesifikasi Pod tidak lagi cocok dengan daftar yang diizinkan, sehingga menyebabkan penolakan oleh webhook penerimaan GKE Warden.
Masalah ini umum terjadi pada agen pemantauan dan keamanan pihak ketiga yang menyuntikkan container sidecar atau variabel lingkungan ke dalam Pod.
Gejala yang paling umum adalah pengontrol workload Anda (seperti DaemonSet atau Deployment) berhasil dibuat, tetapi gagal membuat Pod. Saat memeriksa peristiwa pengontrol, Anda akan melihat pesan yang menunjukkan bahwa Pod ditolak oleh webhook penerimaan.
- Ikuti langkah-langkah di bagian Masalah deployment workload dengan hak istimewa
untuk menambahkan label
cloud.google.com/matching-allowlistke workload Anda. - Salin
spec.templatedari manifes YAML workload Anda. - Buat manifes Pod baru dan tempel spesifikasi yang disalin ke kolom
spec. Tetapkan kolom
apiVersion,kind, danmetadata.namedalam manifes Pod:apiVersion: v1 kind: Pod metadata: name: POD_NAME labels: cloud.google.com/matching-allowlist: ALLOWLIST_NAME spec: # Paste the content of spec.template hereGanti kode berikut:
POD_NAME: Nama untuk Pod pengujian Anda.ALLOWLIST_NAME: Nama daftar yang diizinkan.
Terapkan manifes Pod:
kubectl apply -f YOUR_POD_MANIFEST_FILEGanti
YOUR_POD_MANIFEST_FILEdengan jalur ke file manifes Pod Anda.Periksa output dari langkah sebelumnya. Jika Anda melihat kolom yang tidak terduga di bagian "Workload Mismatches", seperti variabel lingkungan tambahan (misalnya,
DD_AGENT_HOST), container, atau volume, hal ini menunjukkan bahwa webhook lain mengubah Pod Anda.
Untuk mengatasi masalah ini, Anda harus mengonfigurasi webhook yang bertentangan untuk mengecualikannya dari pengubahan Pod workload yang ada dalam daftar yang diizinkan. Hal ini biasanya dilakukan dengan menambahkan label atau anotasi ke workload atau namespace-nya untuk memberi sinyal kepada webhook bahwa workload tersebut harus dikecualikan dari mutasi. Misalnya, dengan
Datadog, Anda akan menambahkan label admission.datadoghq.com/enabled: "false" ke
namespace workload Anda.
Lihat dokumentasi untuk software pihak ketiga tertentu yang Anda gunakan untuk mempelajari cara mengecualikan workload dari pengontrol penerimaannya.
Dengan mencegah webhook lain mengubah Pod, Anda dapat membantu memastikan bahwa Pod tersebut terus cocok dengan daftar yang diizinkan dan berhasil di-deploy di cluster Autopilot Anda.
Bug dan permintaan fitur untuk workload dan daftar yang diizinkan dengan hak istimewa
Jika Anda menjalankan workload dengan hak istimewa yang disediakan oleh partner GKE atau penyedia pihak ketiga, penyedia tersebut bertanggung jawab untuk membuat, mengembangkan, dan memelihara workload dan daftar yang diizinkan dengan hak istimewa. Jika Anda menemukan bug atau memiliki permintaan fitur untuk workload atau daftar yang diizinkan dengan hak istimewa dari partner atau pihak ketiga, hubungi penyedia tersebut.
Langkah berikutnya
Jika Anda tidak dapat menemukan solusi untuk masalah Anda dalam dokumentasi, lihat Mendapatkan dukungan untuk bantuan lebih lanjut, termasuk saran tentang topik berikut:
- Membuka kasus dukungan dengan menghubungi Dukungan Pelanggan Cloud.
- Mendapatkan dukungan dari komunitas dengan
mengajukan pertanyaan di StackOverflow
dan menggunakan tag
google-kubernetes-engineuntuk menelusuri masalah serupa. Anda juga dapat bergabung ke saluran Slack untuk mendapatkan dukungan komunitas lainnya.#kubernetes-engine - Membuka masalah atau permintaan fitur menggunakan issue tracker publik.