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

Ao gerenciar milhares de recursos do Kubernetes no Config Sync, dividir um repositório raiz ou de namespace grande em vários repositórios menores ajuda a melhorar a velocidade de reconciliação e evitar falhas de sincronização.

No Config Sync, um repositório sincronizado se refere à combinação de um repositório Git, uma ramificação, uma revisão e um diretório. Ao dividir um repositório monolítico em vários objetos RootSync ou RepoSync, você reduz o número de recursos que cada reconciliador rastreia e aplica.

Por que repositórios grandes causam problemas de sincronização

Quando o repositório raiz contém um grande número de recursos, por exemplo, mais de 5.000, o Config Sync pode ter problemas de desempenho ou sincronização pelos seguintes motivos:

  • 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. Um grande número de recursos pode resultar em um grande objeto ResourceGroup.
  • A sincronização de um repositório grande leva mais tempo do que a de um repositório menor, porque o Config Sync aplica os recursos sequencialmente ao cluster. Se o Config Sync não conseguir aplicar um recurso na primeira tentativa, ele precisará tentar novamente.

Ao encontrar esses problemas, divida o repositório raiz em vários repositórios para que cada um gerencie menos recursos.

Interromper um repositório raiz não estruturado

As etapas a seguir usam objetos RootSync como exemplo, mas também podem ser aplicadas a objetos 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. Anteriormente, 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 dividi-lo, você terá dois repositórios raiz. Um é sincronizado pelo objeto RootSync root-sync-1, enquanto o outro é sincronizado pelo objeto RootSync root-sync-2.

Para dividir o repositório, siga estas etapas:

  1. Verifique se o RootSync single-root-sync tem o valor de anotação configsync.gke.io/deletion-propagation-policy de Orphan ou se ele não está definido. O valor padrão quando não definido é o mesmo que "Orphan". 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. Para configurar os novos repositórios, siga estas etapas:

    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 para o novo diretório raiz que contém a configuração com a qual você quer sincronizar.
    • ROOT_AUTH_TYPE: esse valor precisa ser o mesmo que o objeto RootSync/root-sync atual.
    • ROOT_EMAIL: esse valor precisa ser o mesmo que o objeto RootSync/root-sync atual.
  6. Aguarde a sincronização do novo objeto RootSync root-sync-1. Verifique o status usando o seguinte comando:

    nomos status
    

Qualquer versão

Esse método funciona para qualquer versão do Config Sync, incluindo a versão 1.21.0, mas recomendamos que você use o método disponível na versão 1.21.0 e mais recentes, porque ele requer 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 dividi-lo, você terá dois repositórios raiz. Um é sincronizado pelo objeto RootSync root-sync, enquanto o outro é sincronizado pelo objeto RootSync root-sync-1.

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 RootSync root-sync 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 novo 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 para o novo diretório raiz que contém a configuração com a qual você quer sincronizar.
    • ROOT_AUTH_TYPE: esse valor precisa ser o mesmo que o objeto RootSync/root-sync atual.
    • ROOT_EMAIL: esse valor precisa ser o mesmo que o objeto RootSync/root-sync atual.
  7. Aguarde a sincronização do novo objeto RootSync root-sync-1. Verifique o status usando 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 RootSync root-sync 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.