Config Sync menyediakan dua cara untuk mengelola penyimpangan:
- Menggunakan pemulihan mandiri bawaan Config Sync (Direkomendasikan, tidak perlu konfigurasi): Config Sync secara otomatis mendeteksi dan mengembalikan penyimpangan. Anda tidak dapat menonaktifkan pemulihan mandiri Config Sync. Perbaikan mandiri memiliki dampak minimal terhadap performa.
- Aktifkan fitur pencegahan penyimpangan (halaman ini): pencegahan penyimpangan menggunakan webhook penerimaan untuk memblokir perubahan yang bertentangan. Fitur ini dapat menyebabkan penggunaan memori yang tinggi dan error out-of-memory (OOM), terutama di cluster dengan banyak CustomResourceDefinition (CRD).
Alasan pencegahan penyimpangan tidak direkomendasikan
Webhook penerimaan mengharuskan Config Sync memuat skema OpenAPI Kubernetes untuk memvalidasi permintaan. Di cluster dengan banyak resource atau CRD, pemrosesan skema ini dapat melampaui batas memori, sehingga menyebabkan kegagalan komponen. Untuk sebagian besar kasus penggunaan, perbaikan mandiri bawaan Config Sync memberikan perlindungan terhadap penyimpangan tanpa risiko stabilitas webhook.
Jika diaktifkan, pencegahan penyimpangan melindungi objek RootSync secara default. Anda dapat
mengonfigurasi fitur untuk melindungi objek RepoSync. Untuk menggunakan pencegahan penyimpangan, Anda harus mengaktifkan
RootSync dan RepoSync API.
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 Cloud de Confiance .
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 2m15sLakukan perubahan baru pada sumber tepercaya yang akan disinkronkan sehingga Deployment
root-reconcilerdapat menambahkan webhook ke objek ValidatingWebhookConfiguration Config Sync. Alternatifnya adalah menghapus Deploymentroot-reconcilieruntuk memicu rekonsiliasi. Deploymentroot-reconcilerbaru akan memperbarui 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
Jika Anda menonaktifkan pencegahan penyimpangan, Config Sync akan menghapus semua resource webhook penerimaan Config Sync.
Karena objek ValidatingWebhookConfiguration Config Sync tidak ada lagi,
rekonsiliasi Config Sync tidak lagi menghasilkan 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 tepercaya yang memiliki cakupan namespace tidak sepenuhnya dilindungi oleh webhook. Rekonsiliasi Config Sync untuk setiap sumber namespace tidak memiliki izin untuk membaca atau mengupdate objek ValidatingWebhookConfiguration di tingkat cluster.
Kurangnya izin ini akan menyebabkan error pada log rekonsiliasi 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 tepercaya yang tercakup dalam namespace. Namun, jika Anda ingin menggunakan webhook, berikan
izin kepada reconciler 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.
Di sumber tepercaya root, deklarasikan konfigurasi ClusterRole baru yang memberikan izin ke webhook penerimaan Config Sync. ClusterRole ini hanya perlu ditentukan satu kali 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 yang tercakup dalam namespace tempat izin webhook penerimaan perlu diberikan, 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 yang tercakup dalam namespace.Lakukan perubahan pada sumber tepercaya utama, 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.