Instancias múltiples declarativas con espacios de nombres de proyectos

En este instructivo, se muestra cómo usar el plano de espacio de nombres del proyecto con el controlador de configuración a fin de crear un espacio de nombres dedicado para administrar los recursos de Google Cloud en un proyecto específico. Continúa si eres un administrador de infraestructura y deseas permitir que tus usuarios internos administren de forma declarativa la configuración de su proyecto.

El controlador de configuración es un servicio alojado para aprovisionar y organizar recursos de Anthos y Google Cloud. Ofrece un extremo de API que puede aprovisionar, activar y organizar recursos de Google Cloud como parte de Anthos Config Management.

Los planos de KRM son una forma de empaquetar los recursos que se suelen usar juntos y codificar las prácticas recomendadas que puedes implementar en tu organización.

Espacio de nombres del proyecto del controlador de configuración
Espacio de nombres del proyecto del controlador de configuración

El plano de espacio de nombres del proyecto es un plano de KRM que incluye todos los recursos que necesitas para aprovisionar un espacio de nombres en el controlador de configuración en el que tú o un usuario pueden administrar los recursos del proyecto de Google Cloud. Puedes crear una instancia del plano varias veces para configurar varios espacios de nombres de proyecto.

El plano de espacio de nombres del proyecto facilita la administración de uno o más espacios de nombres del proyecto, pero si deseas ver los pasos manuales con gcloud command-line tool, consulta Configura Config Connector para administrar recursos en tus espacios de nombres.

Objetivos

  • Configura un espacio de nombres de proyecto en el controlador de configuración.
  • Aplica la configuración mediante kpt live apply.

Costos

En este instructivo, se usan los siguientes componentes facturables de Google Cloud:

Para obtener una lista completa de los recursos incluidos en el plano del espacio de nombres del proyecto, consulta la sección Recursos del paquete del plano de espacio de nombres del proyecto.

Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.

Cuando finalices este instructivo, puedes borrar los recursos creados para evitar que se te siga facturando. Para obtener más información, consulta Realiza una limpieza.

Requisitos

Antes de comenzar

  1. En Cloud Console, activa Cloud Shell.

    Activar Cloud Shell

    En la parte inferior de Cloud Console, se inicia una sesión de Cloud Shell en la que se muestra una ventana de línea de comandos. Cloud Shell es un entorno de shell que tiene el SDK de Cloud preinstalado, incluida la herramienta de línea de comandos de gcloud, y valores ya establecidos para el proyecto actual. La inicialización de la sesión puede tomar unos minutos.

  2. Ejecuta todos los comandos de este instructivo desde Cloud Shell.

Configure el entorno

En Cloud Shell, ejecute los siguientes comandos:

  1. Instala kubectl, la interfaz principal de línea de comandos para Kubernetes:

    gcloud components install kubectl
    
  2. Instala kpt, la interfaz principal de línea de comandos para los planos de KRM:

    gcloud components install kpt
    
  3. Configura kubectl y kpt para conectarte con el controlador de configuración:

    gcloud alpha anthos config controller get-credentials INSTANCE_NAME \
        --location COMPUTE_REGION \
        --project ADMIN_PROJECT_ID
    

    Reemplaza lo siguiente:

    • INSTANCE_NAME: el nombre de tu instancia de Config Controller.

    • COMPUTE_REGION: la región de tu instancia del controlador de configuración (por ejemplo, us-central1).

    • ADMIN_PROJECT_ID: el ID del proyecto de tu clúster del controlador de configuración.

  4. Habilita la API de Resource Manager:

    Config Connector usa la API de Resource Manager para administrar la habilitación de otras API de servicio.

    gcloud services enable cloudresourcemanager.googleapis.com \
        --project TENANT_PROJECT_ID
    

    Reemplaza TENANT_PROJECT_ID por el ID del proyecto de tu usuario.

  5. Instala la CRD de ResourceGroup, si aún no está instalada:

    kpt live install-resource-group
    
  6. Verifica que Config Connector esté configurado y en buen estado en el espacio de nombres del proyecto config-control:

    kubectl get ConfigConnectorContext -n config-control \
        -o "custom-columns=NAMESPACE:.metadata.namespace,NAME:.metadata.name,HEALTHY:.status.healthy"
    

    Resultado esperado:

    NAMESPACE        NAME                                                HEALTHY
    config-control   configconnectorcontext.core.cnrm.cloud.google.com   true
    
  7. Otorga permiso al controlador de configuración para que administre los recursos de Google Cloud en el proyecto del usuario:

    export TENANT_PROJECT_ID=TENANT_PROJECT_ID
    export SA_EMAIL="$(kubectl get ConfigConnectorContext -n config-control \
        -o jsonpath='{.items[0].spec.googleServiceAccount}' 2> /dev/null)"
    gcloud projects add-iam-policy-binding "${TENANT_PROJECT_ID}" \
        --member "serviceAccount:${SA_EMAIL}" \
        --role "roles/owner" \
        --project "${TENANT_PROJECT_ID}"
    

Configura un espacio de nombres del proyecto

Para crear un espacio de nombres del proyecto en el que administrar recursos para otro proyecto, ejecuta los siguientes comandos.

  1. Obtén el plano del espacio de nombres del proyecto con kpt desde el directorio de trabajo deseado:

    kpt pkg get \
        https://github.com/GoogleCloudPlatform/blueprints.git/catalog/project/kcc-namespace@main \
        TENANT_PROJECT_ID
    

    Reemplaza TENANT_PROJECT_ID por el ID del proyecto de tu usuario.

    En este plano, el ID del proyecto también se usa como el nombre del espacio de nombres del proyecto.

  2. Ingresa al directorio del paquete:

    cd ./TENANT_PROJECT_ID/
    
  3. Para configurar el paquete, modifica el archivo setters.yaml:

    cat > setters.yaml << EOF
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: setters
    data:
      project-id: TENANT_PROJECT_ID
      management-project-id: ADMIN_PROJECT_ID
      management-namespace: ADMIN_NAMESPACE
      projects-namespace: PROJECTS_NAMESPACE
      networking-namespace: NETWORKING_NAMESPACE
    EOF
    

    Reemplaza lo siguiente:

    • ADMIN_PROJECT_ID: el ID del proyecto que contiene tu clúster del controlador de configuración.

      El proyecto de administración se usará para iniciar la identidad de carga de trabajo de Config Connector.

    • ADMIN_NAMESPACE: es el espacio de nombres que se usará para administrar los espacios de nombres del proyecto (por ejemplo, config-control).

      El espacio de nombres de administrador se usará para iniciar la identidad de la carga de trabajo de Config Connector en el proyecto del administrador.

    • PROJECTS_NAMESPACE: es el espacio de nombres que se usará para administrar los permisos del proyecto (por ejemplo, config-control).

      El espacio de nombres del proyecto se usará para administrar cuestiones como la política de IAM, de modo que los usuarios con acceso al espacio de nombres del usuario no puedan escalar sus permisos.

      Si usaste el plano de zona de destino, ya deberías tener un espacio de nombres projects para administrar proyectos. De lo contrario, configúralo como config-control.

    • NETWORKING_NAMESPACE es el espacio de nombres que se usa para administrar las VPC compartidas (por ejemplo, config-control).

      Esto te permitirá usar referencias de recursos entre espacios de nombres cuando seleccionas qué red o subred usar.

      Si usaste el plano de zona de destino, ya deberías tener un espacio de nombres networking para administrar las VPC compartidas. De lo contrario, configúralo como config-control.

  4. Procesa los valores del modo set en los recursos con plantilla:

    kpt fn render
    

    Resultado de ejemplo:

    Package "example-1234":
    [RUNNING] "gcr.io/kpt-fn/apply-setters:v0.1"
    [PASS] "gcr.io/kpt-fn/apply-setters:v0.1"
      Results:
        [INFO] set field value to "cnrm-network-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name"
        [INFO] set field value to "config-control" in file "kcc-namespace-viewer.yaml" in field "metadata.namespace"
        [INFO] set field value to "cnrm-controller-manager-example-1234" in file "kcc-namespace-viewer.yaml" in field "subjects[0].name"
        [INFO] set field value to "cnrm-project-viewer-example-1234" in file "kcc-namespace-viewer.yaml" in field "metadata.name"
        ...(20 line(s) truncated, use '--truncate-output=false' to disable)
    
    Successfully executed 1 function(s) in 1 package(s).
    

Configura los permisos de los usuarios

Para permitir que un usuario aprovisione los recursos del proyecto de Google Cloud en su proyecto de usuario, otórgale permiso para usar el espacio de nombres del proyecto de usuario con los siguientes comandos.

  1. Crea un archivo project-admin.yaml con el siguiente RoleBinding:

    cat > project-admin.yaml << EOF
    apiVersion: rbac.authorization.k8s.io/v1
    kind: RoleBinding
    metadata:
      name: project-admin
      namespace: TENANT_PROJECT_ID
    roleRef:
      kind: ClusterRole
      name: cnrm-admin
      apiGroup: rbac.authorization.k8s.io
    subjects:
    - kind: User
      name: TENANT_EMAIL
      apiGroup: rbac.authorization.k8s.io
    EOF
    

    Reemplaza TENANT_EMAIL por el correo electrónico de la cuenta de usuario de Google Cloud de usuario (por ejemplo, janedoe@example.com).

    La función cnrm-admin permitirá que la instancia cree recursos de Config Connector en el espacio de nombres del proyecto.

    Para obtener detalles sobre cómo autorizar un grupo o una cuenta de servicio, consulta Asigna funciones con RoleBindings o ClusterRoleBindings.

Aplica cambios de configuración

Los cambios locales en los pasos anteriores no afectan la nube hasta que se apliquen.

Para aplicar los cambios de configuración, ejecuta los siguientes comandos:

  1. Inicializa el directorio de trabajo con kpt, que crea un recurso para realizar un seguimiento de los cambios:

    kpt live init --namespace ADMIN_NAMESPACE
    

    Reemplaza ADMIN_NAMESPACE por el espacio de nombres que se usa para administrar los espacios de nombres del proyecto (por ejemplo, config-control).

  2. Obtén una vista previa de los recursos que se crearán:

    kpt live apply --dry-run
    

    Todos los recursos deben decir “fecha de creación (prueba de validación)”.

    Resultado de ejemplo:

    namespace/example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created (dry-run)
    rolebinding.rbac.authorization.k8s.io/project-admin created (dry-run)
    configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created (dry-run)
    iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created (dry-run)
    iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created (dry-run)
    iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created (dry-run)
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed (dry-run)
    0 resource(s) pruned, 0 skipped, 0 failed (dry-run)
    
  3. Aplica los recursos con kpt:

    kpt live apply
    

    Todos los recursos deben decir “creado”.

    Resultado de ejemplo:

    namespace/example-1234 created
    rolebinding.rbac.authorization.k8s.io/cnrm-network-viewer-example-1234 created
    rolebinding.rbac.authorization.k8s.io/cnrm-project-viewer-example-1234 created
    rolebinding.rbac.authorization.k8s.io/project-admin created
    configconnectorcontext.core.cnrm.cloud.google.com/configconnectorcontext.core.cnrm.cloud.google.com created
    iampartialpolicy.iam.cnrm.cloud.google.com/example-1234-sa-workload-identity-binding created
    iampartialpolicy.iam.cnrm.cloud.google.com/kcc-example-1234-owners-permissions created
    iamserviceaccount.iam.cnrm.cloud.google.com/kcc-example-1234 created
    8 resource(s) applied. 8 created, 0 unchanged, 0 configured, 0 failed
    0 resource(s) pruned, 0 skipped, 0 failed
    

Verifica el éxito

Para verificar que los cambios se apliquen y que se aprovisionen los recursos que especifiquen, ejecuta los comandos siguientes.

  1. Espera hasta que los recursos estén listos:

    kpt live status --output table --poll-until current
    

    Este comando sondeará hasta que todos los recursos tengan el estado Current y una condición de Ready o <None> (para recursos que no admiten la condición Listo). El Ready será verde si Listo=verdadero y rojo si Listo=falso.

    Usa ctrl-c para interrumpir, si es necesario.

    Resultado de ejemplo:

    NAMESPACE   RESOURCE                                  STATUS      CONDITIONS                                AGE     MESSAGE
                Namespace/example-1234                    Current     <None>                                    13s     Resource is current
    config-con  IAMPartialPolicy/example-1234-sa-workloa  Current     Ready                                     11s     Resource is Ready
    config-con  IAMPartialPolicy/kcc-example-1234-owners  Current     Ready                                     11s     Resource is Ready
    config-con  IAMServiceAccount/kcc-example-1234        Current     Ready                                     11s     Resource is Ready
    config-con  RoleBinding/cnrm-network-viewer-example-  Current     <None>                                    13s     Resource is current
    config-con  RoleBinding/cnrm-project-viewer-example-  Current     <None>                                    12s     Resource is current
    example-12  ConfigConnectorContext/configconnectorco  Current     <None>                                    12s     Resource is current
    example-12  RoleBinding/project-admin                 Current     <None>                                    12s     Resource is current
    
  2. En el caso de error, usa el resultado del evento predeterminado para ver los mensajes de error completos:

    kpt live status
    

Realice una limpieza

Si decides dejar de usar el controlador de configuración, primero debes limpiar todos los recursos que creaste con él y, luego, borrarlo.

  1. Borra los recursos con kpt, desde el directorio de trabajo:

    kpt live destroy
    
  2. Espera hasta que se borren todos los recursos:

    until [ -z "$(kubectl get -R -f . --ignore-not-found | tee /dev/fd/2)" ]; \
    do sleep 1; done
    

    Este comando sondeará hasta que todos los recursos tengan el estado Deleted.

    Usa ctrl-c para interrumpir, si es necesario.

¿Qué sigue?