Crear y usar credenciales para importar imágenes de Cloud Storage para VM Runtime en GDC

En este documento se explica cómo crear y usar credenciales para acceder a Cloud Storage mediante VM Runtime en GDC. Un complemento de Cloud Storage te permite usar Containerized Data Importer (CDI) para importar imágenes de VM desde segmentos de Cloud Storage. Después, puedes crear discos virtuales a partir de estas imágenes en Cloud Storage y adjuntarlos a las VMs que se ejecutan en tu clúster. CDI se habilita automáticamente en un clúster que ejecuta VM Runtime en GDC.

Antes de empezar

Para completar este documento, necesitas tener acceso a los siguientes recursos:

Descripción general de las credenciales

Para acceder a Cloud Storage, debes usar una cuenta de servicio que proporcione credenciales al segmento de almacenamiento. La cuenta de servicio requiere diferentes privilegios para acceder correctamente a un segmento de almacenamiento:

  • Segmento de almacenamiento público: usas una cuenta de servicio para identificarte, pero no se necesitan permisos específicos.
  • Segmento de almacenamiento privado: la cuenta de almacenamiento requiere el privilegio de lector o administrador en el segmento de almacenamiento.

Hay dos formas de proporcionar las credenciales de la cuenta de servicio a CDI:

  • Configura las credenciales predeterminadas de la aplicación de Google (ADC) en los nodos de tu clúster. Para obtener más información, consulta el artículo Configurar ADC para un entorno local u otro proveedor de servicios en la nube.
  • Proporciona un secreto que contenga la clave de la cuenta de servicio para acceder a Cloud Storage. En el resto de este documento se explica cómo crear una clave de cuenta de servicio y un secreto.

Crear secreto

Para pasar la clave de la cuenta de servicio a Kubernetes, debes usar un secreto creado en el espacio de nombres del volumen de datos. La sección data del secreto contiene una entrada para creds-gcp.json. El valor son los datos codificados en base64 del archivo de clave de la cuenta de servicio. La CLI crea estos datos codificados en base64 automáticamente. Si usas un manifiesto YAML para crear el secreto, primero crea un hash base64 del contenido del archivo de claves de tu cuenta de servicio.

CLI

  • Crea el secreto con kubectl:

    kubectl create secret generic SECRET_NAME \
      --from-file=creds-gcp.json=SERVICE_ACCOUNT_KEY_PATH \
      --namespace NAMESPACE_NAME
    

    Sustituye los siguientes valores:

    • SECRET_NAME: el nombre del secreto.
    • SERVICE_ACCOUNT_KEY_PATH: la ruta al archivo de clave de tu cuenta de servicio.
    • NAMESPACE_NAME: el espacio de nombres de tu Secret.
      • Crea tu secreto en el clúster en el que se ejecuta CDI y en el mismo espacio de nombres que el volumen de datos. CDI se habilita automáticamente en un clúster que ejecuta el entorno de ejecución de máquinas virtuales en GDC.

Archivo de manifiesto

  1. Crea un manifiesto Secret, como my-secret.yaml, en el editor que prefieras:

    nano my-secret.yaml
    
  2. Copia y pega el siguiente manifiesto YAML:

    apiVersion: v1
    data:
      creds-gcp.json: BASE64_SERVICE_ACCOUNT_FILE
    kind: Secret
    metadata:
      name: SECRET_NAME
      namespace: NAMESPACE_NAME
    type: Opaque
    

    Sustituye los siguientes valores:

    • BASE64_SERVICE_ACCOUNT_FILE: el hash base64 del contenido del archivo de clave de tu cuenta de servicio.
    • SECRET_NAME: el nombre del secreto.
    • NAMESPACE_NAME: el espacio de nombres de tu Secret.
      • Crea tu secreto en el clúster en el que se ejecuta CDI y en el mismo espacio de nombres que el volumen de datos. CDI se habilita automáticamente en un clúster que ejecuta el entorno de ejecución de máquinas virtuales en GDC.
  3. Guarda y cierra el manifiesto de Secret en tu editor.

  4. Aplica el manifiesto de Secret con kubectl:

    kubectl apply -f my-secret.yaml
    

Reenviar un secreto

En lugar de crear un secreto, puedes crear un SecretForwarder para reenviar un secreto que ya tengas y usarlo. SecretForwarder admite el reenvío de secretos dentro del mismo clúster o entre clústeres, como del clúster de administrador a un clúster de usuario.

Para usar el secreto de destino para acceder a Cloud Storage, el secreto de origen debe tener una clave creds-gcp.json en su sección data.

Mismo clúster

En el siguiente ejemplo de manifiesto de SecretForwarder se reenvía un secreto en el mismo clúster:

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: default
spec:
  inClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

Este ejemplo hace lo siguiente:

  • Crea un SecretForwarder llamado cdi-gcs en el espacio de nombres default.
  • Reenvía el secreto llamado gke-connect en el espacio de nombres anthos-creds a un nuevo secreto llamado gcs-sa en el espacio de nombres default.
  • Crea el nuevo secreto en el mismo clúster.

Para reenviar un secreto en el mismo clúster, sigue estos pasos:

  1. Crea un archivo de manifiesto SecretForwarder, como my-forwarded-secret.yaml, en el editor que prefieras:

    nano my-forwarded-secret.yaml
    
  2. Copia y pega el siguiente manifiesto YAML:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      inClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    Sustituye los siguientes valores:

    • SECRET_FORWARDER_NAME: el nombre de tu SecretForwarder.
    • NAMESPACE_NAME: el espacio de nombres de tu SecretForwarder.
    • TARGET_SECRET_NAME: el nombre del nuevo secreto.
    • TARGET_NAMESPACE_NAME: los espacios de nombres de tu nuevo secreto.
      • Crea tu secreto en el clúster en el que se ejecuta CDI y en el mismo espacio de nombres que el volumen de datos. CDI se habilita automáticamente en un clúster que ejecuta el entorno de ejecución de máquinas virtuales en GDC.
    • SOURCE_SECRET_NAME: el nombre del secreto de origen que quieres reenviar.
    • SOURCE_NAMESPACE_NAME: el espacio de nombres de tu Secret de origen que quieres reenviar.
  3. Guarda y cierra el manifiesto de SecretForwarder en tu editor.

  4. Aplica el manifiesto SecretForwarder con kubectl:

    kubectl apply -f my-forwarded-secret.yaml
    

Entre clústeres

En el siguiente ejemplo de manifiesto de SecretForwarder se reenvía un secreto entre clústeres:

apiVersion: baremetal.cluster.gke.io/v1
kind: SecretForwarder
metadata:
  name: cdi-gcs
  namespace: cluster-user1
spec:
  RemoteClusterTargetSecrets:
    name: gcs-sa
    namespaces:
    - default
  sourceSecret:
    name: gke-connect
    namespace: anthos-creds

Este ejemplo hace lo siguiente:

  • Crea un SecretForwarder llamado cdi-gcs en el espacio de nombres cluster-user1.
  • Reenvía el secreto llamado gke-connect en el espacio de nombres anthos-creds a un nuevo secreto llamado gcs-sa en el espacio de nombres default.
  • Crea el nuevo secreto en el clúster llamado user1.

Para reenviar un secreto en el mismo clúster, sigue estos pasos:

  1. Crea un archivo de manifiesto SecretForwarder, como my-forwarded-secret.yaml, en el editor que prefieras:

    nano my-forwarded-secret.yaml
    
  2. Copia y pega el siguiente manifiesto YAML:

    apiVersion: baremetal.cluster.gke.io/v1
    kind: SecretForwarder
    metadata:
      name: SECRET_FORWARDER_NAME
      namespace: NAMESPACE_NAME
    spec:
      RemoteClusterTargetSecrets:
        name: TARGET_SECRET_NAME
        namespaces:
        - TARGET_NAMESPACE_NAME
      sourceSecret:
        name: SOURCE_SECRET_NAME
        namespace: SOURCE_NAMESPACE_NAME
    

    Sustituye los siguientes valores:

    • SECRET_FORWARDER_NAME: el nombre de tu SecretForwarder en el clúster remoto.
    • NAMESPACE_NAME: el espacio de nombres de tu SecretForwarder en el clúster remoto.
    • TARGET_SECRET_NAME: el nombre del nuevo secreto en el clúster remoto.
    • TARGET_NAMESPACE_NAME: los espacios de nombres del nuevo secreto en el clúster remoto.
      • Crea tu secreto en el clúster en el que se ejecuta CDI y en el mismo espacio de nombres que el volumen de datos. CDI se habilita automáticamente en un clúster que ejecuta el entorno de ejecución de máquinas virtuales en GDC.
    • SOURCE_SECRET_NAME: el nombre del secreto de origen que quieres reenviar.
    • SOURCE_NAMESPACE_NAME: el espacio de nombres de tu Secret de origen que quieres reenviar.
  3. Guarda y cierra el manifiesto de SecretForwarder en tu editor.

  4. Aplica el manifiesto SecretForwarder en el clúster de administración mediante kubectl con el KUBECONFIG del clúster de administración:

    kubectl apply -f my-forwarded-secret.yaml
    

Usar un secreto para importar una imagen

Para usar el secreto e importar una imagen de Cloud Storage al crear un disco virtual y una VM, sigue estos pasos:

  1. Crea un manifiesto que defina un VirtualMachineDisk y un VirtualMachine, como my-vm.yaml,en el editor que prefieras:

    nano my-vm.yaml
    
  2. Copia y pega la siguiente definición de YAML:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_NAME-boot-dv
    spec:
      size: 20Gi
      source:
        gcs:
          url: IMAGE_URL
          secretRef: SECRET_NAME
    ---
    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      interfaces:
        - name: eth0
          networkName: pod-network
          default: true
      disks:
        - boot: true
          virtualMachineDiskName: VM_NAME-boot-dv
    

    Sustituye los siguientes valores:

    • VM_NAME: el nombre de tu VM.
    • IMAGE_URL: la URL de la imagen de disco de Cloud Storage, como gs://my-images-bucket/disk.qcow2.
    • SECRET_NAME: el nombre de tu secreto.
  3. Guarda y cierra el archivo de manifiesto en tu editor.

  4. Crea la VM y el disco con kubectl:

    kubectl apply -f my-vm.yaml
    

Siguientes pasos