Mengubah resource

Halaman ini menunjukkan cara mengubah resource menggunakan Pengontrol Kebijakan. Hal ini berguna untuk melakukan hal-hal seperti menetapkan nilai default. Misalnya, Anda mungkin ingin memasukkan label untuk semua resource di namespace tertentu, atau menetapkan imagePullPolicy Pod ke Always secara default jika belum ditetapkan.

Mengaktifkan mutasi

Konsol

Untuk mengaktifkan mutasi, selesaikan langkah-langkah berikut:

  1. Di konsol Google Cloud , buka halaman Policy di bagian Posture Management.

    Buka Policy

  2. Di tab Setelan, pada tabel pengelompokan, pilih Edit di kolom Edit konfigurasi.
  3. Luaskan menu konfigurasi Pengontrol Kebijakan.
  4. Centang kotak Enable mutation webhook.
  5. Pilih Save changes.

gcloud

Untuk mengaktifkan mutasi, jalankan perintah berikut:

gcloud container fleet policycontroller update \
    --memberships=MEMBERSHIP_NAME \
    --mutation

Ganti MEMBERSHIP_NAME dengan nama keanggotaan cluster terdaftar untuk mengaktifkan mutasi. Anda dapat menentukan beberapa keanggotaan yang dipisahkan dengan koma.

Definisi

  • mutator: Resource Kubernetes yang membantu mengonfigurasi perilaku mutasi Pengontrol Kebijakan.
  • system: Pengaturan beberapa mutator

Contoh mutasi

Contoh berikut menunjukkan mutator yang menetapkan imagePullPolicy untuk semua container di semua Pod ke Always:

# set-image-pull-policy.yaml

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: Assign
metadata:
  name: always-pull-image
spec:
  applyTo:
  - groups: [""]
    kinds: ["Pod"]
    versions: ["v1"]
  location: "spec.containers[name: *].imagePullPolicy"
  parameters:
    assign:
      value: "Always"

Dalam contoh ini, terdapat kolom metadata Kubernetes standar (apiVersion, kind, metadata.name), tetapi spec adalah tempat perilaku mutator dikonfigurasi.

spec.applyTo mengikat mutator ke resource yang ditentukan. Karena kita mengubah kolom tertentu dalam objek, kita secara implisit menentukan skema objek tersebut. Misalnya, mutator saat ini tidak akan masuk akal jika diterapkan ke resource Namespace. Oleh karena itu, kolom ini diperlukan agar Pengontrol Kebijakan mengetahui skema yang relevan dengan mutator ini. GroupVersionKinds yang tidak ada dalam daftar ini tidak diubah.

spec.location memberi tahu kita kolom mana yang harus diubah. Dalam hal ini, kita menggunakan glob (*) untuk menunjukkan bahwa kita ingin mengubah semua entri dalam daftar penampung. Perhatikan bahwa satu-satunya jenis daftar yang mungkin dilalui oleh kolom location adalah daftar jenis peta, dan kolom kunci untuk peta harus ditentukan. Daftar jenis peta adalah konstruksi Kubernetes. Detail selengkapnya tentang hal ini dapat ditemukan di dokumentasi Kubernetes.

spec.parameters.assign.value adalah nilai yang akan ditetapkan ke location. Kolom ini tidak diketik dan dapat mengambil nilai apa pun, meskipun perlu diperhatikan bahwa Kubernetes masih memvalidasi pasca-mutasi permintaan, sehingga menyisipkan nilai dengan skema yang salah untuk objek yang diubah akan menyebabkan permintaan ditolak.

Menggunakan mutator untuk Lowongan

Jika mengonfigurasi Tugas atau CronJob, Anda harus menentukan versi dan grup secara terpisah seperti yang ditunjukkan dalam contoh berikut:

applyTo:
- groups: ["batch"]
  kind: ["Job"]
  versions: ["v1"]

Saat Anda menggunakan mutator untuk Tugas, Tugas yang ada tidak akan diubah kecuali jika diubah. Mengubah Tugas akan memicu permintaan ke webhook mutasi dan menyebabkannya dimutasi.

Alur eksekusi

Mungkin konsep terpenting yang perlu dipahami tentang webhook mutasi Kubernetes adalah kebijakan pemanggilan ulang, karena output dari satu mutator dapat mengubah perilaku mutator lain. Misalnya, jika Anda menambahkan container sidecar baru, mutator yang menetapkan kebijakan pull image untuk semua container kini memiliki container baru untuk diubah.

Secara praktis, ini berarti bahwa untuk permintaan tertentu, webhook mutasi Pengontrol Kebijakan mungkin dipanggil lebih dari satu kali.

Untuk mengurangi latensi, Pengontrol Kebijakan memanggil ulang dirinya sendiri untuk menghindari permintaan HTTP tambahan. Artinya, injeksi sidecar dan kebijakan pull image memiliki hasil yang diharapkan.

Rutinitas mutasi Pengontrol Kebijakan akan terus memanggil ulang dirinya sendiri hingga resource "konvergen", yang berarti iterasi tambahan tidak akan berpengaruh lebih lanjut.

Sintaksis lokasi

Sintaksis lokasi menggunakan pengakses titik (.) untuk melintasi kolom. Dalam kasus daftar dengan kunci, pengguna dapat mereferensikan objek individual dalam daftar menggunakan sintaksis [<key>: <value>], atau semua objek dalam daftar menggunakan [<key>: *].

Nilai dan kolom dapat diapit dengan tanda kutip tunggal (') atau ganda ("). Hal ini diperlukan jika nama memiliki karakter khusus, seperti titik atau spasi.

Dalam nilai yang dikutip, karakter khusus dapat di-escape dengan mengawalinya dengan \. "Use \" to escape and \\\" to escape" berubah menjadi Use " to escape and \" to escape.

Beberapa contoh untuk resource v1/Pod:

  • Referensi spec.priority spec.priority
  • spec.containers[name: "foo"].volumeMounts[mountPath: "/my/mount"].readOnly mereferensikan kolom readOnly dari pemasangan /my/mount dari container foo.
  • spec.containers[name: *].volumeMounts[mountPath: "/my/mount"].readOnly mereferensikan kolom readOnly dari pemasangan /my/mount semua container.

Jika Anda mereferensikan lokasi yang saat ini tidak ada di resource, lokasi tersebut akan dibuat secara default. Perilaku ini dapat dikonfigurasi melalui pengujian jalur.

Pengujian jalur

Bagaimana cara melakukan penetapan default, dengan menghindari modifikasi nilai yang sudah ada? Mungkin kita ingin menetapkan /secure-mount ke hanya baca untuk semua container, tetapi kita tidak ingin membuat /secure-mount jika belum ada. Kita dapat melakukan salah satu dari hal ini melalui pengujian jalur.

Berikut adalah contoh yang menghindari mutasi imagePullPolicy jika sudah ditetapkan:

# set-image-pull-policy.yaml

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: Assign
metadata:
  name: always-pull-image
spec:
  applyTo:
  - groups: [""]
    kinds: ["Pod"]
    versions: ["v1"]
  location: "spec.containers[name: *].imagePullPolicy"
  parameters:
    assign:
      value: "Always"
    pathTests:
    - subPath: "spec.containers[name: *].imagePullPolicy"
      condition: "MustNotExist"

Berikut adalah contoh lain yang menghindari pembuatan penampung sidecar kosong jika belum ada:

# set-image-pull-policy.yaml

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: Assign
metadata:
  name: always-pull-image
spec:
  applyTo:
  - groups: [""]
    kinds: ["Pod"]
    versions: ["v1"]
  location: 'spec.containers[name: "sidecar"].imagePullPolicy'
  parameters:
    assign:
      value: "Always"
    pathTests:
    - subPath: 'spec.containers[name: "sidecar"]'
      condition: "MustExist"

Beberapa pengujian jalur dapat ditentukan, jika perlu.

subPath harus berupa awalan dari (atau sama dengan) location.

Satu-satunya nilai yang valid untuk condition adalah MustExist dan MustNotExist.

Pencocokan

Mutator juga memungkinkan pencocokan, menggunakan kriteria yang sama dengan batasan.

Mutator

Saat ini ada dua jenis mutator: Assign dan AssignMetadata.

Tugaskan

Assign dapat mengubah nilai apa pun di luar kolom metadata resource. Karena semua GroupVersionKinds memiliki skema unik, skema tersebut harus terikat ke kumpulan GroupVersionKinds tertentu.

Tabel ini memiliki skema berikut:

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: Assign
metadata:
  name: always-pull-image
spec:
  applyTo:
  - groups: [""]
    kinds: ["Pod"]
    versions: ["v1"]
  match:
    kinds: # redundant because of `applyTo`, but left in for consistency
      - apiGroups: ["*"]
        kinds: ["*"]
    namespaces: ["my-namespace"]
    scope: "Namespaced" # or "Cluster"
    excludedNamespaces: ["some-other-ns"]
    labelSelector:
      matchLabels:
        mutate: "yes"
      matchExpressions:
      - key: "my-label"
        operator: "In" # or, "NotIn", "Exists", or "DoesNotExist"
        values: ["my-value"]
    namespaceSelector:
      matchLabels:
        mutate: "yes"
      matchExpressions:
      - key: "my-label"
        operator: "In" # or, "NotIn", "Exists", or "DoesNotExist"
        values: ["my-value"]
  location: "spec.containers[name: *].imagePullPolicy"
  parameters:
    pathTests:
    - subPath: 'spec.containers[name: "sidecar"]' # must be a prefix of `location`
      condition: "MustExist" # or "MustNotExist"
    - subPath: "spec.containers[name: *].imagePullPolicy"
      condition: "MustNotExist"
    assign:
      value: "Always" # any type can go here, not just a string

AssignMetadata

AssignMetadata dapat menambahkan label metadata baru. Alat ini tidak dapat mengubah nilai label metadata yang ada. Jika tidak, sistem mutator dapat ditulis yang akan berulang tanpa batas, sehingga menyebabkan waktu tunggu permintaan habis.

Karena semua resource memiliki skema metadata yang sama, Anda tidak perlu menentukan resource mana yang akan diterapkan AssignMetadata.

Selain itu, karena AssignMetadata tidak diizinkan untuk melakukan banyak hal, skemanya sedikit lebih sederhana.

apiVersion: mutations.gatekeeper.sh/v1alpha1
kind: AssignMetadata
metadata:
  name: set-team-name
spec:
  match:
    kinds:
      - apiGroups: ["*"]
        kinds: ["*"]
    namespaces: ["my-namespace"]
    scope: "Namespaced" # or "Cluster"
    excludedNamespaces: ["some-other-ns"]
    labelSelector:
      matchLabels:
        mutate: "yes"
      matchExpressions:
      - key: "my-label"
        operator: "In" # or, "NotIn", "Exists", or "DoesNotExist"
        values: ["my-value"]
    namespaceSelector:
      matchLabels:
        mutate: "yes"
      matchExpressions:
      - key: "my-label"
        operator: "In" # or, "NotIn", "Exists", or "DoesNotExist"
        values: ["my-value"]
  location: "metadata.labels.team" # must start with `metadata.labels`
  parameters:
    assign:
      value: "Always" # any type can go here, not just a string

Praktik terbaik

Peringatan Kubernetes

Dokumentasi Kubernetes mencantumkan beberapa pertimbangan penting terkait penggunaan webhook mutasi. Karena Pengontrol Kebijakan beroperasi sebagai webhook penerimaan Kubernetes, saran tersebut berlaku di sini.

Sintaksis mutasi Pengontrol Kebijakan dirancang untuk memudahkan kepatuhan terhadap masalah operasional terkait webhook mutasi, termasuk idempotensi.

Menulis mutator

Atomitas

Praktik terbaiknya adalah membuat setiap mutator sesederhana mungkin. Karena Kubernetes memiliki konsistensi tertunda, satu mutator tidak boleh mengandalkan mutator kedua untuk dikenali agar dapat melakukan tugasnya dengan benar. Misalnya, saat menambahkan sidecar, tambahkan seluruh sidecar, jangan buat sedikit demi sedikit menggunakan beberapa mutator.

Validasi

Jika ada kondisi yang ingin Anda terapkan, sebaiknya mutator memiliki batasan yang cocok. Hal ini membantu memastikan permintaan yang melanggar ditolak dan pelanggaran yang sudah ada terdeteksi dalam audit.

Pemulihan darurat

Mutasi diimplementasikan sebagai webhook mutasi Kubernetes. Webhook ini dapat dihentikan dengan cara yang sama seperti webhook validator, tetapi resource yang relevan adalah MutatingWebhookConfiguration yang disebut gatekeeper-mutating-webhook-configuration.

Langkah berikutnya