Mengelola objek cluster yang ada

Saat Config Sync mengelola objek cluster, ia akan mengamati objek dan rangkaian konfigurasi dalam repo yang memengaruhi objek tersebut, dan memastikan bahwa objek tersebut sinkron. Topik ini menjelaskan cara mulai mengelola objek yang ada dan cara berhenti mengelola objek yang saat ini dikelola tanpa menghapus objek tersebut.

Sebuah objek dalam cluster dikelola oleh Config Sync jika objek tersebut memiliki anotasi configmanagement.gke.io/managed: enabled, dan anotasi configsync.gke.io/resource-id-nya, yang melacak informasi grup, jenis, namespace, dan nama objek, sudah benar.

Format anotasi configsync.gke.io/resource-id adalah GROUP_KIND_NAMESPACE_NAME untuk objek cakupan namespace, dan GROUP_KIND_NAME untuk objek cakupan cluster.

Diagram alur berikut menjelaskan beberapa situasi yang menyebabkan objek dikelola atau tidak dikelola:

Cara mengelola atau tidak mengelola objek Kubernetes menggunakan Config Sync

Diagram ini berisi tiga alur terpisah: 1) mulai mengelola objek, 2) berhenti mengelola objek, dan 3) menghapus objek terkelola.

  1. Saya ingin mulai mengelola sebuah objek. Apakah objek memiliki manifes? Atau dengan kata lain, apakah objek memiliki konfigurasi di repo?
    • No: Buat konfigurasi untuk objek. Config Sync menetapkan anotasi configmanagement.gke.io/managed: enabled, menetapkan anotasi configsync.gke.io/resource-id agar cocok dengan objek, dan mulai mengelola objek tersebut.
    • Yes: Apakah konfigurasi menetapkan anotasi berikut? configmanagement.gke.io/managed: disabled
      • No: Objek dikelola secara default.
      • Yes: Edit konfigurasi untuk menghapus anotasi configmanagement.gke.io/managed: disabled. Saat perubahan dikirim ke repo sumber, Config Sync akan melihat perubahan tersebut, menerapkan anotasi configmanagement.gke.io/managed: enabled dan anotasi configsync.gke.io/resource-id, dan menerapkan konfigurasi.
  2. Saya ingin berhenti mengelola objek, tetapi tidak ingin menghapusnya.
    • Edit konfigurasi untuk objek dalam repo, dan tetapkan anotasi configmanagement.gke.io/managed: disabled. Saat perubahan konfigurasi terdeteksi, Config Sync akan berhenti mengelola objek.
  3. Saya ingin berhenti mengelola objek dan menghapusnya.
    • Hapus konfigurasi objek dari repo. Saat Anda menghapus konfigurasi untuk objek yang sebelumnya dikelola, Config Sync akan menghapus objek tersebut dari semua cluster atau namespace tempat konfigurasi diterapkan.

Selain anotasi configmanagement.gke.io/managed: enabled dan anotasi configsync.gke.io/resource-id, Sinkronisasi Konfigurasi menerapkan label app.kubernetes.io/managed-by: configmanagement.gke.io ke semua objek yang dikelola. Label ini memungkinkan Anda mencantumkan semua objek oleh Config Sync dengan mudah.

Mengapa tidak menerapkan anotasi secara manual?

Config Sync menggunakan model deklaratif untuk menerapkan perubahan konfigurasi ke cluster Anda dengan membaca konfigurasi yang diinginkan dari repo Anda. Jika Anda mencoba menerapkan anotasi secara manual (baik menggunakan perintah kubectl maupun Kubernetes API), Config Sync akan otomatis mengganti manual dengan konten repo Anda.

Sebelum memulai

Contoh berikut dibuat berdasarkan Memulai Config Sync. Sebelum memulai langkah-langkah berikut, ikuti panduan memulai dan selesaikan semua langkah sebelum Mempelajari dan menguji penginstalan Config Sync.

Menampilkan daftar semua objek terkelola

Untuk mencantumkan semua objek yang dikelola oleh Config Sync pada cluster atau namespace tertentu, gunakan pemilih label seperti berikut:

kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by=configmanagement.gke.io"

Untuk mencantumkan semua objek yang tidak dikelola oleh Config Sync, gunakan pemilih label seperti ini:

kubectl get object-type -n namespace -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"

Misalnya, perintah ini mencantumkan RoleBinding di namespace gamestore yang dikelola oleh Config Sync:

kubectl get rolebindings -n gamestore \
    -l "app.kubernetes.io/managed-by=configmanagement.gke.io"

Outputnya mirip dengan hal berikut ini:

NAME                              ROLE                                          AGE
configsync.gke.io:ns-reconciler   ClusterRole/configsync.gke.io:ns-reconciler   34h
gamestore-admin                   ClusterRole/admin                             34h
gamestore-webstore-admin          ClusterRole/webstore-admin                    34h

Perintah ini mencantumkan RoleBinding di namespace kube-system yang tidak dikelola oleh Config Sync:

kubectl get rolebindings -n kube-system \
    -l "app.kubernetes.io/managed-by!=configmanagement.gke.io"

Outputnya mirip dengan hal berikut ini:

NAME                                             AGE
fluentd-gcp-scaler-binding                       2d21h
gce:cloud-provider                               2d21h
heapster-binding                                 2d21h
metrics-server-auth-reader                       2d21h
system::leader-locking-kube-controller-manager   2d21h
system::leader-locking-kube-scheduler            2d21h
system:controller:bootstrap-signer               2d21h
system:controller:cloud-provider                 2d21h
system:controller:token-cleaner                  2d21h

Mulai mengelola objek yang ada

Anda dapat membuat konfigurasi untuk objek Kubernetes yang ada, seperti namespace yang sudah ada di cluster sebelum menginstal Config Sync. Namun, konfigurasi ini akan diabaikan kecuali jika objek memiliki anotasi configmanagement.gke.io/managed: enabled dan memiliki anotasi configsync.gke.io/resource-id yang benar. Untuk objek yang ada, Anda perlu menerapkan anotasi secara manual.

Khusus untuk namespace, Config Sync menerapkan konfigurasi yang membuat objek baru dalam namespace yang tidak dianotasi, dan menerapkan anotasi configmanagement.gke.io/managed: enabled dan configsync.gke.io/resource-id ke objek tersebut. Namun, Config Sync menolak untuk mengubah atau menghapus objek cakupan cluster yang tidak diberi anotasi dari cluster. Hal ini diilustrasikan dalam diagram di bagian Bekerja dengan konfigurasi dari waktu ke waktu.

Contoh berikut menunjukkan cara mengelola objek Peran yang ada. Pertama, Anda membuat Peran secara manual, lalu mulai mengelolanya dengan Config Sync.

  1. Buat Peran myrole dalam namespace gamestore:

    kubectl create role -n gamestore myrole --verb=get --resource=pods
  2. Lihat izin yang diberikan oleh Peran myrole:

    kubectl describe role -n gamestore myrole
    Name:         myrole
    Labels:       <none>
    Annotations:  <none>
    PolicyRule:
      Resources  Non-Resource URLs  Resource Names  Verbs
      ---------  -----------------  --------------  -----
      pods       []                 []              [get]
    

    Peran ini hanya memiliki izin ke get Pod.

  3. Pada tahap ini, Peran ada di cluster, tetapi Config Sync tidak mengetahui peran tersebut.

    1. Di terminal, buka clone lokal repo Anda.
    2. Gunakan perintah berikut untuk membuat manifes YAML untuk myrole dan menyimpan manifes tersebut ke dalam file baru bernama gamestore-myrole.yaml.

      kubectl get role myrole -n gamestore -o yaml > gamestore-myrole.yaml
      
    3. Edit file gamestore-myrole.yaml.

      1. Hapus semua kolom di bawah kunci metadata, kecuali name dan namespace.
      2. Tambahkan kata kerja list setelah get di kolom daftar rules.verbs.

      Simpan perubahan. File yang dihasilkan memiliki konten berikut:

      apiVersion: rbac.authorization.k8s.io/v1
      kind: Role
      metadata:
        name: myrole
        namespace: gamestore
      rules:
      - apiGroups:
        - ""
        resources:
        - pods
        verbs:
        - get
        - list
      
    4. Commit perubahan ke repo.

    5. Tunggu beberapa saat sampai Operator ConfigManagement melihat commit. Untuk memverifikasi bahwa Peran myrole sekarang dikelola oleh Config Sync, jalankan kubectl describe lagi.

      kubectl describe role myrole -n gamestore
      

Perhatikan anotasi configmanagement.gke.io/managed: enabled, yang menunjukkan bahwa objek dikelola oleh Config Sync, dan anotasi configsync.gke.io/resource-id, yang melacak informasi grup, jenis, namespace, dan nama. Selain itu, perhatikan anotasi yang menampilkan jalur dan nama file dalam repo yang menyebabkan perubahan konfigurasi terbaru pada objek, dan hash Git yang merepresentasikan commit.

Name:         myrole
Labels:       app.kubernetes.io/managed-by=configmanagement.gke.io
              configsync.gke.io/declared-version=v1
Annotations:  config.k8s.io/owning-inventory: config-management-system_root-sync
              configmanagement.gke.io/cluster-name: my-cluster
              configmanagement.gke.io/managed: enabled
              configmanagement.gke.io/source-path: config-sync-quickstart/multirepo/root/gamestore-myrole.yaml
              configmanagement.gke.io/token: 747b843a7ddbd945c0616034a935cf648b58e7b5
              configsync.gke.io/declared-fields: {"f:rules":{}}
              configsync.gke.io/git-context: {"repo":"https://github.com/GoogleCloudPlatform/anthos-config-management-samples","branch":"main","rev":"HEAD"}
              configsync.gke.io/manager: :root
              configsync.gke.io/resource-id: rbac.authorization.k8s.io_role_gamestore_myrole
PolicyRule:
  Resources  Non-Resource URLs  Resource Names  Verbs
  ---------  -----------------  --------------  -----
  pods       []                 []              [get list]

Berhenti mengelola objek terkelola

Contoh ini menunjukkan cara berhenti mengelola objek yang saat ini dikelola oleh Config Sync, seperti Peran myrole di Mulai mengelola objek yang ada.

  1. Edit file config-sync-quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml di clone lokal repo Anda, lalu tambahkan bagian annotations: yang cocok dengan teks tebal di bawah ini:

     kind: RoleBinding
     apiVersion: rbac.authorization.k8s.io/v1
     metadata:
       annotations:
         configmanagement.gke.io/managed: disabled
       name: gamestore-webstore-admin
       namespace: gamestore
     subjects:
     - kind: ServiceAccount
       name: ns-reconciler-gamestore
       namespace: config-management-system
     roleRef:
       kind: ClusterRole
       name: webstore-admin
       apiGroup: rbac.authorization.k8s.io
    

    Simpan file.

  2. Buat commit Git dengan perubahan Anda, lalu kirim commit ke repo tersebut.

  3. Tunggu beberapa saat agar Config Sync mengetahui dan menerapkan commit baru.

  4. Gunakan perintah berikut untuk memastikan anotasi dan label RoleBinding gamestore-webstore-admin kosong. Config Sync tidak menetapkan anotasi configmanagement.gke.io/managed ke disabled pada objek tersebut.

    kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
    
    apiVersion: rbac.authorization.k8s.io/v1
    metadata:
      annotations:
      name: gamestore-webstore-admin
      namespace: gamestore
    subjects:
    - kind: ServiceAccount
      name: ns-reconciler-gamestore
      namespace: config-management-system
    roleRef:
      kind: ClusterRole
      name: webstore-admin
      apiGroup: rbac.authorization.k8s.io
    

Setelah memastikan bahwa objek kini dinonaktifkan, Anda dapat menghapus konfigurasi dari repositori dan memverifikasi bahwa objek yang sekarang tidak dikelola tidak dihapus dari namespace. Jika ingin mengelola objek ini lagi, Anda harus menambahkan konfigurasinya kembali ke repositori Anda. Oleh karena itu, Anda mungkin perlu tidak mengelola objek dan membiarkan konfigurasinya di repo.

Setelah tidak dikelola, objek tidak akan dibuat atau dibuat ulang pada cluster baru atau yang sudah ada, dan objek tidak dihapus meskipun ada. Untuk melanjutkan pengelolaan objek yang sebelumnya Anda hentikan pengelolaannya, lihat contoh berikutnya, Melanjutkan pengelolaan objek yang sebelumnya tidak dikelola.

Melanjutkan pengelolaan objek yang sebelumnya tidak dikelola

Contoh ini menunjukkan cara melanjutkan pengelolaan objek yang sebelumnya Anda hapus dari pengelolaan, seperti dalam Berhenti mengelola objek yang ada. Dengan asumsi bahwa Anda belum menghapus konfigurasi untuk RoleBinding gamestore-webstore-admin.

  1. Jika Anda menghapus RoleBinding gamestore-webstore-admin dari repositori Anda di commit terakhir, lakukan langkah-langkah berikut.

    1. Gunakan git revert untuk mengembalikan commit terakhir:

      git revert HEAD~1
      

      Anda akan diminta untuk mengonfirmasi operasi pengembalian.

    2. Kirim commit pengembalian ke repo Anda.

      git push
      
  2. Edit file config-sync-quickstart/multirepo/root/rolebinding-gamestore-webstore-admin.yaml di clone lokal repo Anda, lalu hapus anotasi configmanagement.gke.io/managed: disabled. Simpan file.

  3. Komitmen dan dorong perubahan Anda. Config Sync melakukan hal berikut:

    • Memperhatikan perubahan
    • Menerapkan anotasi configmanagement.gke.io/managed: enabled dan anotasi configsync.gke.io/resource-id; objek kini dikelola.
    • Menerapkan konfigurasi, seperti yang akan terjadi pada objek terkelola apa pun.
  4. Untuk memastikan bahwa objek sekarang dikelola, cantumkan anotasinya:

    kubectl get rolebinding gamestore-webstore-admin -n gamestore -o yaml
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      annotations:
        configmanagement.gke.io/cluster-name: my-cluster
        configmanagement.gke.io/managed: enabled
        configsync.gke.io/resource-id: rbac.authorization.k8s.io_rolebinding_gamestore_gamestore-webstore-admin
    ...
    

Berhenti mengelola namespace

Anda dapat berhenti mengelola namespace dengan cara yang sama seperti berhenti mengelola jenis objek apa pun. Jika ingin berhenti mengelola resource lain di dalam namespace, lakukan langkah-langkah berikut:

  1. Tambahkan anotasi configmanagement.gke.io/managed:disabled ke konfigurasi namespace dan semua konfigurasi dalam namespace yang sama. Semua objek dalam namespace harus memiliki anotasi ini.

  2. Commit dan kirim perubahan Anda ke repo. Tunggu hingga Operator disinkronkan dengan repo.

  3. Hapus resource yang tidak dikelola dari repositori.

Jika konfigurasi untuk konfigurasi terkelola ada dalam direktori namespace yang tidak dikelola, rekonsiler akan mencatat error, tetapi konfigurasi lainnya akan terus disinkronkan secara normal.

Menghapus resource terkelola

Saat Anda menghapus resource individual dari sumber tepercaya, objek tersebut akan dihapus dari cluster saat berikutnya Config Sync disinkronkan dari sumber tepercaya. Atau, pada Config Sync versi 1.16.0 dan yang lebih baru, Anda dapat mengaktifkan penerapan penghapusan yang memungkinkan Anda menghapus objek secara massal.

Menghapus objek satu per satu

Dengan perilaku default Config Sync, saat Anda menghapus objek dari sumber tepercaya, objek tersebut akan dihapus dari cluster saat Config Sync disinkronkan dari sumber tepercaya.

Ada beberapa cara untuk memeriksa status Config Sync atau status objek tertentu:

Menghapus objek secara massal

Secara default, menghapus RootSync atau RepoSync akan menyebabkan Config Sync mengabaikan objek yang sebelumnya diterapkan dari sumber tepercaya. Di Config Sync versi 1.16.0 dan yang lebih baru, Anda dapat mengaktifkan penerapan penghapusan untuk menghapus semua objek yang diterapkan sebelumnya.

Saat Anda mengaktifkan propagasi penghapusan pada objek RootSync atau RepoSync, lalu menghapus objek tersebut, Config Sync akan otomatis menghapus setiap objek yang dikelola oleh RootSync atau RepoSync tersebut.

Penerapan penghapusan dapat mempermudah pembersihan resource, misalnya jika Anda bermigrasi ke namespace atau cluster baru, melakukan pembersihan setelah demo atau eksperimen, atau meng-uninstal aplikasi.

Opsi penerapan penghapusan

Propagasi delasi dinonaktifkan secara default. Untuk mengaktifkan penerapan penghapusan, Anda menambahkan anotasi configsync.gke.io/deletion-propagation-policy: Foreground ke objek RootSync atau RepoSync, seperti dalam contoh berikut:

# example-rootsync.yaml
apiVersion: configsync.gke.io/v1beta1
kind: RootSync
metadata:
  name: example-rootsync
  namespace: config-management-system
  annotations:
    configsync.gke.io/deletion-propagation-policy: Foreground
spec:
  sourceType: git
  sourceFormat: unstructured
  git:
    repo: https://github.com/GoogleCloudPlatform/anthos-config-management-samples
    branch: init
    dir: config-sync-quickstart/multirepo/root
    auth: none
    period: 30s

Atau, Anda dapat mengupdate RootSync atau RepoSync yang ada agar menggunakan propagasi penghapusan dengan menjalankan perintah berikut:

RootSync

kubectl patch RootSync ROOTSYNC_NAME \
  --namespace config-management-system \
  --type merge \
  --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'

Ganti ROOTSYNC_NAME dengan nama RootSync yang ingin diupdate.

RepoSync

kubectl patch RepoSync REPOSYNC_NAME \
  --namespace config-management-system \
  --type merge \
  --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'

Ganti REPOSYNC_NAME dengan nama RepoSync yang ingin diupdate.

Untuk menonaktifkan penerapan penghapusan, hapus anotasi atau ubah nilai menjadi configsync.gke.io/deletion-propagation-policy: Orphan:

RootSync

kubectl patch RootSync ROOTSYNC_NAME \
  --namespace config-management-system \
  --type merge \
  --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Orphan"}}}'

Ganti ROOTSYNC_NAME dengan nama RootSync yang ingin diupdate.

RepoSync

kubectl patch RepoSync REPOSYNC_NAME \
  --namespace config-management-system \
  --type merge \
  --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Orphan"}}}'

Memperluas penghapusan objek

Contoh ini menunjukkan cara menerapkan penerapan penghapusan ke objek RootSync atau RepoSync, lalu menghapus RootSync atau RepoSync untuk menghapus semua objek yang dikelola oleh RootSync atau RepoSync.

RootSync

  1. Terapkan anotasi ke objek RootSync untuk mengaktifkan penerapan penghapusan:

    kubectl patch RootSync example-rootsync \
      --namespace config-management-system \
      --type merge \
      --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
    
  2. Hapus objek RootSync dan tunggu sampai Config Sync menghapusnya:

    kubectl delete RootSync example-rootsync --namespace config-management-system --wait
    

    Penghapusan RootSync dapat memerlukan waktu beberapa menit.

RepoSync

  1. Terapkan anotasi ke objek RepoSync untuk mengaktifkan penerapan penghapusan:

    kubectl patch RepoSync example-reposync \
      --namespace example-namespace \
      --type merge \
      --patch '{"metadata":{"annotations":{"configsync.gke.io/deletion-propagation-policy":"Foreground"}}}'
    
  2. Hapus objek RepoSync dan tunggu sampai Config Sync menghapusnya:

    kubectl delete RepoSync example-reposync --namespace example-namespace --wait
    

    Penghapusan RepoSync dapat memerlukan waktu beberapa menit.

Mencegah penghapusan untuk objek Kubernetes

Setelah Anda menghapus objek Kubernetes dari repositori Git yang dikelola oleh Config Sync, objek ini juga akan dihapus dari cluster saat commit baru disinkronkan ke cluster.

Jika Anda ingin mencegah Config Sync menghapus objek saat konfigurasinya dihapus dari repositori Git, Anda dapat melakukan langkah-langkah berikut:

  1. Tambahkan anotasi client.lifecycle.config.k8s.io/deletion: detach ke konfigurasi objek di repositori Git.

  2. Commit dan kirim perubahan di repositori Git.

  3. Tunggu sampai perubahan disinkronkan ke cluster.

Setelah Anda menyelesaikan langkah-langkah ini, Config Sync tidak akan menghapus objek ini dari cluster saat konfigurasinya dihapus dari repositori Git, tetapi masih dapat dihapus oleh klien lain.

Mengabaikan objek dalam sumber kebenaran

Anda mungkin ingin Config Sync mengabaikan objek dalam sumber tepercaya. Misalnya, konfigurasi fungsi kpt tidak boleh diterapkan ke cluster.

Untuk objek yang ingin diabaikan oleh Config Sync, tambahkan anotasi config.kubernetes.io/local-config: "true" ke objek tersebut. Setelah Anda menambahkan anotasi ini, Config Sync akan mengabaikan objek ini seolah-olah dihapus dari sumber tepercaya. Resource dengan anotasi local-config yang ditetapkan ke nilai apa pun selain "false" akan diperlakukan seolah-olah ditetapkan ke "true" dan diabaikan.