Divida um repositório em vários repositórios

Esta página mostra como dividir em segurança um repositório raiz em dois ou mais repositórios raiz. Os passos também podem ser aplicados a repositórios de espaços de nomes.

Um repositório sincronizado pelo Config Sync refere-se à combinação de um repositório Git, um ramo, uma revisão e um diretório.

Quando existem um grande número de recursos, por exemplo, mais de 5000, no seu repositório raiz, o Config Sync pode não funcionar bem pelos dois motivos seguintes:

  1. O objeto ResourceGroup pode exceder o limite de tamanho do objeto etcd. O objeto ResourceGroup regista o grupo, o tipo, o espaço de nomes e o nome de todos os recursos no repositório Git. Ter um grande número de recursos resulta num objeto ResourceGroup grande.
  2. Demora mais tempo a sincronizar todos os recursos do que um repositório com um número inferior de recursos. O Config Sync aplica os recursos sequencialmente ao cluster. Por vezes, não é possível aplicar os recursos com êxito na primeira vez e o Config Sync tem de tentar aplicá-los novamente.

Quando se depara com estes problemas, pode dividir o repositório raiz de um em vários para que cada repositório raiz tenha menos recursos.

Divida um repositório raiz não estruturado

Os objetos RootSync são usados para explicar os passos. Os passos também podem ser aplicados aos objetos RepoSync.

Este método funciona para a versão 1.21.0 e posteriores do Config Sync devido a um finalizador adicionado nessa versão, que deixa de gerir objetos quando um objeto RootSync ou RepoSync é eliminado. Anteriormente, os objetos órfãos tinham metadados persistentes, o que impedia que fossem geridos por outros clientes ou novos objetos RootSync ou RepoSync.

Suponha que o repositório raiz é sincronizado pelo objeto RootSync single-root-sync. Depois de dividir o repositório, tem dois repositórios raiz. Um é sincronizado pelo objeto root-sync-1 RootSync, enquanto o outro é sincronizado pelo objeto root-sync-2 RootSync.

Para dividir o repositório, siga estes passos:

  1. Certifique-se de que o RootSync single-root-sync tem o valor de anotação configsync.gke.io/deletion-propagation-policy de Orphan ou que não está definido. O valor predefinido quando não está definido é o mesmo que "Órfão". Esta definição garante que os objetos não são eliminados.

  2. Elimine o RootSync single-root-sync:

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. Siga estes passos para configurar os novos repositórios:

    1. Crie um novo repositório ou um novo diretório no seu repositório Git existente.
    2. Mova os recursos para o novo repositório ou diretório.
    3. Se estiver a dividir o repositório raiz em mais de dois repositórios, repita estes passos conforme necessário.
  4. Confirme e envie a alteração:

    git commit -am 'add configuration for the new root repository'
    
  5. Aplique os objetos root-sync-1 e root-sync-2 RootSync. Ao fazê-lo, sincroniza o novo repositório ou diretório para que os objetos existentes no cluster sejam geridos pelos novos objetos 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
    

    Substitua o seguinte:

    • NEW_ROOT_REPOSITORY: o URL do repositório Git a usar como o novo repositório raiz. Pode introduzir URLs através do protocolo HTTPS ou SSH. Por exemplo, o https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa o protocolo HTTPS. Se não introduzir um protocolo, o URL é tratado como um URL HTTPS.
    • NEW_ROOT_REVISION: (Opcional) a revisão do Git (etiqueta ou hash) do novo repositório raiz a consultar.
    • NEW_ROOT_BRANCH: (opcional) a ramificação do novo repositório raiz a partir da qual sincronizar.
    • NEW_ROOT_DIRECTORY: (Opcional) o caminho no repositório Git para o novo diretório raiz que contém a configuração com a qual quer sincronizar.
    • ROOT_AUTH_TYPE: este valor deve ser igual ao objeto RootSync/root-sync existente.
    • ROOT_EMAIL: este valor deve ser igual ao objeto RootSync/root-sync existente.
  6. Aguarde até que o novo objeto root-sync-1 RootSync seja sincronizado. Pode verificar o estado através do seguinte comando:

    nomos status
    

Quaisquer versões

Este método funciona para qualquer versão do Config Sync, incluindo a versão 1.21.0, mas recomendamos que use o método disponível na versão 1.21.0 e posteriores porque requer menos passos. Se a versão do Config Sync for anterior a 1.21.0, pode usar este método em alternativa.

Suponha que o repositório raiz é sincronizado pelo objeto RootSync root-sync. Depois de dividir o repositório, tem dois repositórios raiz. Um é sincronizado pelo objeto root-sync RootSync, enquanto o outro é sincronizado pelo objeto root-sync-1 RootSync.

Para dividir o repositório, siga estes passos:

  1. No repositório de raiz existente, escolha os recursos que planeia mover para um repositório ou um diretório diferente e adicione a anotação configmanagement.gke.io/managed: disabled aos mesmos. Esta anotação garante que os objetos existentes no cluster não são afetados quando move a respetiva configuração de um repositório para outro. Se usar o formato Kustomize ou os gráficos Helm, pode escolher cerca de metade das bases e adicionar a anotação comum ao ficheiro kustomization.yaml, como neste exemplo:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. Confirme e envie a alteração: sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. Aguarde que o objeto root-sync RootSync existente seja sincronizado através do seguinte comando:

    nomos status
    
  4. Siga estes passos para configurar o segundo repositório:

    1. Crie um novo repositório ou um novo diretório no seu repositório Git existente.
    2. Copie os recursos com a anotação configmanagement.gke.io/managed: disabled para o novo repositório ou diretório.
    3. Remova a anotação configmanagement.gke.io/managed: disabled no novo repositório ou diretório.
    4. Se estiver a dividir o repositório raiz em mais de dois repositórios, repita estes passos conforme necessário.
  5. Confirme e envie a alteração:

    git commit -am 'add configuration for the new root repository'
    
  6. Aplique um root-sync-1 objeto RootSync para sincronizar o novo repositório ou diretório, de modo que os objetos existentes no cluster sejam geridos pelo novo root-sync-1 objeto RootSync.

     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
    

    Substitua o seguinte:

    • NEW_ROOT_REPOSITORY: o URL do repositório Git a usar como o novo repositório raiz. Pode introduzir URLs através do protocolo HTTPS ou SSH. Por exemplo, o https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa o protocolo HTTPS. Se não introduzir um protocolo, o URL é tratado como um URL HTTPS.
    • NEW_ROOT_REVISION: (Opcional) a revisão do Git (etiqueta ou hash) do novo repositório raiz a consultar.
    • NEW_ROOT_BRANCH: (opcional) a ramificação do novo repositório raiz a partir da qual sincronizar.
    • NEW_ROOT_DIRECTORY: (Opcional) o caminho no repositório Git para o novo diretório raiz que contém a configuração com a qual quer sincronizar.
    • ROOT_AUTH_TYPE: este valor deve ser igual ao objeto RootSync/root-sync existente.
    • ROOT_EMAIL: este valor deve ser igual ao objeto RootSync/root-sync existente.
  7. Aguarde até que o novo objeto root-sync-1 RootSync seja sincronizado. Pode verificar o estado através do seguinte comando:

    nomos status
    
  8. Remova os recursos com a anotação configmanagement.gke.io/managed: disabled do repositório original. Confirme e envie a alteração:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. Aguarde que o objeto root-sync RootSync existente seja sincronizado através do seguinte comando:

    nomos status
    

Divida um repositório raiz hierárquico

Os passos para dividir um repositório hierárquico são semelhantes aos passos para dividir um repositório não estruturado.

Existem três diferenças principais:

  1. O novo repositório raiz (ou novo diretório) também deve ser hierárquico. Tem de copiar os diretórios system/ e clusterregistry/ existentes para o novo repositório raiz (ou o novo diretório).

  2. Os recursos num espaço de nomes não podem ser distribuídos por vários repositórios. Caso contrário, os reconciliadores diferentes lutam para gerir o espaço de nomes.

  3. O objeto root-sync-1 RootSync deve usar spec.sourceFormat: hierarchical.

Uma vez que recomendamos repositórios não estruturados, também pode considerar converter o seu repositório hierárquico num repositório não estruturado antes de o dividir.