Usar una secuencia de comandos de inicio en máquinas virtuales Linux

En este documento se explica cómo usar secuencias de comandos de inicio para iniciar una instancia de máquina virtual (VM) y sus programas asociados en Google Distributed Cloud (GDC) air-gapped.

Una secuencia de comandos de inicio es una herramienta de automatización que realiza tareas durante el proceso de arranque de la VM. Usa secuencias de comandos de inicio para automatizar las tareas de configuración y despliegue de VMs en instancias nuevas o ya creadas, lo que te ahorrará tiempo y reducirá el esfuerzo de configuración manual.

Este documento está dirigido a desarrolladores de grupos de administradores de plataformas u operadores de aplicaciones que quieran usar secuencias de comandos de inicio para VMs en un entorno de Distributed Cloud. Para obtener más información, consulta el artículo Audiencias de la documentación de GDC air-gapped.

Antes de empezar

Para usar los comandos de la interfaz de línea de comandos (CLI) gdcloud, asegúrate de haber descargado, instalado, y configurado la CLI gdcloud. Todos los comandos de Distributed Cloud usan la CLI gdcloud o kubectl y requieren un entorno de sistema operativo (SO).

Obtener la ruta del archivo kubeconfig

Para ejecutar comandos en el servidor de la API Management, asegúrate de tener los siguientes recursos:

  1. Inicia sesión y genera el archivo kubeconfig del servidor de la API de gestión si no tienes uno.

  2. Usa la ruta del archivo kubeconfig del servidor de la API de gestión para sustituir MANAGEMENT_API_SERVER en estas instrucciones.

Solicitar roles de IAM

Para usar secuencias de comandos de inicio en una VM, ponte en contacto con el administrador de IAM de tu proyecto para solicitar los siguientes roles en tu proyecto:

  • Administrador de proyectos de máquinas virtuales (project-vm-admin): crea, modifica, lista y elimina VMs en el espacio de nombres del proyecto.

  • Administrador de secretos (secret-admin): obtiene, lista, crea, actualiza, elimina, aplica parches y observa secretos de Kubernetes en el espacio de nombres del proyecto. Usa este rol para especificar secretos de secuencias de comandos de inicio. No necesitas este rol para especificar secuencias de comandos de inicio de texto sin formato.

Todos los roles de VM deben enlazarse al espacio de nombres del proyecto en el que reside la VM. Sigue los pasos para verificar tu acceso.

Enviar una secuencia de comandos de inicio

Puedes usar secuencias de comandos bash o no bash como secuencias de comandos de inicio. Para ello, incluye #!/bin/… al principio de la secuencia de comandos para indicar el intérprete de la secuencia de comandos. Por ejemplo, para usar una secuencia de comandos de inicio de Python 3, añade #! /usr/bin/python3 al principio de la secuencia de comandos.

Google Distributed Cloud (GDC) air-gapped ejecuta las secuencias de comandos de inicio en el orden en que aparecen en el array startupScripts.

En la siguiente tabla se muestra el formato de secuencia de comandos que se debe usar en función del tamaño de la secuencia de comandos:

Tamaño de la secuencia de comandos Formato de la secuencia de comandos
Secuencias de comandos de hasta 2048 bytes Texto no cifrado
Secuencias de comandos de más de 2048 bytes Secreto de Kubernetes

Definir una secuencia de comandos de inicio

Para usar una secuencia de comandos de inicio, debes añadir el campo startupScripts al campo spec de la VM. En este campo, puedes especificar varias secuencias de comandos de inicio como texto sin formato o como secreto de Kubernetes.

En el siguiente ejemplo se especifican las secuencias de comandos de inicio como texto sin formato y como secreto de Kubernetes:

apiVersion: virtualmachine.gdc.goog/v1
kind: VirtualMachine
metadata:
  name: "my-vm"
spec:
  # …
  startupScripts:
  - name: hello-world
    script: |
      #!/bin/bash
      echo hello
  - name: add-user
    scriptSecretRef:
      name: add-user
---

apiVersion: v1
kind: Secret
type: Opaque
metadata:
  name: add-user
data:
  script:
    IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==

Ten en cuenta lo siguiente:

  • La secuencia de comandos de inicio se ejecuta en cada arranque.
  • La secuencia de comandos de inicio tiene privilegios de raíz predeterminados.
  • En el secreto de Kubernetes, el nombre de scriptSecretRef en el spec de la VM debe coincidir con el campo metadata.name.
  • En el secreto de Kubernetes, especifica el contenido de la secuencia de comandos de inicio añadiendo una clave script al campo data.

Crear una VM con una secuencia de comandos de inicio

Estas instrucciones se aplican independientemente de lo que uses como imagen para crear tu VM. Sigue estos pasos:

  1. Para crear una secuencia de comandos de inicio como secreto de Kubernetes, ejecuta lo siguiente:

    cat <<EOF >>FILE_NAME
    STARTUP_SCRIPT_CONTENT
    EOF
    
    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      create secret generic SECRET_NAME \
      --from-file=script=FILE_NAME
    
    rm FILE_NAME
    
  2. Consulta los pasos para crear una VM que se describen en la página Crear una VM. En el paso 1, añade la secuencia de comandos de inicio o las secuencias de comandos de inicio al campo spec antes de ejecutar el comando para crear una VM.

    En este ejemplo se define una secuencia de comandos de inicio con texto no cifrado y un secreto de Kubernetes:

    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
      namespace: PROJECT
    spec:
      # …
      startupScripts:
      - name: CLEAR_TEXT_SCRIPT_NAME
        script: |
          #!/bin/bash
          CLEAR_TEXT_SCRIPT
      - name: SECRET_SCRIPT_NAME
        scriptSecretRef:
          name: SECRET_NAME
    

    Estas variables se definen de la siguiente manera:

    VariableDefinición
    MANAGEMENT_API_SERVER El archivo kubeconfig del servidor de la API de gestión.
    PROJECT El proyecto de Distributed Cloud en el que quieres crear la VM.
    VM_NAME El nombre de la VM.
    FILE_NAME El nombre del archivo en el que se almacenará la secuencia de comandos de inicio.
    STARTUP_SCRIPT_CONTENT Los comandos que se ejecutarán como parte de la secuencia de comandos de inicio.
    CLEAR_TEXT_SCRIPT_NAME El nombre de la secuencia de comandos de inicio de texto no cifrado.
    CLEAR_TEXT_SCRIPT La secuencia de comandos de texto no cifrado que definas.
    SECRET_NAME El nombre del secreto de Kubernetes.
    SECRET_SCRIPT_NAME El nombre de la secuencia de comandos de inicio como secreto de Kubernetes.
  3. Sigue los pasos que se indican a continuación para crear una VM.

    A continuación, se muestra un ejemplo de cómo crear una VM con secuencias de comandos de inicio que añaden un usuario nuevo mediante un secreto de Kubernetes y texto no cifrado.

    kubectl --kubeconfig MANAGEMENT_API_SERVER \
      -n PROJECT \
      apply -f - <<EOF
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachineDisk
    metadata:
      name: VM_BOOT_DISK_NAME
    spec:
      source:
        image:
          name: BOOT_DISK_IMAGE_NAME
          namespace: vm-system
      size: BOOT_DISK_SIZE
    ---
    apiVersion: v1
    kind: Secret
    type: Opaque
    metadata:
      name: add-user
    data:
      script:
        IyEvYmluL2Jhc2gKYWRkdXNlciB1c2VyCg==
    ---
    apiVersion: virtualmachine.gdc.goog/v1
    kind: VirtualMachine
    metadata:
      name: VM_NAME
    spec:
      compute:
        virtualMachineType: MACHINE_TYPE
      disks:
      - virtualMachineDiskRef:
          name: VM_BOOT_DISK_NAME
        boot: true
        autoDelete: BOOT_DISK_AUTO_DELETE
      startupScripts:
      - name: add-user
        scriptSecretRef:
          name: add-user
      - name: add-to-sudoers
        script: |
          #!/bin/bash
          usermod -aG sudo user
    EOF
    

    En el ejemplo, las variables se definen de la siguiente manera.

    VariableDefinición
    MANAGEMENT_API_SERVER El archivo kubeconfig del servidor de la API de gestión.
    PROJECT El proyecto de Distributed Cloud en el que quieres crear la VM.
    VM_NAME El nombre de la nueva VM.
    VM_BOOT_DISK_NAME El nombre del disco de arranque de la nueva VM.
    BOOT_DISK_IMAGE_NAME El nombre de la imagen que se usará para el disco de arranque de la nueva VM.
    BOOT_DISK_SIZE El tamaño del disco de arranque, como 20G.
    Este valor siempre debe ser mayor o igual que el minimumDiskSize de la imagen del disco de arranque.
    BOOT_DISK_AUTO_DELETE `true` o `false`, que indica si el disco de arranque se elimina automáticamente cuando se elimina la instancia de VM.truefalse
    MACHINE_TYPE El tipo de máquina predefinido para la nueva VM. Para seleccionar un tipo de máquina disponible, ejecuta este comando:
    kubectl --kubeconfig MANAGEMENT_API_SERVER get virtualmachinetype.virtualmachine.gdc.goog --namespace vm-system

Actualizar una VM con una secuencia de comandos de inicio

También puedes actualizar una VM con una secuencia de comandos de inicio. La VM debe estar apagada antes de realizar la actualización.

Sigue los pasos para actualizar las propiedades de la VM y actualiza el campo spec con la secuencia de comandos de inicio que quieras ejecutar.

Ver la salida de una secuencia de comandos de inicio

  1. Sigue los pasos para conectarte a una VM.
  2. Ejecuta el siguiente comando dentro de la VM invitada para obtener los registros de la secuencia de comandos de inicio que has ejecutado:

    sudo journalctl -u cloud-final
    

    Los registros de la secuencia de comandos de inicio empiezan con lo siguiente:

    Started to run the command: /var/lib/google/startup-scripts/<script-name> ...