Mencegah penyimpangan konfigurasi

Config Sync mengurangi risiko "shadow ops" melalui pemulihan mandiri otomatis, sinkronisasi ulang berkala, dan pencegahan penyimpangan opsional. Saat mendeteksi penyimpangan antara cluster dan sumber tepercaya, Config Sync dapat diizinkan dan dikembalikan dengan cepat atau ditolak sepenuhnya.

Self-healing memantau resource yang dikelola, mendeteksi penyimpangan dari sumber tepercaya, dan mengembalikan penyimpangan tersebut. Pemulihan mandiri selalu diaktifkan.

Sinkronisasi ulang berkala otomatis menyinkronkan satu jam setelah sinkronisasi terakhir yang berhasil, meskipun tidak ada perubahan yang dilakukan pada sumber tepercaya. Sinkronisasi ulang berkala selalu diaktifkan.

Meskipun pemulihan mandiri dan sinkronisasi ulang berkala membantu memperbaiki penyimpangan, pencegahan penyimpangan mencegat permintaan untuk mengubah objek terkelola dan memvalidasi apakah perubahan harus diizinkan. Jika perubahan tidak cocok dengan sumber tepercaya, perubahan akan ditolak. Pencegahan penyimpangan dinonaktifkan secara default. Jika diaktifkan, pencegahan penyimpangan melindungi objek RootSync secara default, dan juga dapat dikonfigurasi 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 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. Lakukan perubahan baru ke 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 kebenaran 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 ke 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 kebenaran 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 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