Estabeleça ligação a VMs que usam o tempo de execução de VMs no GDC

Este documento destina-se a proprietários de aplicações que executam o Google Distributed Cloud. Este documento mostra como estabelecer ligação a máquinas virtuais (VMs) que usam o VM Runtime no GDC. Pode ligar-se diretamente às VMs através de um endereço IP ou usar ferramentas incorporadas para acesso SSH ou à consola.

Antes de começar

Para preencher este documento, precisa de ter acesso aos seguintes recursos:

Configure o acesso SSH sem palavra-passe a VMs

O acesso SSH direto e sem palavra-passe à sua VM é facilitado por um agente convidado instalado pelo VM Runtime no GDC. Entre outras funções, o agente convidado instala e faz expirar as chaves SSH. Esta capacidade permite um túnel SSH para aceder à sua VM a partir de clientes fora da rede do cluster.

Ative o agente convidado

Para ativar o agente convidado:

  1. Verifique o seu recurso personalizado VirtualMachine para confirmar que está configurado para ativar o agente convidado:

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    O campo spec.osType deve ser definido como o sistema operativo da sua VM, Linux ou Windows. A secção spec.guestEnvironment não deve ser configurada explicitamente como vazia. Se a secção estiver configurada como vazia (guestEnvironment: {}), pode removê-la completamente para ativar o agente convidado.

    O seu recurso personalizado VirtualMachine para a VM à qual quer aceder deve ter o seguinte aspeto:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. Se necessário, use kubectl edit para atualizar o recurso personalizado VirtualMachine.

  3. Para verificar se o agente convidado está a funcionar, verifique o status no seu recurso personalizado de VM:

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    Quando o agente convidado está a funcionar, vê status: "True" para as condições GuestEnvironmentEnabled e GuestEnvironmentDataSynced.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      ...
      name: vm-sample-01
      ...
    status:
      conditions:
      - lastTransitionTime: "2022-10-05T22:40:26Z"
        message: ""
        observedGeneration: 1
        reason: UserConfiguration
        status: "True"
        type: GuestEnvironmentEnabled
      - lastTransitionTime: "2022-10-06T21:55:57Z"
        message: ""
        observedGeneration: 1
        reason: GuestEnvironmentDataSynced
        status: "True"
        type: GuestEnvironmentSynced
      ...
    

Ative o acesso SSH sem palavra-passe

Para ativar o acesso SSH sem palavra-passe para a sua VM:

  1. Crie um VirtualMachineAccessRequestficheiro de manifesto, como vm-access-request.yaml, no editor à sua escolha:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      name: VMAR_NAME
      namespace: VM_NAMESPACE
    spec:
      vm: VM_NAME
      user: USERNAME
      ssh:
        key: PUBLIC_SSH_KEY
        ttl: EXPIRATION_TIME
    

    Substitua o seguinte:

    • VMAR_NAME: o nome do recurso de pedido de acesso.
    • VM_NAMESPACE: o espaço de nomes da VM à qual quer aceder.
    • VM_NAME: o nome da VM à qual quer aceder.
    • USERNAME: o nome de utilizador do utilizador que está a aceder à VM.
    • PUBLIC_SSH_KEY: a chave pública para acesso SSH. Normalmente, trata-se do conteúdo do ficheiro id_rsa.pub.
    • EXPIRATION_TIME: o campo ttl (tempo de vida) especifica durante quanto tempo a chave SSH é válida.

      Por exemplo, se especificar 30m, a chave SSH expira após 30 minutos.

      Esta flag usa as seguintes unidades:

      • s durante segundos
      • m durante minutos
      • h durante horas
      • d durante dias
  2. Use kubectl apply para criar o VirtualMachineAccessRequest a partir do ficheiro de manifesto. Por exemplo, se tiver dado o nome vm-access-request.yaml ao ficheiro de manifesto,

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    Substitua o seguinte:

    • MANIFEST: o nome do ficheiro de manifesto do pedido de acesso. Por exemplo, vm-access-request.yaml.
    • KUBECONFIG: o caminho para o ficheiro kubeconfig do cluster que aloja a VM à qual está a aceder.
  3. Para verificar se a configuração do pedido de acesso foi bem-sucedida, verifique o estado do VirtualMachineAccessRequest:

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    Quando a configuração for bem-sucedida, a secção status inclui state: configured:

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachineAccessRequest
    metadata:
      ...
      annotations:
        kubectl.kubernetes.io/last-applied-configuration: |
          {"apiVersion":"vm.cluster.gke.io/v1","kind":"VirtualMachineAccessRequest",
          "metadata":{"annotations":{},"name":"vmar-sample","namespace":"default"},
          "spec":{"ssh":{"key":"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc=
              sample-user@sample-host","ttl":"5h"},"user":"sample-user","vm":"vm-sample-01"}}
      creationTimestamp: "2022-10-06T21:55:57Z"
      finalizers:
      - vm.cluster.gke.io/vmar-finalizer
      generation: 2
      name: vmar-sample
      namespace: default
      resourceVersion: "13033921"
      uid: 282d72ad-f48d-4e89-af22-336940ac9f58
    spec:
      ssh:
        key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQ...jMLHFc= sample-user@sample-host
        ttl: 5m0s
      user: sample-user
      vm: vm-sample-01
    status:
      processedAt: "2022-10-06T21:55:57Z"
      state: configured
    

Desative o agente convidado

Quando cria uma nova VM e define o campo osType, o agente convidado é ativado. Enquanto esta funcionalidade estiver em pré-visualização, pode desativá-la editando o recurso personalizado VirtualMachine. A desativação do agente convidado desativa o acesso SSH sem palavra-passe à sua VM.

Para desativar o agente convidado:

  1. Use kubectl para parar a VM antes de fazer alterações à configuração:

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. Edite o recurso de VM:

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. Atualize a configuração VirtualMachine para adicionar um spec.guestEnvironment vazio explicitamente:

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. Guarde e feche o manifesto de VMs atualizado no editor.

  4. Use kubectl para iniciar a VM:

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

Estabeleça ligação através de um endereço IP

Se a sua VM tiver um endereço IP acessível e já tiver as credenciais para aceder à VM, pode estabelecer ligação através de um protocolo como SSH, VNC ou RDP.

Ligue-se através do endereço IP

Se conseguir estabelecer ligação diretamente ao endereço IP da VM, use um dos seguintes métodos:

SSH

  1. Obtenha os detalhes da sua VM para ver o respetivo endereço IP:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Substitua os seguintes valores:

    • VM_NAME: nome da VM.
    • VM_NAMESPACE: o espaço de nomes para a sua VM.

    O exemplo de saída seguinte mostra as informações da VM e o endereço IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Estabeleça ligação à sua VM através de um cliente SSH:

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    Substitua os seguintes valores:

    • USERNAME: o nome de utilizador de uma conta na sua VM.
    • IP_ADDRESS: o endereço IP da sua VM obtido no passo anterior.
    • PATH_TO_KEY: o caminho para a chave SSH privada.

VNC ou RDP

O Virtual Network Computing (VNC) e o Remote Desktop Protocol (RDP) permitem-lhe usar a consola gráfica para aceder à sua VM. Quando usa um endereço IP, tem de ativar o VNC ou o RDP no SO convidado antes de poder usar qualquer um deles para estabelecer ligação à VM. Para obter informações sobre como ativar e usar o VNC ou o RDP, consulte a documentação do SO convidado.

Também precisa de credenciais existentes para iniciar sessão na VM, como as que define para criar credenciais de utilizador iniciais quando cria uma VM.

  1. Obtenha os detalhes da sua VM para ver o respetivo endereço IP:

    kubectl get gvm VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Substitua os seguintes valores:

    • VM_NAME: nome da VM.
    • VM_NAMESPACE: o espaço de nomes para a sua VM.

    O exemplo de saída seguinte mostra as informações da VM e o endereço IP:

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. Estabeleça ligação ao endereço IP da VM obtido no passo anterior através de uma ferramenta de cliente e da porta adequada, como a porta VNC 5900 ou a porta RDP 3389.

Ligue-se através de um serviço

Se a sua VM se ligar à porta pod-network predefinida e não conseguir comunicar diretamente com o endereço IP da VM, exponha a VM atrás de um equilibrador de carga Service.

  1. Crie um manifesto Service, como my-service-load-balancer.yaml, no editor à sua escolha:

    nano my-service-load-balancer.yaml
    
  2. Copie e cole o seguinte manifesto YAML:

    apiVersion: v1
    kind: Service
    metadata:
      name: VM_NAME-service
    spec:
      selector:
        kubevirt/vm: VM_NAME
      ports:
      - name: PORT_NAME
        protocol: PROTOCOL_TYPE
        port: EXTERNAL_PORT
        targetPort: TARGET_PORT
      type: LoadBalancer
    

    Neste Servicetipo de manifesto, substitua os seguintes valores:

    • VM_NAME: o nome da VM a expor para acesso remoto.
    • PORT_NAME: o nome do seu protocolo, como ssh, vnc ou rdp.
    • PROTOCOL_TYPE: o tipo de protocolo, como TCP para SSH e RDP, ou UDP para VNC.
    • EXTERNAL_PORT: o número da porta externa a expor e que usa para se ligar.
    • TARGET_PORT: a porta de destino, como 22 para SSH.
  3. Guarde e feche o manifesto Service no editor.

  4. Crie o Service com o kubectl:

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. Obtenha a morada EXTERNAL-IP do serviço de balanceador de carga:

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    O endereço IP do equilibrador de carga é apresentado, conforme mostrado no seguinte exemplo de resultado:

    NAME          TYPE           CLUSTER-IP       EXTERNAL-IP   PORT(S)        AGE
    vm1-service   LoadBalancer   172.26.232.167   10.200.0.51   22:31141/TCP   6d20h
    
  6. Estabeleça ligação ao endereço EXTERNAL-IP do balanceador de carga com um protocolo padrão, como usar um cliente SSH:

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    Substitua os seguintes valores:

    • USERNAME: o nome de utilizador de uma conta na sua VM.
    • LOAD_BALANCER_IP_ADDRESS: o endereço IP do seu equilibrador de carga.
    • PATH_TO_KEY: o caminho para a chave SSH privada.

Ligue-se diretamente através de SSH

Se o seu cliente estiver ligado à mesma rede física que os nós do cluster bare metal e não precisar de usar túneis SSH para se ligar ao cluster, pode estabelecer ligação através de kubectl virt ssh.

  1. Para usar o SSH para ligar uma VM do Linux a partir da consola com o suplemento virtctl:

    kubectl virt ssh USERNAME@VM_NAME --namespace VM_NAMESPACE --kubeconfig KUBECONFIG
    

    Substitua os seguintes valores:

    • USERNAME: o nome de utilizador para aceder à sua VM. Esta conta é criada se não existir na VM.
    • VM_NAME: o nome da sua VM.
  2. Depois de estabelecer ligação com êxito através do SSH à VM e já não precisar da ligação, saia da sessão SSH:

    exit
    

Associe diretamente através da consola

Se não tiver conetividade de rede direta à sua VM Linux para acesso SSH, ligue-se à consola da VM através do tempo de execução da VM na consola do GDC. Este método abre uma consola de série. Após a ligação, é apresentado um comando em vez de uma consola gráfica.

  1. Para aceder a uma VM do Linux a partir da consola, use o suplemento virtctl:

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    Substitua VM_NAME pelo nome da sua VM.

    Quando lhe for pedido, introduza as credenciais do utilizador da sua VM. Estas credenciais têm de existir na VM ou ser aplicadas quando a VM é criada. Se necessário, consulte a secção seguinte para criar credenciais de utilizador iniciais quando cria uma VM.

  2. Depois de estabelecer ligação com êxito à consola da VM e já não precisar da ligação, saia da sessão da VM e da consola:

    Ctrl + ]
    

Estabeleça ligação diretamente através do VNC

Pode usar o comando kubectl virt vnc para abrir a consola gráfica Virtual Network Computing (VNC) para aceder às suas VMs. Este método funciona para VMs que executam um SO convidado do Windows ou do Linux. Quando usa o comando kubectl virt vnc, o tempo de execução da VM no GDC abre o VNC para si, pelo que não tem de ativar o VNC no SO convidado.

Precisa de credenciais existentes para iniciar sessão na VM, como as que define para criar credenciais de utilizador iniciais quando cria uma VM.

  1. Para aceder a uma VM através do VNC, use o suplemento virtctl:

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    Substitua VM_NAME pelo nome da sua VM.

    Quando lhe for pedido, introduza as credenciais do utilizador da sua VM.

  2. Depois de estabelecer ligação com êxito à sessão VNC da VM e não precisar mais da ligação, termine sessão na VM para fechar a ligação VNC.

Crie credenciais de utilizador iniciais

Quando se liga à VM através da consola, tem de especificar as credenciais do utilizador. O processo de criação das credenciais de utilizador iniciais difere para os sistemas operativos convidados Linux e Windows.

SO convidado Linux

Para VMs Linux, as credenciais do utilizador podem ser incorporadas nas suas imagens personalizadas ou podem ser especificadas quando cria uma VM.

  • Use o parâmetro --configure-initial-password com o kubectl virt create comando:

    kubectl virt create vm VM_NAME \
        --image ubuntu20.04 \
        --os-type Linux \
        --configure-initial-password USERNAME:PASSWORD \
        --kubeconfig KUBECONFIG
    

    Substitua os seguintes valores:

    • VM_NAME: nome da VM.
    • USERNAME: nome de utilizador da conta a criar na VM.
    • PASSWORD: palavra-passe da conta de utilizador.

    Este comando de exemplo cria uma VM Linux que executa o Ubuntu 20.04. Recomendamos que altere as credenciais iniciais depois de iniciar sessão na VM pela primeira vez.

SO Windows convidado

Use os passos seguintes para repor a palavra-passe de um utilizador existente ou criar a palavra-passe inicial de um novo utilizador:

  1. Ative o agente convidado na sua VM do Windows:

    1. Configure a VM para ativar o agente convidado.

    2. Use o VNC ou o RDP para estabelecer ligação à VM.

    3. Na VM, navegue para a unidade guest agent. Na maioria dos casos, é o drive E:.

    4. Use o PowerShell para executar install.ps1.

      Isto instala e inicia o agente convidado. O agente convidado é iniciado automaticamente para os reinícios de VMs subsequentes.

    5. Feche a sessão remota.

  2. Na estação de trabalho de administração, use o seguinte comando para repor (ou definir, se usar um novo nome de utilizador) a palavra-passe da VM do Windows:

    kubectl virt reset-windows-password VM_NAME \
        --user=USERNAME \
        --namespace=VM_NAMESPACE
    

    Substitua o seguinte:

    • VM_NAME: o nome da VM.
    • USERNAME: o nome de utilizador para o qual quer repor (ou definir) a palavra-passe. Se o nome de utilizador for novo, o comando cria uma nova conta do Windows e define a palavra-passe inicial.
    • VM_NAMESPACE: (Opcional) o espaço de nomes da VM. Esta flag é opcional. Se não for especificado, é usado o espaço de nomes predefinido, default.

    Para repor (ou definir) a palavra-passe sem um pedido de confirmação, use a flag --force opcional. Quando usa a flag --force, o comando avisa-o das consequências da reposição da palavra-passe de uma conta existente. Sem a flag --force, o comando pede-lhe que confirme a reposição da palavra-passe com o seguinte texto:

    This command creates an account and sets an initial password for the
    user USERNAME if the account does not already exist.
    If the account already exists, resetting the password can cause the
    LOSS OF ENCRYPTED DATA secured with the current password, including
    files and stored passwords.
    
    Would you like to set or reset the password for USERNAME (Y/n)?
    

    Depois de confirmar (ou forçar) a reposição da palavra-passe, o comando devolve a nova palavra-passe para a VM e o nome de utilizador especificados:

    Resetting and retrieving password for USERNAME on VM_NAME
    
    vm_name:    VM_NAME
    username:   USERNAME
    password:   PASSWORD
    

O que se segue?