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:
- Di konsol Google Cloud, buka halaman Kebijakan GKE Enterprise di bagian Posture Management.
- Di tab Setelan, di tabel cluster, pilih Edit edit di kolom Edit configuration.
- Luaskan menu Edit Policy Controller configuration.
- Centang kotak Enable mutation webhook.
- 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 gunakanCONFIG_YAML_PATH
: jalur ke fileapply-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
mereferensikanspec.priority
spec.containers[name: "foo"].volumeMounts[mountPath: "/my/mount"].readOnly
mereferensikan kolomreadOnly
dari pemasangan/my/mount
pada penampungfoo
.spec.containers[name: *].volumeMounts[mountPath: "/my/mount"].readOnly
mereferensikan kolomreadOnly
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
- Untuk penjelasan dan contoh mutasi Gatekeeper, lihat dokumentasi open source