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 memasukkan label untuk semua resource dalam namespace tertentu, atau menetapkan default imagePullPolicy Pod ke Always jika belum ditetapkan.

Mengaktifkan mutasi

Konsol

Untuk mengaktifkan mutasi, selesaikan langkah-langkah berikut:

  1. Di konsol Google Cloud, buka halaman Kebijakan GKE Enterprise di bagian Posture Management.

    Buka Kebijakan

  2. Di tab Setelan, di 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 keanggotaan yang dipisahkan dengan koma.

gcloud ConfigManagement

Mutasi harus diaktifkan dengan menetapkan spec.policyController.mutation.enabled ke true di 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 versi alfa untuk mengaktifkan mutasi seperti yang ditunjukkan dalam contoh berikut:

  # apply-spec.yaml

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

Setelah membuat file apply-spec.yaml, jalankan perintah berikut untuk menerapkan 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 cluster 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 perilaku mutasi Policy Controller.
  • system: Pengaturan beberapa pengubah

Contoh mutasi

Contoh berikut menunjukkan pengubah yang menetapkan imagePullPolicy untuk semua penampung 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 pengubah ke resource yang ditentukan. Karena kita mengubah kolom tertentu dalam objek, kita secara implisit menentukan skema objek tersebut. Misalnya, pengubah 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 pengubah ini. GroupVersionKinds yang tidak ada dalam daftar ini tidak akan 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 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 memiliki jenis dan dapat menggunakan nilai apa pun, meskipun perlu diperhatikan bahwa Kubernetes masih memvalidasi permintaan pasca-mutasi, sehingga menyisipkan nilai dengan skema yang salah untuk objek yang diubah akan menyebabkan permintaan ditolak.

Menggunakan pengubah untuk Tugas

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 pengubah untuk Tugas, Tugas yang ada tidak akan diubah kecuali jika diubah. Mengubah Tugas akan memicu permintaan ke webhook mutasi dan menyebabkannya diubah.

Alur eksekusi

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

Secara praktis, artinya untuk permintaan tertentu, webhook mutasi Pengontrol Kebijakan dapat dipanggil lebih dari satu kali.

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

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

Sintaksis lokasi

Sintaksis lokasi menggunakan pengakses titik (.) untuk menjelajahi 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 diapit tanda kutip tunggal (') atau tanda kutip ganda ("). Hal ini diperlukan jika nama memiliki karakter khusus, seperti titik atau spasi.

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

Beberapa contoh untuk resource v1/Pod:

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

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, yang menghindari perubahan nilai yang sudah ada? Mungkin kita ingin menetapkan /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 diperlukan.

subPath harus berupa awalan (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 pengubah: Assign dan AssignMetadata.

Tugaskan

Assign dapat mengubah nilai apa pun di luar kolom metadata resource. Karena semua GroupVersionKinds memiliki skema unik, GroupVersionKinds harus terikat dengan 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. Tindakan ini tidak dapat mengubah nilai label metadata yang ada. Jika tidak, Anda dapat menulis sistem mutator yang akan melakukan rekursi tanpa batas, sehingga permintaan akan habis waktu tunggunya.

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

Catatan 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 memudahkan kepatuhan terhadap masalah operasional di sekitar webhook mutasi, termasuk idempotence.

Menulis pengubah

Atomitas

Praktik terbaiknya adalah membuat setiap pengubah menjadi mandiri sebanyak mungkin. Karena Kubernetes pada akhirnya konsisten, satu pengubah tidak boleh mengandalkan pengubah kedua yang telah dikenali untuk melakukan tugasnya dengan benar. Misalnya, saat menambahkan sidecar, tambahkan seluruh sidecar, jangan buat secara terpisah 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 sebelumnya terdeteksi dalam audit.

Pemulihan darurat

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

Langkah selanjutnya