Config Sync memungkinkan Anda mencegah penyimpangan konfigurasi sehingga resource cluster tetap selaras dengan source of truth pusat Anda. Secara default, pemulihan mandiri bawaan di Config Sync otomatis mendeteksi dan mengembalikan penyimpangan dengan dampak minimal pada performa cluster.
Jika lingkungan Anda memerlukan pemblokiran perubahan yang bertentangan sebelum cluster menerapkannya, Anda dapat mengaktifkan webhook penerimaan Config Sync untuk mencegah penyimpangan. Karena webhook ini meningkatkan overhead memori dan dapat menyebabkan error kehabisan memori (OOM), andalkan penyembuhan mandiri bawaan untuk sebagian besar kasus penggunaan.
Alasan pencegahan penyimpangan tidak direkomendasikan
Webhook penerimaan memerlukan Config Sync untuk memuat skema OpenAPI Kubernetes guna memvalidasi permintaan. Dalam cluster dengan banyak resource atau CustomResourceDefinition, pemrosesan skema ini dapat melebihi batas memori, sehingga menyebabkan kegagalan komponen. Untuk sebagian besar kasus penggunaan, penyembuhan mandiri bawaan di Config Sync memberikan perlindungan penyimpangan tanpa risiko stabilitas webhook. Anda tidak dapat menonaktifkan pemulihan mandiri bawaan.
Jika diaktifkan, pencegahan penyimpangan akan melindungi objek RootSync secara default. Anda dapat mengonfigurasi fitur ini untuk melindungi objek RepoSync. Untuk menggunakan pencegahan penyimpangan,
Anda harus mengaktifkan API RootSync dan RepoSync. Untuk mengetahui informasi selengkapnya, lihat
Kolom RootSync dan RepoSync.
Sebelum memulai
Jika sebelumnya Anda telah menginstal Google Cloud CLI, dapatkan versi terbaru dengan menjalankan perintah gcloud components update.
Mengaktifkan pencegahan penyimpangan
Anda dapat mengaktifkan pencegahan penyimpangan menggunakan gcloud CLI. Anda tidak dapat mengaktifkan pencegahan penyimpangan di konsol Google Cloud .
Untuk mengaktifkan pencegahan penyimpangan, selesaikan langkah-langkah berikut:
Perbarui manifes spesifikasi penerapan untuk menetapkan kolom
spec.configSync.preventDriftketrue:applySpecVersion: 1 spec: configSync: enabled: true ... existing content ... preventDrift: trueTerapkan manifes yang diupdate:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDGanti kode berikut:
MEMBERSHIP_NAME: nama keanggotaan fleet yang Anda pilih saat mendaftarkan cluster. Dapatkan nama dengan perintahgcloud container fleet memberships list.MANIFEST_NAME: nama manifes spesifikasi penerapan Anda, biasanyaapply-spec.yaml.PROJECT_ID: project ID Anda.
Tunggu hingga objek
ValidateWebhookConfigurationConfig Sync dibuat oleh ConfigManagement Operator:kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.ioAnda akan melihat output yang mirip dengan contoh berikut ini:
NAME WEBHOOKS AGE admission-webhook.configsync.gke.io 0 2m15sCommit perubahan baru ke sumber kebenaran yang akan disinkronkan sehingga Deployment
root-reconcilerdapat menambahkan webhook ke objek ValidatingWebhookConfiguration Config Sync. Alternatifnya adalah menghapus Deploymentroot-reconcilieruntuk memicu rekonsiliasi. Deploymentroot-reconcileryang baru akan mengupdate objek ValidatingWebhookConfiguration Config Sync.Tunggu hingga server webhook siap. Log Deployment webhook penerimaan Config Sync harus menyertakan
serving webhook server. Proses ini dapat memerlukan waktu beberapa menit.kubectl logs -n config-management-system -l app=admission-webhook --tail=-1 | grep "serving webhook server"Anda akan melihat output yang mirip dengan contoh berikut ini:
I1201 18:05:41.805531 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250 I1201 18:07:04.626199 1 deleg.go:130] controller-runtime/webhook "level"=0 "msg"="serving webhook server" "host"="" "port"=10250
Menonaktifkan pencegahan penyimpangan
Saat Anda menonaktifkan pencegahan penyimpangan, Config Sync akan menghapus semua resource webhook penerimaan Config Sync.
Karena objek ValidatingWebhookConfiguration Config Sync tidak ada lagi,
reconciler Config Sync tidak lagi membuat konfigurasi webhook untuk
resource terkelola.
Untuk menonaktifkan pencegahan penyimpangan, selesaikan langkah-langkah berikut:
Perbarui manifes spesifikasi penerapan untuk menetapkan kolom
spec.configSync.preventDriftkefalse:applySpecVersion: 1 spec: configSync: enabled: false ... existing content ... preventDrift: falseTerapkan manifes yang diupdate:
gcloud beta container fleet config-management apply \ --membership=MEMBERSHIP_NAME \ --config=MANIFEST_NAME \ --project=PROJECT_IDGanti kode berikut:
MEMBERSHIP_NAME: nama keanggotaan fleet yang Anda pilih saat mendaftarkan cluster. Dapatkan nama dengan perintahgcloud container fleet memberships list.MANIFEST_NAME: nama manifes spesifikasi penerapan Anda, biasanyaapply-spec.yaml.PROJECT_ID: project ID Anda.
Mengaktifkan webhook penerimaan di sumber cakupan namespace
Sumber kebenaran yang tercakup dalam namespace tidak sepenuhnya dilindungi oleh webhook. Rekonsiler Config Sync untuk setiap sumber namespace tidak memiliki izin untuk membaca atau mengupdate objek ValidatingWebhookConfiguration di level cluster.
Kurangnya izin ini akan menyebabkan error pada log rekonsiler namespace yang mirip dengan contoh berikut:
Failed to update admission webhook: KNV2013: applying changes to
admission webhook: Insufficient permission. To fix, make sure the reconciler has
sufficient permissions.:
validatingwebhookconfigurations.admissionregistration.k8s.io "admission-
webhook.configsync.gke.io" is forbidden: User "system:serviceaccount:config-
management-system:ns-reconciler-NAMESPACE" cannot update resource
"validatingwebhookconfigurations" in API group "admissionregistration.k8s.io" at
the cluster scope
Anda dapat mengabaikan error ini jika tidak ingin menggunakan perlindungan webhook untuk
sumber kebenaran yang tercakup dalam namespace. Namun, jika Anda ingin menggunakan webhook, berikan
izin kepada rekonsiler untuk setiap sumber tepercaya yang tercakup dalam namespace setelah Anda
mengonfigurasi sinkronisasi dari lebih dari satu sumber tepercaya.
Anda mungkin tidak perlu melakukan langkah-langkah ini jika RoleBinding untuk
ns-reconciler-NAMESPACE sudah ada dengan izin ClusterRole cluster-admin.
Dalam sumber tepercaya root, deklarasikan konfigurasi ClusterRole baru yang memberikan izin ke webhook penerimaan Config Sync. ClusterRole ini hanya perlu ditentukan sekali per cluster:
# ROOT_SOURCE/cluster-roles/webhook-role.yaml apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: admission-webhook-role rules: - apiGroups: ["admissionregistration.k8s.io"] resources: ["validatingwebhookconfigurations"] resourceNames: ["admission-webhook.configsync.gke.io"] verbs: ["get", "update"]Untuk setiap sumber cakupan namespace yang memerlukan izin webhook penerimaan, deklarasikan konfigurasi ClusterRoleBinding untuk memberikan akses ke webhook penerimaan:
# ROOT_SOURCE/NAMESPACE/sync-webhook-rolebinding.yaml kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: syncs-webhook subjects: - kind: ServiceAccount name: ns-reconciler-NAMESPACE namespace: config-management-system roleRef: kind: ClusterRole name: admission-webhook-role apiGroup: rbac.authorization.k8s.ioGanti
NAMESPACEdengan namespace tempat Anda membuat sumber cakupan namespace.Commit perubahan ke root sumber kebenaran, misalnya, jika menyinkronkan dari repositori Git:
git add . git commit -m 'Providing namespace repository the permission to update the admission webhook.' git pushUntuk memverifikasi, gunakan
kubectl getuntuk memastikan ClusterRole dan ClusterRoleBinding telah dibuat:kubectl get clusterrole admission-webhook-role kubectl get clusterrolebindings syncs-webhook
Langkah berikutnya
- Pelajari cara memecahkan masalah webhook.