Mengubah resource

Halaman ini menunjukkan cara mengubah resource menggunakan Policy Controller. Hal ini berguna untuk melakukan hal-hal seperti menetapkan nilai default. Misalnya, Anda mungkin ingin menyisipkan label untuk semua resource dalam namespace tertentu, atau menetapkan imagePullPolicy Pod ke Always jika belum ditetapkan.

Aktifkan mutasi

Konsol

Untuk mengaktifkan mutasi, selesaikan langkah-langkah berikut:

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

    Buka Kebijakan

  2. Di tab Settings, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Centang kotak Aktifkan webhook mutasi.
  5. Pilih Simpan perubahan.

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 Policy Controller.
  • sistem: Susunan beberapa pengubah

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, ada 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 wajib diisi agar Policy Controller mengetahui skema mana yang relevan untuk mutator ini. GroupVersionKinds yang tidak ada dalam daftar ini tidak diubah.

spec.location memberi tahu kita kolom mana yang akan 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 dapat 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 tersebut dapat ditemukan di dokumentasi Kubernetes.

spec.parameters.assign.value adalah nilai yang akan ditetapkan ke location. Kolom ini tidak memiliki jenis dan dapat mengambil nilai apa pun, tetapi perhatikan bahwa Kubernetes tetap memvalidasi permintaan setelah mutasi, sehingga menyisipkan nilai dengan skema yang salah untuk objek yang dimodifikasi akan menyebabkan permintaan ditolak.

Menggunakan mutator untuk Pekerjaan

Jika mengonfigurasi Job 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 Pekerjaan, Pekerjaan yang ada tidak akan diubah kecuali jika dimodifikasi. Memodifikasi Tugas akan memicu permintaan ke webhook mutasi dan menyebabkan tugas tersebut dimutasi.

Alur eksekusi

Konsep terpenting yang perlu dipahami tentang webhook mutasi Kubernetes adalah kebijakan pemanggilan ulang, karena output 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 dimutasi.

Praktisnya, ini berarti untuk permintaan tertentu, webhook mutasi Pengontrol Kebijakan dapat dipanggil lebih dari satu kali.

Untuk mengurangi latensi, Policy Controller memanggil ulang dirinya sendiri untuk menghindari permintaan HTTP tambahan. Artinya, injeksi sidecar dan kebijakan penarikan gambar memiliki hasil yang diharapkan.

Rutinitas mutasi Policy Controller akan terus memanggil ulang dirinya sendiri hingga resource "berkonvergensi", yang berarti iterasi tambahan tidak akan memberikan efek lebih lanjut.

Sintaksis lokasi

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

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

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

Beberapa contoh untuk resource v1/Pod:

  • spec.priority referensi spec.priority
  • spec.containers[name: "foo"].volumeMounts[mountPath: "/my/mount"].readOnly mereferensikan kolom readOnly dari pemasangan /my/mount pada foo penampung.
  • 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 default, dengan menghindari modifikasi nilai yang sudah ada? Mungkin kita ingin menyetel /secure-mount ke hanya baca untuk semua penampung, tetapi kita tidak ingin membuat /secure-mount jika belum ada. Kita dapat melakukan salah satu 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 seperti 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, GroupVersionKinds harus terikat ke sekumpulan 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. Tindakan ini tidak dapat mengubah nilai label metadata yang ada. Jika tidak, mutator sistem dapat ditulis untuk berulang tanpa batas, sehingga menyebabkan permintaan kehabisan waktu.

Karena semua resource memiliki skema metadata yang sama, tidak perlu menentukan resource mana yang berlaku untuk 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

Batasan 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 Policy Controller dirancang untuk mempermudah kepatuhan terhadap masalah operasional terkait webhook mutasi, termasuk idempotensi.

Menulis mutator

Atomitas

Praktik terbaiknya adalah membuat setiap mutator seberdikari mungkin. Karena Kubernetes pada akhirnya konsisten, satu mutator tidak boleh mengandalkan mutator kedua agar dikenali untuk melakukan tugasnya dengan benar. Misalnya, saat menambahkan sidecar, tambahkan seluruh sidecar, jangan buat sidecar secara bertahap 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 diterapkan sebagai webhook mutasi Kubernetes. Webhook ini dapat dihentikan dengan cara yang sama seperti validasi webhook, tetapi resource yang relevan adalah MutatingWebhookConfiguration yang disebut gatekeeper-mutating-webhook-configuration.

Langkah berikutnya