Mencegah penyimpangan konfigurasi

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.

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:

  1. Perbarui manifes spesifikasi penerapan untuk menetapkan kolom spec.configSync.preventDrift ke true:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: true
        ... existing content ...
        preventDrift: true
    
  2. Terapkan manifes yang diupdate:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Ganti kode berikut:

    • MEMBERSHIP_NAME: nama keanggotaan fleet yang Anda pilih saat mendaftarkan cluster. Dapatkan nama dengan perintah gcloud container fleet memberships list.
    • MANIFEST_NAME: nama manifes spesifikasi penerapan Anda, biasanya apply-spec.yaml.
    • PROJECT_ID: project ID Anda.
  3. Tunggu hingga objek ValidateWebhookConfiguration Config Sync dibuat oleh ConfigManagement Operator:

    kubectl get validatingwebhookconfiguration admission-webhook.configsync.gke.io
    

    Anda akan melihat output yang mirip dengan contoh berikut ini:

    NAME                                  WEBHOOKS   AGE
    admission-webhook.configsync.gke.io   0          2m15s
    
  4. Commit perubahan baru ke sumber kebenaran yang akan disinkronkan sehingga Deployment root-reconciler dapat menambahkan webhook ke objek ValidatingWebhookConfiguration Config Sync. Alternatifnya adalah menghapus Deployment root-reconcilier untuk memicu rekonsiliasi. Deployment root-reconciler yang baru akan mengupdate objek ValidatingWebhookConfiguration Config Sync.

  5. 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:

  1. Perbarui manifes spesifikasi penerapan untuk menetapkan kolom spec.configSync.preventDrift ke false:

    applySpecVersion: 1
    spec:
      configSync:
        enabled: false
        ... existing content ...
        preventDrift: false
    
  2. Terapkan manifes yang diupdate:

    gcloud beta container fleet config-management apply \
        --membership=MEMBERSHIP_NAME \
        --config=MANIFEST_NAME  \
        --project=PROJECT_ID
    

    Ganti kode berikut:

    • MEMBERSHIP_NAME: nama keanggotaan fleet yang Anda pilih saat mendaftarkan cluster. Dapatkan nama dengan perintah gcloud container fleet memberships list.
    • MANIFEST_NAME: nama manifes spesifikasi penerapan Anda, biasanya apply-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.

  1. 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"]
    
  2. 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.io
    

    Ganti NAMESPACE dengan namespace tempat Anda membuat sumber cakupan namespace.

  3. 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 push
    
    
  4. Untuk memverifikasi, gunakan kubectl get untuk memastikan ClusterRole dan ClusterRoleBinding telah dibuat:

    kubectl get clusterrole admission-webhook-role
    kubectl get clusterrolebindings syncs-webhook
    

Langkah berikutnya