Dividir un repositorio en varios

En esta página se explica cómo dividir de forma segura un repositorio raíz en dos o más repositorios raíz. También se pueden aplicar a los repositorios de espacios de nombres.

Un repositorio sincronizado por Config Sync es la combinación de un repositorio de Git, una rama, una revisión y un directorio.

Cuando hay un gran número de recursos (por ejemplo, más de 5000) en tu repositorio raíz, es posible que Config Sync no funcione correctamente por los dos motivos siguientes:

  1. El objeto ResourceGroup puede superar el límite de tamaño de objeto de etcd. El objeto ResourceGroup registra el grupo, el tipo, el espacio de nombres y el nombre de todos los recursos del repositorio Git. Si tiene un gran número de recursos, se creará un objeto ResourceGroup de gran tamaño.
  2. Se tarda más en sincronizar todos los recursos que en un repositorio con un número menor de recursos. Config Sync aplica los recursos de forma secuencial al clúster. A veces, los recursos no se pueden aplicar correctamente la primera vez y Config Sync tiene que volver a intentarlo.

Si te encuentras con estos problemas, puedes dividir tu repositorio raíz en varios para que cada uno de ellos tenga menos recursos.

Dividir un repositorio raíz sin estructurar

Los objetos RootSync se usan para explicar los pasos. Los pasos también se pueden aplicar a los objetos RepoSync.

mantén los objetos dependientes en el mismo RootSync o RepoSync.

Este método funciona en la versión 1.21.0 de Config Sync y posteriores gracias a un finalizador que se añadió en esa versión, que detiene la gestión de objetos cuando se elimina un objeto RootSync o RepoSync. Antes, los objetos huérfanos tenían metadatos persistentes, lo que impedía que otros clientes o nuevos objetos RootSync o RepoSync los gestionaran.

Supongamos que el objeto RootSync single-root-sync sincroniza tu repositorio raíz. Después de dividir el repositorio, tendrás dos repositorios raíz. Uno se sincroniza mediante el objeto root-sync-1 RootSync, mientras que el otro se sincroniza mediante el objeto root-sync-2 RootSync.

Para dividir el repositorio, sigue estos pasos:

  1. Asegúrate de que el RootSync single-root-sync tenga el valor de anotación configsync.gke.io/deletion-propagation-policy de Orphan o que no esté definido. El valor predeterminado cuando no se define es el mismo que "Orphan". Este ajuste asegura que no se eliminen objetos.

  2. Elimina el RootSync single-root-sync:

    kubectl delete rootsync single-root-sync -n config-management-system
    
  3. Sigue estos pasos para configurar tus nuevos repositorios:

    1. Crea un repositorio o un directorio en tu repositorio de Git.
    2. Mueve los recursos al nuevo repositorio o directorio.
    3. Si vas a dividir tu repositorio raíz en más de dos repositorios, repite estos pasos según sea necesario.
  4. Confirma y envía el cambio:

    git commit -am 'add configuration for the new root repository'
    
  5. Aplica los objetos RootSync root-sync-1 y root-sync-2. De esta forma, se sincronizará el nuevo repositorio o directorio para que los objetos del clúster se gestionen con los nuevos objetos RootSync root-sync-1 y 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
    

    Haz los cambios siguientes:

    • NEW_ROOT_REPOSITORY: URL del repositorio de Git que se va a usar como nuevo repositorio raíz. Puede introducir URLs con el protocolo HTTPS o SSH. Por ejemplo, https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa el protocolo HTTPS. Si no introduces ningún protocolo, la URL se tratará como una URL HTTPS.
    • NEW_ROOT_REVISION: (opcional) revisión de Git (etiqueta o hash) del nuevo repositorio raíz que debe consultarse.
    • NEW_ROOT_BRANCH: (opcional) rama del nuevo repositorio raíz desde la que se hace la sincronización.
    • NEW_ROOT_DIRECTORY: (opcional) la ruta del repositorio de Git al nuevo directorio raíz que contiene la configuración que quieres sincronizar.
    • ROOT_AUTH_TYPE: este valor debe ser el mismo que el del objeto RootSync/root-sync.
    • ROOT_EMAIL: este valor debe ser el mismo que el del objeto RootSync/root-sync.
  6. Espera a que se sincronice el nuevo objeto root-sync-1 RootSync. Puedes comprobar el estado con el siguiente comando:

    nomos status
    

Cualquier versión

Este método funciona con cualquier versión de Config Sync, incluida la 1.21.0, pero te recomendamos que utilices el método disponible en la versión 1.21.0 y posteriores porque requiere menos pasos. Si tu versión de Config Sync es anterior a la 1.21.0, puedes usar este método.

Supongamos que el objeto RootSync root-sync sincroniza tu repositorio raíz. Después de dividir el repositorio, tendrás dos repositorios raíz. Uno se sincroniza mediante el objeto root-sync RootSync, mientras que el otro se sincroniza mediante el objeto root-sync-1 RootSync.

Para dividir el repositorio, sigue estos pasos:

  1. En el repositorio raíz, elige los recursos que quieras mover a otro repositorio o directorio y añádeles la anotación configmanagement.gke.io/managed: disabled. Esta anotación asegura que los objetos del clúster no se vean afectados cuando muevas su configuración de un repositorio a otro. Si usas el formato Kustomize o gráficos de Helm, puedes elegir aproximadamente la mitad de las bases y añadir la anotación común al archivo kustomization.yaml, como en este ejemplo:

    # kustomization.yaml
    commonAnnotations:
      configmanagement.gke.io/managed: disabled
    
  2. Confirma y envía el cambio: sh git commit -am 'disable Config Sync management on subset of the configuration'

  3. Espera a que se sincronice el objeto root-sync RootSync con el siguiente comando:

    nomos status
    
  4. Para configurar el segundo repositorio, sigue estos pasos:

    1. Crea un repositorio o un directorio en tu repositorio de Git.
    2. Copia los recursos con la anotación configmanagement.gke.io/managed: disabled en el nuevo repositorio o directorio.
    3. Elimina la anotación configmanagement.gke.io/managed: disabled del nuevo repositorio o directorio.
    4. Si vas a dividir tu repositorio raíz en más de dos repositorios, repite estos pasos según sea necesario.
  5. Confirma y envía el cambio:

    git commit -am 'add configuration for the new root repository'
    
  6. Aplica un objeto root-sync-1 RootSync para sincronizar el nuevo repositorio o directorio de forma que los objetos del clúster se gestionen con el nuevo objeto root-sync-1 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
    

    Haz los cambios siguientes:

    • NEW_ROOT_REPOSITORY: URL del repositorio de Git que se va a usar como nuevo repositorio raíz. Puede introducir URLs con el protocolo HTTPS o SSH. Por ejemplo, https://github.com/GoogleCloudPlatform/anthos-config-management-samples usa el protocolo HTTPS. Si no introduces ningún protocolo, la URL se tratará como una URL HTTPS.
    • NEW_ROOT_REVISION: (opcional) revisión de Git (etiqueta o hash) del nuevo repositorio raíz que debe consultarse.
    • NEW_ROOT_BRANCH: (opcional) rama del nuevo repositorio raíz desde la que se hace la sincronización.
    • NEW_ROOT_DIRECTORY: (opcional) la ruta del repositorio de Git al nuevo directorio raíz que contiene la configuración que quieres sincronizar.
    • ROOT_AUTH_TYPE: este valor debe ser el mismo que el del objeto RootSync/root-sync.
    • ROOT_EMAIL: este valor debe ser el mismo que el del objeto RootSync/root-sync.
  7. Espera a que se sincronice el nuevo objeto root-sync-1 RootSync. Puedes comprobar el estado con el siguiente comando:

    nomos status
    
  8. Elimina los recursos con la anotación configmanagement.gke.io/managed: disabled del repositorio original. Confirma y envía el cambio:

    git commit -am 'remove configuration managed by the new root repository'
    
  9. Espera a que se sincronice el objeto root-sync RootSync con el siguiente comando:

    nomos status
    

Dividir un repositorio raíz jerárquico

Los pasos para dividir un repositorio jerárquico son similares a los que se siguen para dividir un repositorio no estructurado.

Hay tres diferencias principales:

  1. El nuevo repositorio raíz (o el nuevo directorio) también debe ser jerárquico. Debes copiar los directorios system/ y clusterregistry/ en el nuevo repositorio raíz (o en el nuevo directorio).

  2. Los recursos de un espacio de nombres no se pueden repartir entre varios repositorios. De lo contrario, los reconciliadores se pelearán por gestionar el espacio de nombres.

  3. El objeto root-sync-1 RootSync debe usar spec.sourceFormat: hierarchical.

Como te recomendamos que uses repositorios no estructurados, también puedes convertir tu repositorio jerárquico en un repositorio no estructurado antes de dividirlo.