Memecahkan masalah workload dan daftar yang diizinkan Autopilot dengan hak istimewa

Workload istimewa di cluster Google Kubernetes Engine (GKE) Autopilot harus dikonfigurasi dengan benar untuk menghindari masalah. Kesalahan konfigurasi 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 tentang cara mengatasi error sinkronisasi daftar yang diizinkan dan mendiagnosis alasan penolakan workload yang memiliki hak istimewa.

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 rujuk 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 dari 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. Gunakan informasi ini untuk menyelesaikan masalah.

Beberapa AllowlistSynchronizer

Di cluster GKE pada versi yang lebih lama dari 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 yang lebih lama dari 1.34.0-gke.0000000, jika satu atau beberapa image container workload cocok dengan image container yang ditentukan dalam WorkloadAllowlist dalam cluster, maka container workload dapat dibuat dan diurutkan dalam urutan alfabet 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 agar diurutkan dalam urutan yang benar.

Masalah deployment workload istimewa

Setelah berhasil menginstal daftar yang diizinkan, Anda men-deploy workload istimewa yang sesuai di cluster. Dalam beberapa kasus, GKE mungkin menolak workload.

Coba opsi penyelesaian berikut:

  • Pastikan versi GKE cluster Anda memenuhi persyaratan versi workload.
  • Pastikan workload yang Anda deploy adalah workload yang file daftar yang diizinkan berlaku untuknya.

Untuk mengetahui alasan penolakan workload yang memiliki hak istimewa, minta informasi mendetail dari GKE tentang pelanggaran daftar yang diizinkan:

  1. Dapatkan daftar daftar yang diizinkan yang diinstal di cluster:

    kubectl get workloadallowlist
    

    Temukan nama daftar yang diizinkan yang harus diterapkan ke workload dengan hak istimewa.

  2. Buka manifes YAML workload yang memiliki 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.

  3. Tambahkan label berikut ke bagian spec.metadata.labels dari spesifikasi Pod workload istimewa:

    labels:
      cloud.google.com/matching-allowlist: ALLOWLIST_NAME
    

    Ganti ALLOWLIST_NAME dengan nama daftar yang diizinkan yang Anda dapatkan di langkah sebelumnya. Gunakan nama dari output perintah kubectl get workloadallowlist, bukan jalur ke file daftar yang diizinkan.

  4. Simpan manifes dan terapkan workload ke cluster:

    kubectl apply -f WORKLOAD_MANIFEST_FILE
    

    Ganti WORKLOAD_MANIFEST_FILE dengan jalur ke file manifes.

    Output memberikan informasi mendetail tentang kolom mana dalam beban kerja 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, terjadi pelanggaran berikut:

    • Workload menentukan hostNetwork: true, tetapi daftar yang diizinkan tidak menentukan hostNetwork: true.
    • Workload menentukan hostPID: true, tetapi daftar yang diizinkan tidak menentukan hostPID: true.
    • Workload menentukan volume bernama data, tetapi daftar yang diizinkan tidak menentukan volume bernama data.
    • Penampung menentukan variabel lingkungan bernama ENV_VAR1 dan ENV_VAR2, tetapi daftar yang diizinkan tidak menentukan variabel lingkungan ini.
    • Container menentukan image k8s.gcr.io/diff/image, tetapi daftar yang diizinkan menentukan k8s.gcr.io/pause2.
    • Penampung menambahkan kemampuan SYS_ADMIN dan SYS_PTRACE, tetapi daftar yang diizinkan tidak mengizinkan penambahan kemampuan ini.
    • Container menentukan pemasangan volume bernama data, tetapi daftar yang diizinkan tidak menentukan pemasangan volume bernama data.

Jika Anda men-deploy workload yang dimiliki oleh penyedia pihak ketiga, buka masalah dengan penyedia tersebut untuk menyelesaikan pelanggaran. Berikan output dari langkah sebelumnya dalam masalah ini.

Versi GKE yang tidak kompatibel

GKE dapat menolak workload jika daftar yang diizinkan menentukan versi GKE minimum yang lebih baru daripada versi GKE cluster.

  1. Periksa apakah daftar yang diizinkan menentukan versi GKE minimum:

    kubectl describe workloadallowlist ALLOWLIST_NAME | grep "minGKEVersion"
    

    Ganti ALLOWLIST_NAME dengan nama daftar yang diizinkan.

    Jika output kosong, daftar yang diizinkan tidak menentukan versi GKE minimum. Lewati bagian ini. Jika outputnya adalah nilai, daftar yang diizinkan menentukan versi GKE minimum.

  2. 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: Google Cloud lokasi cluster.

    Outputnya mirip dengan hal berikut ini:

    1.32.3-gke.1006000
    
  3. Jika versi GKE cluster lebih lama daripada 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 berupa kecocokan string yang tepat dengan kolom yang sesuai dalam spesifikasi workload.

  1. Buka halaman referensi CustomResourceDefinition (CRD) WorkloadAllowlist.
  2. Untuk setiap kolom dalam spesifikasi WorkloadAllowlist, periksa apakah CRD memerlukan kecocokan string yang tepat.
  3. Untuk setiap kolom yang memerlukan kecocokan string yang tepat, periksa apakah nilai dalam spesifikasi WorkloadAllowlist Anda cocok dengan nilai yang sesuai dalam spesifikasi workload Anda.

    Misalnya, setiap perintah yang dijalankan container harus sama persis dengan perintah dalam daftar yang diizinkan. Setiap penyimpangan dari perintah yang tepat akan mengakibatkan penolakan.

Jika ada ketidakcocokan, perbarui spesifikasi WorkloadAllowlist agar cocok dengan spesifikasi workload Anda.

Regular expression tidak cocok

Kolom tertentu dalam spesifikasi WorkloadAllowlist mendukung pencocokan ekspresi reguler.

  1. Dalam spesifikasi WorkloadAllowlist, temukan kolom yang menentukan ekspresi reguler.
  2. Pastikan sintaksis ekspresi reguler sudah benar. CRD WorkloadAllowlist mendukung sintaksis ekspresi reguler Google RE2. Validasi bahwa ekspresi Anda memiliki properti berikut:

    • Ekspresi reguler dimulai dengan karakter ^ dan diakhiri dengan karakter $. Contohnya, ^example-auth\.google\.com\/go_[a-z0-9]+\/google\/path$.
    • Setiap karakter khusus di-escape dengan karakter escape \. Cari karakter \ yang berlebih atau kurang.
    • Jalur gambar dalam daftar yang diizinkan tidak menyertakan tag atau ringkasan. Misalnya, gunakan k8s.gcr.io/pause, bukan k8s.gcr.io/pause:3.1 atau k8s.gcr.io/pause@sha256:1234567890.

Setelah Anda memperbaiki masalah ekspresi reguler, coba deploy workload ke cluster.

Meng-escape karakter dalam perintah dan argumen

GKE tidak dapat mencocokkan perintah dan argumen jika Anda tidak meng-escape karakter khusus. Persyaratan untuk karakter escape bergantung pada cara Anda menerapkan daftar yang diizinkan. Misalnya, menerapkan daftar yang diizinkan sebagai file YAML atau JSON memiliki persyaratan pelepasan yang berbeda dengan membuat spesifikasi daftar yang diizinkan menggunakan alat command line. Bagian ini menjelaskan persyaratan pelepasan untuk file YAML.

Escape setiap karakter khusus di kolom commands dan args dalam 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 ditolak oleh webhook penerimaan GKE Warden.

Masalah ini umum terjadi pada agen keamanan dan pemantauan 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.

  1. Ikuti langkah-langkah di bagian Masalah deployment workload istimewa untuk menambahkan label cloud.google.com/matching-allowlist ke workload Anda.
  2. Salin spec.template dari manifes YAML beban kerja Anda.
  3. Buat manifes Pod baru dan tempel spesifikasi yang disalin ke kolom spec.
  4. Tetapkan kolom apiVersion, kind, dan metadata.name dalam 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 here
    

    Ganti kode berikut:

    • POD_NAME: Nama untuk Pod pengujian Anda.
    • ALLOWLIST_NAME: Nama daftar yang diizinkan.
  5. Terapkan manifes Pod:

    kubectl apply -f YOUR_POD_MANIFEST_FILE
    

    Ganti YOUR_POD_MANIFEST_FILE dengan jalur ke file manifes Pod Anda.

  6. Periksa output dari langkah sebelumnya. Jika Anda melihat kolom yang tidak terduga di bagian "Ketidakcocokan Workload", seperti variabel lingkungan tambahan (misalnya, DD_AGENT_HOST), container, atau volume, hal ini merupakan indikasi kuat bahwa webhook lain sedang mengubah Pod Anda.

Untuk mengatasi masalah ini, Anda perlu mengonfigurasi webhook yang bertentangan agar tidak mengubah Pod beban kerja yang ada dalam daftar yang diizinkan. Hal ini biasanya dilakukan dengan menambahkan label atau anotasi ke beban kerja atau namespace-nya untuk memberi sinyal ke webhook bahwa beban kerja tersebut harus dikecualikan dari mutasi. Misalnya, dengan Datadog, Anda akan menambahkan label admission.datadoghq.com/enabled: "false" ke namespace beban kerja 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 istimewa yang disediakan oleh partner GKE atau penyedia pihak ketiga, penyedia tersebut bertanggung jawab untuk membuat, mengembangkan, dan memelihara workload istimewa serta daftar yang diizinkan. Jika Anda menemukan bug atau memiliki permintaan fitur untuk partner atau daftar yang diizinkan atau beban kerja istimewa pihak ketiga, hubungi penyedia.

Langkah berikutnya