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:
- Di Konsol Google Cloud, buka halaman Kebijakan GKE Enterprise di bagian Pengelolaan Postur.
- Pada tab Setelan, pada 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
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 gunakanCONFIG_YAML_PATH
: jalur ke fileapply-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
referensispec.priority
spec.containers[name: "foo"].volumeMounts[mountPath: "/my/mount"].readOnly
merujuk ke kolomreadOnly
dari pemasangan/my/mount
darifoo
container.spec.containers[name: *].volumeMounts[mountPath: "/my/mount"].readOnly
merujuk ke kolomreadOnly
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
- Untuk mengetahui penjelasan dan contoh mutasi Gatekeeper, lihat dokumentasi open source