Mencegah penyimpangan konfigurasi

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

Pemulihan mandiri memantau resource terkelola, mendeteksi penyimpangan dari sumber tepercaya, dan mengembalikan penyimpangan tersebut. Pemulihan mandiri selalu diaktifkan.

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

Meskipun perbaikan mandiri dan sinkronisasi ulang berkala membantu memperbaiki drift, pencegahan drift mencegat permintaan untuk mengubah objek terkelola dan memvalidasi apakah perubahan tersebut harus diizinkan. Jika perubahan tidak cocok dengan sumber tepercaya, perubahan tersebut akan ditolak. Pencegahan drift dinonaktifkan secara default. Jika diaktifkan, pencegahan drift akan melindungi objek RootSync secara default, dan juga dapat dikonfigurasi untuk melindungi objek RepoSync.

Untuk menggunakan pencegahan drift, Anda harus mengaktifkan RootSync dan RepoSync API.

Mengaktifkan pencegahan drift

  1. Tetapkan kolom preventDrift dalam file konfigurasi ke true dan terapkan file konfigurasi:

    gcloud

    Aktifkan pencegahan penyimpangan menggunakan gcloud CLI jika Anda menginstal Config Sync menggunakan Konsol Google Cloud atau gcloud CLI. Pastikan untuk mengupdate gcloud CLI ke versi terbaru. Tetapkan kolom spec.configSync.preventDrift file konfigurasi gcloud ke true, lalu terapkan file konfigurasi gcloud.

    kubectl (1.19.2 atau yang lebih lama)

    Aktifkan pencegahan penyimpangan menggunakan kubectl jika Anda menginstal Config Sync secara manual menggunakan kubectl. Tetapkan kolom spec.preventDrift objek ConfigManagement ke true, lalu terapkan objek ConfigManagement.

  2. Tunggu hingga objek ValidateWebhookConfiguration Config Sync dibuat oleh Operator ConfigManagement:

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

  4. Tunggu hingga server webhook siap. Log Deployment webhook izin 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

gcloud

Nonaktifkan pencegahan penyimpangan menggunakan gcloud CLI jika Anda menginstal Config Sync menggunakan Konsol Google Cloud atau gcloud CLI. Pastikan untuk mengupdate gcloud CLI ke versi terbaru. Tetapkan kolom spec.configSync.preventDrift file konfigurasi gcloud ke false atau hapus kolom, lalu terapkan file konfigurasi gcloud.

kubectl (1.19.2 atau yang lebih lama)

Nonaktifkan pencegahan penyimpangan menggunakan kubectl jika Anda menginstal Config Sync secara manual menggunakan kubectl. Tetapkan kolom spec.preventDrift objek ConfigManagement ke false atau hapus kolom, lalu terapkan objek ConfigManagement.

Tindakan ini akan menghapus semua resource webhook izin Config Sync. Karena objek ValidatingWebhookConfiguration Config Sync tidak ada lagi, penyerta Config Sync tidak lagi membuat konfigurasi webhook untuk resource terkelola.

Mengaktifkan webhook izin di sumber cakupan namespace

Sumber tepercaya cakupan namespace tidak sepenuhnya dilindungi oleh webhook. Penggabung Config Sync untuk setiap sumber namespace tidak memiliki izin untuk membaca atau memperbarui objek ValidatingWebhookConfiguration di tingkat cluster.

Kurangnya izin ini akan menyebabkan error pada log penyesuai 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 cakupan namespace. Namun, jika Anda ingin menggunakan webhook, berikan izin ke rekonsiliator untuk setiap sumber tepercaya cakupan 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 root source of truth, deklarasikan konfigurasi ClusterRole baru yang memberikan izin ke webhook izin 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 cakupan 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 cakupan namespace.

  3. Lakukan perubahan ke sumber tepercaya root, 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
    

Menonaktifkan pencegahan drift untuk resource yang ditinggalkan

Saat Anda menghapus objek RootSync atau RepoSync, secara default Config Sync tidak mengubah resource yang sebelumnya dikelola oleh objek RootSync atau RepoSync tersebut. Hal ini dapat meninggalkan beberapa label dan anotasi yang digunakan Config Sync untuk melacak objek resource ini. Jika perlindungan drift diaktifkan, hal ini dapat menyebabkan perubahan pada resource yang dikelola sebelumnya ditolak.

Jika Anda tidak menggunakan penyebaran penghapusan, objek resource yang tertinggal mungkin masih mempertahankan label dan anotasi yang ditambahkan oleh Config Sync.

Jika Anda ingin mempertahankan resource terkelola ini, batalkan pengelolaan resource ini sebelum menghapus objek RootSync atau RepoSync dengan menetapkan anotasi configmanagement.gke.io/managed ke disabled di setiap resource terkelola yang dideklarasikan di sumber tepercaya. Tindakan ini akan memberi tahu Config Sync untuk menghapus label dan anotasi dari resource terkelola, tanpa menghapus resource ini. Setelah sinkronisasi selesai, Anda dapat menghapus objek RootSync atau RepoSync.

Jika ingin menghapus resource terkelola ini, Anda memiliki dua opsi:

  • Hapus resource terkelola dari sumber tepercaya. Kemudian, Config Sync akan menghapus objek terkelola dari cluster. Setelah sinkronisasi selesai, Anda dapat menghapus objek RootSync atau RepoSync.
  • Aktifkan penyebaran penghapusan pada objek RootSync atau RepoSync sebelum menghapusnya. Kemudian, Config Sync akan menghapus objek terkelola dari cluster.

Jika objek RootSync atau RepoSync dihapus sebelum membatalkan pengelolaan atau menghapus resource yang dikelolanya, Anda dapat membuat ulang objek RootSync atau RepoSync, dan objek tersebut akan mengadopsi resource di cluster yang cocok dengan sumber tepercaya. Kemudian, Anda dapat menghentikan pengelolaan atau menghapus resource, menunggu perubahan disinkronkan, dan menghapus objek RootSync atau RepoSync lagi.

Langkah selanjutnya