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