Suddividere un repository in più repository

Questa pagina mostra come dividere in modo sicuro un repository radice in due o più repository radice. I passaggi possono essere applicati anche ai repository dello spazio dei nomi.

Un repository sincronizzato da Config Sync si riferisce alla combinazione di un repository Git, un ramo, una revisione e una directory.

Quando nel repository principale è presente un numero elevato di risorse, ad esempio più di 5000, Config Sync potrebbe non funzionare correttamente per i seguenti due motivi:

  1. L'oggetto ResourceGroup potrebbe superare il limite di dimensioni dell'oggetto etcd. L'oggetto ResourceGroup registra il gruppo, il tipo, lo spazio dei nomi e il nome di tutte le risorse nel repository Git. Un numero elevato di risorse comporta un oggetto ResourceGroup di grandi dimensioni.
  2. La sincronizzazione di tutte le risorse richiede più tempo rispetto a un repository con un numero inferiore di risorse. Config Sync applica le risorse in sequenza al cluster. A volte le risorse non possono essere applicate correttamente la prima volta e Config Sync deve riprovare ad applicarle.

Quando riscontri questi problemi, puoi dividere il repository principale in più repository in modo che ognuno contenga meno risorse.

Dividere un repository radice non strutturato

Gli oggetti RootSync vengono utilizzati per spiegare i passaggi. I passaggi possono essere applicati anche agli oggetti RepoSync.

Questo metodo funziona per Config Sync versione 1.21.0 e successive grazie a un finalizzatore aggiunto in questa release, che interrompe la gestione degli oggetti quando viene eliminato un oggetto RootSync o RepoSync. In precedenza, gli oggetti orfani avevano metadati persistenti, il che impediva loro di essere gestiti da altri client o da nuovi oggetti RootSync o RepoSync.

Supponi che il repository principale sia sincronizzato dall'oggetto RootSync single-root-sync. Dopo aver suddiviso il repository, avrai due repository radice. Uno viene sincronizzato dall'oggetto RootSync root-sync-1, mentre l'altro viene sincronizzato dall'oggetto RootSync root-sync-2.

Per suddividere il repository:

  1. Assicurati che RootSync single-root-sync abbia il valore dell'annotazione configsync.gke.io/deletion-propagation-policy Orphan o che non sia impostato. Il valore predefinito quando non è impostato è lo stesso di "Orfano". Questa impostazione garantisce che gli oggetti non vengano eliminati.

  2. Elimina RootSync single-root-sync:

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. Configura i nuovi repository seguendo questi passaggi:

    1. Crea un nuovo repository o una nuova directory nel repository Git esistente.
    2. Sposta le risorse nel nuovo repository o nella nuova directory.
    3. Se dividi il repository principale in più di due repository, ripeti questi passaggi in base alle necessità.
  4. Esegui il commit e il push della modifica:

    git commit -am 'add configuration for the new root repository'
    
  5. Applica gli oggetti RootSync root-sync-1 e root-sync-2. In questo modo, il nuovo repository o la nuova directory vengono sincronizzati in modo che gli oggetti esistenti nel cluster vengano gestiti dai nuovi oggetti RootSync root-sync-1 e 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
    

    Sostituisci quanto segue:

    • NEW_ROOT_REPOSITORY: l'URL del repository Git da utilizzare come nuovo repository principale. Puoi inserire gli URL utilizzando il protocollo HTTPS o SSH. Ad esempio, https://github.com/GoogleCloudPlatform/anthos-config-management-samples utilizza il protocollo HTTPS. Se non inserisci un protocollo, l'URL viene trattato come un URL HTTPS.
    • NEW_ROOT_REVISION: (facoltativo) la revisione Git (tag o hash) del nuovo repository principale da estrarre.
    • NEW_ROOT_BRANCH: (facoltativo) il ramo del nuovo repository radice da cui eseguire la sincronizzazione.
    • NEW_ROOT_DIRECTORY: (Facoltativo) il percorso nel repository Git della nuova directory principale che contiene la configurazione da sincronizzare.
    • ROOT_AUTH_TYPE: questo valore deve essere uguale all'oggetto RootSync/root-sync esistente.
    • ROOT_EMAIL: questo valore deve essere uguale all'oggetto RootSync/root-sync esistente.
  6. Attendi la sincronizzazione del nuovo oggetto RootSync root-sync-1. Puoi controllare lo stato utilizzando il seguente comando:

    nomos status
    

Qualsiasi versione

Questo metodo funziona per qualsiasi versione di Config Sync, inclusa la versione 1.21.0, ma ti consigliamo di utilizzare il metodo disponibile nella versione 1.21.0 e successive perché richiede meno passaggi. Se la tua versione di Config Sync è precedente alla 1.21.0, puoi utilizzare questo metodo.

Supponi che il repository principale sia sincronizzato dall'oggetto RootSync root-sync. Dopo aver suddiviso il repository, avrai due repository radice. Uno viene sincronizzato dall'oggetto RootSync root-sync, mentre l'altro viene sincronizzato dall'oggetto RootSync root-sync-1.

Per suddividere il repository:

  1. Nel repository principale esistente, scegli le risorse che prevedi di spostare in un repository o una directory diversi e aggiungi l'annotazione configmanagement.gke.io/managed: disabled. Questa annotazione garantisce che gli oggetti esistenti nel cluster non vengano interessati quando sposti la loro configurazione da un repository a un altro. Se utilizzi il formato Kustomize o i grafici Helm, puoi scegliere circa la metà delle basi e aggiungere l'annotazione comune al file kustomization.yaml, come in questo esempio:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. Esegui il commit e il push della modifica: sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. Attendi la sincronizzazione dell'oggetto RootSync root-sync esistente utilizzando il seguente comando:

    nomos status
    
  4. Per configurare il secondo repository:

    1. Crea un nuovo repository o una nuova directory nel repository Git esistente.
    2. Copia le risorse con l'annotazione configmanagement.gke.io/managed: disabled nel nuovo repository o nella nuova directory.
    3. Rimuovi l'annotazione configmanagement.gke.io/managed: disabled nel nuovo repository o directory.
    4. Se dividi il repository principale in più di due repository, ripeti questi passaggi in base alle necessità.
  5. Esegui il commit e il push della modifica:

    git commit -am 'add configuration for the new root repository'
    
  6. Applica un oggetto RootSync root-sync-1 per sincronizzare il nuovo repository o la nuova directory in modo che gli oggetti esistenti nel cluster vengano gestiti dal nuovo oggetto RootSync root-sync-1.

     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
    

    Sostituisci quanto segue:

    • NEW_ROOT_REPOSITORY: l'URL del repository Git da utilizzare come nuovo repository principale. Puoi inserire gli URL utilizzando il protocollo HTTPS o SSH. Ad esempio, https://github.com/GoogleCloudPlatform/anthos-config-management-samples utilizza il protocollo HTTPS. Se non inserisci un protocollo, l'URL viene trattato come un URL HTTPS.
    • NEW_ROOT_REVISION: (facoltativo) la revisione Git (tag o hash) del nuovo repository principale da estrarre.
    • NEW_ROOT_BRANCH: (facoltativo) il ramo del nuovo repository radice da cui eseguire la sincronizzazione.
    • NEW_ROOT_DIRECTORY: (Facoltativo) il percorso nel repository Git della nuova directory principale che contiene la configurazione da sincronizzare.
    • ROOT_AUTH_TYPE: questo valore deve essere uguale all'oggetto RootSync/root-sync esistente.
    • ROOT_EMAIL: questo valore deve essere uguale all'oggetto RootSync/root-sync esistente.
  7. Attendi la sincronizzazione del nuovo oggetto RootSync root-sync-1. Puoi controllare lo stato utilizzando il seguente comando:

    nomos status
    
  8. Rimuovi le risorse con l'annotazione configmanagement.gke.io/managed: disabled dal repository originale. Esegui il commit e il push della modifica:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. Attendi la sincronizzazione dell'oggetto RootSync root-sync esistente utilizzando il seguente comando:

    nomos status
    

Dividere un repository radice gerarchico

I passaggi per suddividere un repository gerarchico sono simili a quelli per suddividere un repository non strutturato.

Le differenze principali sono tre:

  1. Anche il nuovo repository principale (o la nuova directory) deve essere gerarchico. Devi copiare le directory esistenti system/ e clusterregistry/ nel nuovo repository radice (o nella nuova directory).

  2. Le risorse in uno spazio dei nomi non possono essere distribuite in più repository. In caso contrario, diversi riconciliatori si contendono la gestione dello spazio dei nomi.

  3. L'oggetto RootSync root-sync-1 deve utilizzare spec.sourceFormat: hierarchical.

Poiché consigliamo repository non strutturati, potresti anche prendere in considerazione l'idea di convertire il repository gerarchico in un repository non strutturato prima di suddividerlo.