Membagi repositori menjadi beberapa repositori

Saat Anda mengelola ribuan resource Kubernetes di Config Sync, membagi root atau repositori namespace yang besar menjadi beberapa repositori yang lebih kecil akan membantu Anda meningkatkan kecepatan rekonsiliasi dan mencegah kegagalan sinkronisasi.

Di Config Sync, repositori yang disinkronkan mengacu pada kombinasi repositori, cabang, revisi, dan direktori Git. Dengan membagi repositori monolitik di beberapa objek RootSync atau RepoSync, Anda mengurangi jumlah resource yang dilacak dan diterapkan oleh setiap rekonsiler.

Alasan repositori besar menyebabkan masalah sinkronisasi

Jika repositori root Anda berisi banyak resource—misalnya, lebih dari 5.000—Config Sync mungkin mengalami masalah performa atau sinkronisasi karena alasan berikut:

  • Objek ResourceGroup mungkin melebihi batas ukuran objek etcd. Objek ResourceGroup mencatat Grup, Jenis, Namespace, dan Nama semua resource di repositori Git. Resource dalam jumlah besar dapat menghasilkan objek ResourceGroup yang besar.
  • Menyinkronkan repositori besar memerlukan waktu lebih lama daripada menyinkronkan repositori yang lebih kecil karena Config Sync menerapkan resource secara berurutan ke cluster. Jika Config Sync tidak dapat menerapkan resource pada percobaan pertama, Config Sync harus mencoba lagi.

Saat mengalami masalah ini, Anda harus memecah repositori root menjadi beberapa repositori sehingga setiap repositori root mengelola lebih sedikit resource.

Menguraikan repositori root yang tidak terstruktur

Langkah-langkah berikut menggunakan objek RootSync sebagai contoh, tetapi Anda juga dapat menerapkan langkah-langkah ini ke objek RepoSync.

Metode ini berfungsi untuk Config Sync versi 1.21.0 dan yang lebih baru karena finalizer yang ditambahkan dalam rilis tersebut, yang berhenti mengelola objek saat objek RootSync atau RepoSync dihapus. Sebelumnya, objek tanpa induk memiliki metadata persisten, yang mencegahnya dikelola oleh klien lain atau objek RootSync atau RepoSync baru.

Asumsikan bahwa repositori root Anda disinkronkan oleh objek RootSync single-root-sync. Setelah memisahkan repositori, Anda memiliki dua repositori root. Satu disinkronkan oleh objek RootSync root-sync-1, sementara yang lain disinkronkan oleh objek RootSync root-sync-2.

Untuk memisahkan repositori, ikuti langkah-langkah berikut:

  1. Pastikan RootSync single-root-sync memiliki nilai anotasi configsync.gke.io/deletion-propagation-policy Orphan atau tidak ditetapkan. Nilai default jika tidak ditetapkan sama dengan "Orphan". Setelan ini memastikan objek tidak dihapus.

  2. Hapus RootSync single-root-sync:

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. Siapkan repositori baru Anda dengan mengikuti langkah-langkah berikut:

    1. Buat repositori baru atau direktori baru di repositori Git yang ada.
    2. Pindahkan resource ke repositori baru atau direktori baru.
    3. Jika Anda membagi repositori root menjadi lebih dari dua repositori, ulangi langkah-langkah ini sesuai kebutuhan.
  4. Commit dan kirim perubahan:

    git commit -am 'add configuration for the new root repository'
    
  5. Terapkan objek RootSync root-sync-1 dan root-sync-2. Tindakan ini akan menyinkronkan repositori atau direktori baru sehingga objek yang ada di cluster dikelola oleh objek RootSync baru root-sync-1 dan root-sync-2:

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: ROOT_SYNC_NAME
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    Ganti kode berikut:

    • NEW_ROOT_REPOSITORY: URL repositori Git yang akan digunakan sebagai repositori root baru. Anda dapat memasukkan URL menggunakan protokol HTTPS atau SSH. Misalnya, https://github.com/GoogleCloudPlatform/anthos-config-management-samples menggunakan protokol HTTPS. Jika Anda tidak memasukkan protokol, URL akan diperlakukan sebagai URL HTTPS.
    • NEW_ROOT_REVISION: (Opsional) revisi Git (tag atau hash) repositori root baru yang akan diperiksa.
    • NEW_ROOT_BRANCH: (Opsional) cabang repositori root baru yang akan disinkronkan.
    • NEW_ROOT_DIRECTORY: (Opsional) jalur di repositori Git ke direktori root baru yang berisi konfigurasi yang ingin Anda sinkronkan.
    • ROOT_AUTH_TYPE: nilai ini harus sama dengan objek RootSync/root-sync yang ada.
    • ROOT_EMAIL: nilai ini harus sama dengan objek RootSync/root-sync yang ada.
  6. Tunggu hingga objek RootSync root-sync-1 baru disinkronkan. Anda dapat memeriksa statusnya dengan menggunakan perintah berikut:

    nomos status
    

Semua versi

Metode ini berfungsi untuk semua versi Config Sync, termasuk versi 1.21.0, tetapi sebaiknya gunakan metode yang tersedia di versi 1.21.0 dan yang lebih baru karena memerlukan lebih sedikit langkah. Jika versi Config Sync Anda lebih lama dari 1.21.0, Anda dapat menggunakan metode ini.

Asumsikan bahwa repositori root Anda disinkronkan oleh objek RootSync root-sync. Setelah memisahkan repositori, Anda memiliki dua repositori root. Satu disinkronkan oleh objek RootSync root-sync, sementara yang lain disinkronkan oleh objek RootSync root-sync-1.

Untuk memisahkan repositori, ikuti langkah-langkah berikut:

  1. Di repositori root yang ada, pilih resource yang ingin Anda pindahkan ke repositori atau direktori lain, lalu tambahkan anotasi configmanagement.gke.io/managed: disabled ke resource tersebut. Anotasi ini memastikan bahwa objek yang ada di cluster tidak terpengaruh saat Anda memindahkan konfigurasinya dari satu repositori ke repositori lain. Jika Anda menggunakan format Kustomize atau diagram helm, Anda dapat memilih sekitar setengah dari basis dan menambahkan anotasi umum ke file kustomization.yaml, seperti dalam contoh ini:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. Commit dan kirim perubahan: sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. Tunggu hingga objek RootSync root-sync yang ada disinkronkan menggunakan perintah berikut:

    nomos status
    
  4. Siapkan repositori kedua Anda dengan mengikuti langkah-langkah berikut:

    1. Buat repositori baru atau direktori baru di repositori Git yang ada.
    2. Salin resource dengan anotasi configmanagement.gke.io/managed: disabled ke repositori baru atau direktori baru.
    3. Hapus anotasi configmanagement.gke.io/managed: disabled di repositori atau direktori baru.
    4. Jika Anda membagi repositori root menjadi lebih dari dua repositori, ulangi langkah-langkah ini sesuai kebutuhan.
  5. Commit dan kirim perubahan:

    git commit -am 'add configuration for the new root repository'
    
  6. Terapkan objek RootSync root-sync-1 untuk menyinkronkan repositori atau direktori baru sehingga objek yang ada di cluster akan dikelola oleh objek RootSync root-sync-1 yang baru.

     apiVersion: configsync.gke.io/v1beta1
     kind: RootSync
     metadata:
       name: root-sync-1
       namespace: config-management-system
     spec:
       sourceFormat: unstructured
       git:
         repo: NEW_ROOT_REPOSITORY
         revision: NEW_ROOT_REVISION
         branch: NEW_ROOT_BRANCH
         dir: "NEW_ROOT_DIRECTORY"
         auth: ROOT_AUTH_TYPE
         gcpServiceAccountEmail: ROOT_EMAIL
         # secretRef should be omitted if the auth type is none, gcenode, or gcpserviceaccount.
         secretRef:
           name: git-creds
    

    Ganti kode berikut:

    • NEW_ROOT_REPOSITORY: URL repositori Git yang akan digunakan sebagai repositori root baru. Anda dapat memasukkan URL menggunakan protokol HTTPS atau SSH. Misalnya, https://github.com/GoogleCloudPlatform/anthos-config-management-samples menggunakan protokol HTTPS. Jika Anda tidak memasukkan protokol, URL akan diperlakukan sebagai URL HTTPS.
    • NEW_ROOT_REVISION: (Opsional) revisi Git (tag atau hash) repositori root baru yang akan diperiksa.
    • NEW_ROOT_BRANCH: (Opsional) cabang repositori root baru yang akan disinkronkan.
    • NEW_ROOT_DIRECTORY: (Opsional) jalur di repositori Git ke direktori root baru yang berisi konfigurasi yang ingin Anda sinkronkan.
    • ROOT_AUTH_TYPE: nilai ini harus sama dengan objek RootSync/root-sync yang ada.
    • ROOT_EMAIL: nilai ini harus sama dengan objek RootSync/root-sync yang ada.
  7. Tunggu hingga objek RootSync root-sync-1 baru disinkronkan. Anda dapat memeriksa statusnya dengan menggunakan perintah berikut:

    nomos status
    
  8. Hapus resource dengan anotasi configmanagement.gke.io/managed: disabled dari repositori asli. Commit dan kirim perubahan:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. Tunggu hingga objek RootSync root-sync yang ada disinkronkan menggunakan perintah berikut:

    nomos status
    

Menguraikan repositori root hierarkis

Langkah-langkah untuk memecah repositori hierarkis mirip dengan langkah-langkah untuk memecah repositori tidak terstruktur.

Ada tiga perbedaan utama:

  1. Repositori root baru (atau direktori baru) juga harus bersifat hierarkis. Anda perlu menyalin direktori system/ dan clusterregistry/ yang ada ke repositori root baru (atau direktori baru).

  2. Resource dalam namespace tidak dapat tersebar di beberapa repositori. Jika tidak, rekonsiler yang berbeda akan bersaing untuk mengelola namespace.

  3. Objek RootSync root-sync-1 harus menggunakan spec.sourceFormat: hierarchical.

Karena kami merekomendasikan repositori tidak terstruktur, Anda juga dapat mempertimbangkan untuk mengonversi repositori hierarkis menjadi repositori tidak terstruktur sebelum memecahnya.