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:
- Di konsol Google Cloud , buka halaman Policy di bagian Posture Management.
- Di tab Settings, pada tabel cluster, pilih Edit edit di kolom Edit configuration.
- Luaskan menu Edit Policy Controller configuration.
- Centang kotak Aktifkan webhook mutasi.
- 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
referensispec.priority
spec.containers[name: "foo"].volumeMounts[mountPath: "/my/mount"].readOnly
mereferensikan kolomreadOnly
dari pemasangan/my/mount
padafoo
penampung.spec.containers[name: *].volumeMounts[mountPath: "/my/mount"].readOnly
mereferensikan kolomreadOnly
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
- Untuk penjelasan dan contoh mutasi Gatekeeper, lihat dokumentasi open source