Mencegah penyimpangan konfigurasi

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).

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:

  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. Lakukan perubahan baru pada sumber tepercaya 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 baru akan memperbarui 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

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:

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

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

    Ganti NAMESPACE dengan namespace tempat Anda membuat sumber yang tercakup dalam namespace.

  3. 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 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