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.
1.21.0 ou mais recente (recomendado)
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:
Verifique se o RootSync
single-root-synctem o valor de anotaçãoconfigsync.gke.io/deletion-propagation-policydeOrphanou 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.Exclua o RootSync
single-root-sync:kubectl delete rootsync single-root-sync -n config-management-systemPara configurar os novos repositórios, siga estas etapas:
- Crie um novo repositório ou um novo diretório no seu repositório Git.
- Mova os recursos para o novo repositório ou diretório.
- Se você estiver dividindo seu repositório raiz em mais de dois repositórios, repita essas etapas conforme necessário.
Confirme e envie a mudança:
git commit -am 'add configuration for the new root repository'Aplique os objetos RootSync
root-sync-1eroot-sync-2. Isso sincroniza o novo repositório ou diretório para que os objetos no cluster sejam gerenciados pelos novos objetos RootSyncroot-sync-1eroot-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-credsSubstitua:
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-samplesusa 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.
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:
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: disableda 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 arquivokustomization.yaml, como neste exemplo:# kustomization.yaml commonAnnotations: configmanagement.gke.io/managed: disabledConfirme e envie a mudança:
sh git commit -am 'disable Config Sync management on subset of the configuration'Aguarde até que o objeto RootSync
root-syncseja sincronizado usando o seguinte comando:nomos statusPara configurar o segundo repositório, siga estas etapas:
- Crie um novo repositório ou um novo diretório no seu repositório Git.
- Copie os recursos com a anotação
configmanagement.gke.io/managed: disabledpara o novo repositório ou novo diretório. - Remova a anotação
configmanagement.gke.io/managed: disabledno novo repositório ou diretório. - Se você estiver dividindo seu repositório raiz em mais de dois repositórios, repita essas etapas conforme necessário.
Confirme e envie a mudança:
git commit -am 'add configuration for the new root repository'Aplique um objeto RootSync
root-sync-1para sincronizar o novo repositório ou diretório para que os objetos no cluster sejam gerenciados pelo novo objeto RootSyncroot-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-credsSubstitua:
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-samplesusa 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.
Aguarde a sincronização do novo objeto RootSync
root-sync-1. Verifique o status usando o seguinte comando:nomos statusRemova os recursos com a anotação
configmanagement.gke.io/managed: disableddo repositório original. Confirme e envie a mudança:git commit -am 'remove configuration managed by the new root repository'Aguarde até que o objeto RootSync
root-syncseja 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:
O novo repositório raiz (ou novo diretório) também precisa ser hierárquico. É necessário copiar os diretórios
system/eclusterregistry/para o novo repositório raiz (ou o novo diretório).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.
O objeto RootSync
root-sync-1precisa usarspec.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.