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 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 Policy GKE Enterprise 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. Pilih kotak centang Aktifkan webhook mutasi.
  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 yang terdaftar untuk mengaktifkan mutasi. Anda dapat menentukan beberapa langganan 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 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 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 Pengontrol Kebijakan.
  • sistem: Pengaturan beberapa mutator

Contoh mutasi

Contoh berikut menunjukkan mutator 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, 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 suatu objek, secara implisit kita menentukan skema objek tersebut. Misalnya, mutator saat ini tidak akan masuk akal jika diterapkan ke resource Namespace. Karena itu, kolom ini diperlukan agar Pengontrol Kebijakan mengetahui skema yang relevan dengan mutator ini. GroupVersionKinds yang tidak ada dari daftar ini tidak berubah.

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 container. 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 lebih lanjut tentang parameter ini dapat ditemukan di dokumentasi Kubernetes.

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

Menggunakan mutator untuk Tugas

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

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

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

Alur eksekusi

Mungkin konsep yang paling penting untuk dipahami tentang webhook mutasi Kubernetes adalah kebijakan pemanggilan ulang, karena output dari satu mutator dapat mengubah perilaku mutator lainnya. Misalnya, jika Anda menambahkan container file bantuan baru, mutator yang menetapkan kebijakan pull image untuk semua container kini memiliki container baru untuk bermutasi.

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

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

Rutinitas mutasi Pengontrol Kebijakan akan terus memanggil dirinya sendiri sampai resource "konvergensi", yang berarti iterasi tambahan tidak akan memiliki 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 mereka 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:

  • spec.priority referensi 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 dari semua container.

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

Pengujian jalur

Bagaimana kita bisa melakukan default jika kita tidak memodifikasi 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 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.

Mutator

Saat ini ada dua jenis mutator: Assign dan AssignMetadata.

Tetapkan

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

Metode 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. Nilai tersebut tidak dapat mengubah nilai label metadata yang ada. Jika tidak, sistem mutator yang akan berulang tanpa batas waktu dapat ditulis, sehingga menyebabkan waktu permintaan habis.

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

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 seputar webhook mutasi, termasuk idempotensi.

Menulis mutator

Atomisitas

Praktik terbaiknya adalah membuat setiap mutator menjadi mandiri. Karena Kubernetes pada akhirnya konsisten, satu mutator sebaiknya tidak mengandalkan mutator kedua agar dikenali untuk melakukan tugasnya dengan benar. Misalnya, saat menambahkan file bantuan, tambahkan seluruh sespan, jangan membuatnya sedikit demi sedikit menggunakan beberapa mutator.

Validasi

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

Pemulihan darurat

Mutasi diimplementasikan sebagai webhook bermutasi Kubernetes. Aktivitas dapat dihentikan dengan cara yang sama seperti memvalidasi webhook, tetapi resource yang relevan adalah MutatingWebhookConfiguration yang disebut gatekeeper-mutating-webhook-configuration.

Langkah selanjutnya