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

Nesta página, mostramos como dividir um repositório raiz com segurança em dois ou mais repositórios raiz. As etapas também podem ser aplicadas a repositórios de namespace.

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

Quando há um grande número de recursos, por exemplo, mais de 5.000, no seu repositório raiz, o Config Sync pode não se comportar bem pelos dois motivos a seguir:

  1. O objeto ResourceGroup pode exceder o limite de tamanho do objeto etcd. O objeto ResourceGroup registra o grupo, o tipo, o namespace e o nome de todos os recursos no repositório Git. Ter um grande número de recursos gera um grande objeto ResourceGroup.
  2. A sincronização de todos os recursos é mais demorada do que um repositório com um número menor de recursos. O Config Sync aplica os recursos sequencialmente ao cluster. Às vezes, os recursos não podem ser aplicados na primeira vez, e o Config Sync precisa aplicá-los novamente.

Ao encontrar esses problemas, é possível dividir o repositório raiz de um para vários. Assim, cada repositório raiz terá menos recursos.

Interromper um repositório raiz não estruturado

Os objetos RootSync são usados para explicar as etapas. As etapas também podem ser aplicadas aos objetos do RepoSync.

Esse método funciona para o Config Sync versão 1.21.0 e mais recentes devido a um finalizador adicionado nessa versão, que interrompe o gerenciamento de objetos quando um objeto RootSync ou RepoSync é excluído. Antes, os objetos órfãos tinham metadados persistentes, o que impedia que fossem gerenciados por outros clientes ou novos objetos RootSync ou RepoSync.

Suponha que seu repositório raiz seja sincronizado pelo objeto RootSync single-root-sync. Após dividir o repositório, você terá 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 estas etapas:

  1. Verifique se o single-root-sync do RootSync tem o valor de anotação configsync.gke.io/deletion-propagation-policy como Orphan ou se ele não está definido. O valor padrão quando não definido é o mesmo que "Órfão". Essa configuração garante que os objetos não sejam excluídos.

  2. Exclua o RootSync single-root-sync:

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

    1. Crie um novo repositório ou um novo diretório no seu repositório Git.
    2. Mova os recursos para o novo repositório ou diretório.
    3. Se você estiver dividindo seu repositório raiz em mais de dois repositórios, repita essas etapas conforme necessário.
  4. Confirme e envie a mudança:

    git commit -am 'add configuration for the new root repository'
    
  5. Aplique os objetos RootSync root-sync-1 e root-sync-2. Isso sincroniza o novo repositório ou diretório para que os objetos no cluster sejam gerenciados 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:

    • NEW_ROOT_REPOSITORY: o URL do repositório Git para usar como o novo repositório raiz. É possível inserir URLs usando o protocolo HTTPS ou SSH. Por exemplo, https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa o protocolo HTTPS. Se você não inserir um protocolo, o URL será tratado como um URL HTTPS.
    • NEW_ROOT_REVISION: (opcional) a revisão do Git (tag ou hash) do novo repositório raiz para verificar.
    • NEW_ROOT_BRANCH: (opcional) a ramificação do novo repositório raiz para sincronizar.
    • NEW_ROOT_DIRECTORY: (opcional) o caminho no repositório Git ao novo diretório raiz que contém a configuração com a qual você quer sincronizar.
    • ROOT_AUTH_TYPE: precisa ser o mesmo que o objeto RootSync/root-sync atual.
    • ROOT_EMAIL: precisa ser o mesmo que o objeto RootSync/root-sync atual.
  6. Aguarde a sincronização do novo objeto RootSync root-sync-1. Para verificar o status, use o seguinte comando:

    nomos status
    

Qualquer versão

Esse método funciona para qualquer versão do Config Sync, incluindo a 1.21.0, mas recomendamos que você use o método disponível na versão 1.21.0 e mais recentes porque ele exige menos etapas. Se a versão do Config Sync for anterior à 1.21.0, use este método.

Suponha que seu repositório raiz seja sincronizado pelo objeto RootSync root-sync. Após dividir o repositório, você terá 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 estas etapas:

  1. No repositório raiz atual, escolha os recursos que você planeja mover para um repositório diferente ou um diretório e adicione a anotação configmanagement.gke.io/managed: disabled a eles. Essa anotação garante que os objetos no cluster não sejam afetados quando você move a configuração de um repositório para outro. Se você usar o formato Kustomize ou gráficos do Helm, poderá escolher cerca de metade das bases e adicionar a anotação comum ao arquivo kustomization.yaml, como neste exemplo:

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

  3. Aguarde até que o objeto root-sync RootSync seja sincronizado usando o seguinte comando:

    nomos status
    
  4. Para configurar o segundo repositório, siga estas etapas:

    1. Crie um novo repositório ou um novo diretório no seu repositório Git.
    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 você estiver dividindo seu repositório raiz em mais de dois repositórios, repita essas etapas conforme necessário.
  5. Confirme e envie a mudança:

    git commit -am 'add configuration for the new root repository'
    
  6. Aplique um objeto RootSync root-sync-1 para sincronizar o novo repositório ou diretório para que os objetos no cluster sejam gerenciados pelo novo objeto 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
    

    Substitua:

    • NEW_ROOT_REPOSITORY: o URL do repositório Git para usar como o novo repositório raiz. É possível inserir URLs usando o protocolo HTTPS ou SSH. Por exemplo, https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa o protocolo HTTPS. Se você não inserir um protocolo, o URL será tratado como um URL HTTPS.
    • NEW_ROOT_REVISION: (opcional) a revisão do Git (tag ou hash) do novo repositório raiz para verificar.
    • NEW_ROOT_BRANCH: (opcional) a ramificação do novo repositório raiz para sincronizar.
    • NEW_ROOT_DIRECTORY: (opcional) o caminho no repositório Git ao novo diretório raiz que contém a configuração com a qual você quer sincronizar.
    • ROOT_AUTH_TYPE: precisa ser o mesmo que o objeto RootSync/root-sync atual.
    • ROOT_EMAIL: precisa ser o mesmo que o objeto RootSync/root-sync atual.
  7. Aguarde a sincronização do novo objeto RootSync root-sync-1. Para verificar o status, use o 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 mudança:

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

    nomos status
    

Interromper um repositório raiz hierárquico

As etapas para dividir um repositório hierárquico são semelhantes às de quebra de um repositório não estruturado.

Há três diferenças principais:

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

  2. Os recursos em um namespace não podem se espalhar por vários repositórios. Caso contrário, diferentes reconciliadores entrarão em conflito para gerenciar o namespace.

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

Como recomendamos repositórios não estruturados, talvez seja uma boa ideia converter seu repositório hierárquico em um repositório não estruturado antes de compartilhá-lo.