Mengubah resource

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

Aktifkan mutasi

Konsol

Untuk mengaktifkan mutasi, selesaikan langkah-langkah berikut:

  1. Di Konsol Google Cloud, buka halaman Kebijakan GKE Enterprise di bagian Pengelolaan Postur.

    Buka Kebijakan

  2. Pada tab Setelan, pada tabel cluster, pilih Edit di kolom Edit configuration.
  3. Luaskan menu Edit Policy Controller configuration.
  4. Centang kotak Enable mutation webhook.
  5. Pilih Simpan perubahan.

Pengontrol Kebijakan 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 keanggotaannya dipisahkan dengan koma.

gcloud ConfigManagement

Mutasi harus diaktifkan dengan menetapkan spec.policyController.mutation.enabled ke true dalam resource config-management:

apiVersion: configmanagement.gke.io/v1
kind: ConfigManagement
metadata:
  name: config-management
spec:
  policyController:
    enabled: true
     mutation:
      enabled: true 

Jika menggunakan perintah gcloud CLI, Anda harus menggunakan untuk mengaktifkan mutasi seperti yang ditunjukkan pada contoh berikut:

  # apply-spec.yaml

  applySpecVersion: 1
  spec:
    policyController:
      enabled: true
      mutationEnabled: true

Setelah Anda membuat file apply-spec.yaml, jalankan perintah berikut untuk terapkan konfigurasi:

  gcloud alpha container fleet config-management apply \
      --membership=MEMBERSHIP_NAME \
      --config=CONFIG_YAML_PATH \
      --project=PROJECT_ID

Ganti kode berikut:

  • MEMBERSHIP_NAME: nama keanggotaan terdaftar yang memiliki setelan Pengontrol Kebijakan yang ingin Anda gunakan
  • CONFIG_YAML_PATH: jalur ke file apply-spec.yaml
  • PROJECT_ID: project ID Anda

Definisi

  • mutator: Resource Kubernetes yang membantu mengonfigurasi mutasi perilaku Pengontrol Kebijakan.
  • sistem: Susunan 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, ada kolom metadata Kubernetes standar (apiVersion, kind, metadata.name), tetapi spec adalah tempat mutator dikonfigurasi.

spec.applyTo mengikat mutator ke resource yang ditentukan. Karena kita mengubah bidang tertentu dalam sebuah objek, kita secara implisit mendefinisikan atribut skema. Misalnya, mutator saat ini tidak akan masuk akal jika diterapkan ke resource Namespace. Oleh karena itu, isian ini diperlukan sehingga Pengontrol Kebijakan mengetahui skema yang relevan dengan mutator ini. GroupVersionKinds yang tidak ada dari 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 mungkin dilalui menurut kolom location adalah daftar jenis peta, dan kolom kunci untuk peta harus ditentukan. Daftar jenis peta adalah konstruksi Kubernetes. Detail selengkapnya tentang ID tersebut dapat ditemukan di dokumentasi.

spec.parameters.assign.value adalah nilai yang akan ditetapkan ke location. Kolom ini tidak memiliki jenis dan dapat berisi nilai apa pun, tetapi perhatikan bahwa Kubernetes masih memvalidasi permintaan pascamutasi, jadi memasukkan nilai dengan skema untuk objek yang diubah mengakibatkan permintaan ditolak.

Menggunakan mutator untuk Tugas

Jika mengonfigurasi Tugas atau CronJob, Anda harus menentukan 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 perubahan tersebut. Mengubah Tugas akan memicu permintaan ke webhook mutasi dan menyebabkannya bermutasi.

Alur eksekusi

Mungkin konsep paling penting untuk dipahami tentang mutasi Kubernetes webhook adalah kebijakan pemanggilan ulang, karena output dari satu mutator dapat berubah dan bagaimana perilaku mutator lain. Misalnya, jika Anda menambahkan penampung file bantuan baru, mutator yang menetapkan kebijakan penarikan image untuk semua penampung sekarang memiliki container baru untuk dimutasi.

Secara praktis, yang dimaksud dengan hal ini adalah bahwa untuk permintaan Pengontrol Kebijakan apa pun yang dapat dipanggil lebih dari satu kali.

Untuk mengurangi latensi, Pengontrol Kebijakan memanggil kembali dirinya sendiri untuk menghindari permintaan HTTP tambahan. Artinya, injeksi file bantuan dan penarikan image kebijakan memiliki hasil yang diharapkan.

Rutinitas mutasi Pengontrol Kebijakan akan terus dipanggil kembali sampai sumber daya "konvergensi", yang berarti iterasi tambahan tidak memiliki pengaruh tersebut.

Sintaksis lokasi

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

Nilai dan kolom dapat diberi tanda kutip tunggal (') atau ganda ("). Ini adalah yang diperlukan jika ada karakter khusus, seperti titik atau spasi.

Pada 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:

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

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

Pengujian jalur

Bagaimana kita dapat melakukan {i>default<i}, di mana kita dapat menghindari modifikasi nilai yang sudah sudah ada? Mungkin kita ingin menetapkan /secure-mount ke hanya baca untuk semua container, tetapi kita tidak ingin membuat /secure-mount jika belum ada. Rab dapat melakukan salah satu hal ini melalui pengujian jalur.

Berikut adalah contoh yang menghindari mutasi imagePullPolicy jika sudah tetapkan:

# 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 (atau sama dengan) location.

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

Pencocokkan

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

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 set dari GroupVersionKinds tertentu.

Kode tersebut 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. Hal ini tidak dapat mengubah nilai label {i>metadata <i}yang sudah ada. Jika tidak, ada kemungkinan untuk menulis sebuah sistem mutator yang akan berulang tanpa batas, sehingga menyebabkan waktu tunggu permintaan habis.

Karena semua resource memiliki skema metadata yang sama, tidak perlu menentukan resource mana yang menerapkan AssignMetadata.

Selain itu, karena AssignMetadata tidak diizinkan untuk melakukan sebanyak itu, skemanya sedikit lebih mudah.

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 seputar menggunakan webhook mutasi. Karena Pengontrol Kebijakan beroperasi sebagai Kubernetes webhook, saran itu berlaku di sini.

Sintaksis mutasi Pengontrol Kebijakan dirancang untuk mempermudah kepatuhan terhadap masalah operasional terkait webhook mutasi, termasuk idempotence.

Menulis mutator

Atomitas

Praktik terbaiknya adalah membuat setiap mutator mandiri. Karena Kubernetes akhirnya konsisten, satu mutator tidak boleh bergantung pada satu detik mutator telah dikenali agar dapat melakukan tugasnya dengan benar. Misalnya, saat menambahkan file bantuan, tambahkan seluruh file bantuan, jangan membuatnya sedikit demi sedikit menggunakan beberapa mutator.

Validasi

Jika ada kondisi yang ingin Anda terapkan, itu adalah ide yang baik untuk mutator untuk memiliki batasan yang cocok. Hal ini membantu memastikan bahwa konten yang melanggar permintaan ditolak dan pelanggaran yang sudah ada sebelumnya terdeteksi dalam audit.

Pemulihan darurat

Mutasi diterapkan sebagai webhook mutasi Kubernetes. Fungsi ini dapat dihentikan saat dengan cara yang sama seperti webhook yang memvalidasi, tetapi resource yang relevan adalah MutatingWebhookConfiguration yang disebut gatekeeper-mutating-webhook-configuration.

Langkah selanjutnya