Google Distributed Cloud용 VM 런타임을 사용하는 VM에 연결

이 문서는 베어메탈용 GKE를 실행하는 애플리케이션 소유자를 대상으로 합니다. 이 문서에서는 Google Distributed Cloud용 VM 런타임을 사용하는 가상 머신(VM)에 연결하는 방법을 보여줍니다. IP 주소를 직접 사용하거나 SSH 또는 Console 액세스를 위한 기본 제공 도구를 사용해서 VM에 연결할 수 있습니다.

시작하기 전에

이 문서를 완료하려면 다음 리소스에 대해 액세스 권한이 필요합니다.

VM에 비밀번호 없는 SSH 액세스 구성

Google Distributed Cloud용 VM 런타임에서 설치하는 게스트 에이전트를 통해 VM에 직접 비밀번호 없는 SSH 액세스가 가능합니다. 특히 게스트 에이전트는 SSH 키를 설치하고 만료합니다. 이 기능을 사용하면 클러스터 네트워크 외부의 클라이언트에서 VM에 액세스할 수 있는 SSH 터널이 사용 설정됩니다.

게스트 에이전트 사용 설정

게스트 에이전트를 사용 설정하려면 다음 안내를 따르세요.

  1. VirtualMachine 커스텀 리소스를 확인하여 게스트 에이전트를 사용 설정하도록 구성되었는지 확인합니다.

    kubectl get gvm VM_NAME -o yaml --kubeconfig KUBECONFIG
    

    spec.osType 필드는 VM의 운영체제(Linux 또는 Windows)로 설정되어야 합니다. spec.guestEnvironment 섹션은 명시적으로 비워두면 안 됩니다. 섹션이 빈 상태로 구성된 경우(guestEnvironment: {}), 완전히 삭제하여 게스트 에이전트를 사용 설정할 수 있습니다.

    액세스하려는 VM의 VirtualMachine 커스텀 리소스는 다음과 같습니다.

    apiVersion: vm.cluster.gke.io/v1
    kind: VirtualMachine
    metadata:
      name: sample-vm
    spec:
      compute:
        cpu:
          vcpus: 2
        memory:
          capacity: 4Gi
    ...
      osType: Linux
    ...
    
  2. 필요한 경우 kubectl edit을 사용하여 VirtualMachine 커스텀 리소스를 업데이트합니다.

  3. 게스트 에이전트가 작동하는지 확인하려면 VM 커스텀 리소스의 status를 확인합니다.

    kubectl get gvm VM_NAME --kubeconfig KUBECONFIG
    

    게스트 에이전트가 작동하면 GuestEnvironmentEnabledGuestEnvironmentDataSynced 조건에 대한 status: "True"가 표시됩니다.

    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
      ...
    

비밀번호 없는 SSH 액세스 사용 설정

VM에 비밀번호 없는 SSH 액세스를 사용 설정하려면 다음 안내를 따르세요.

  1. 원하는 편집기에서 vm-access-request.yaml과 같은 VirtualMachineAccessRequest 매니페스트 파일을 만듭니다.

    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
    

    다음을 바꿉니다.

    • VMAR_NAME: 액세스 요청 리소스의 이름입니다.
    • VM_NAMESPACE: 액세스하려는 VM의 네임스페이스입니다.
    • VM_NAME: 액세스하려는 VM의 이름입니다.
    • USERNAME: VM에 액세스하는 사용자의 사용자 이름입니다.
    • PUBLIC_SSH_KEY: SSH 액세스를 위한 공개 키입니다. 일반적으로 id_rsa.pub 파일의 콘텐츠입니다.
    • EXPIRATION_TIME: ttl(수명) 필드는 SSH 키가 유효한 기간을 지정합니다.

      예를 들어 30m을 지정하면 SSH 키가 30분 후 만료됩니다.

      이 플래그에는 다음 단위가 사용됩니다.

      • s, 초
      • m, 분
      • h, 시간
      • d, 일
  2. kubectl apply를 사용하여 매니페스트 파일에서 VirtualMachineAccessRequest을 만듭니다. 예를 들어 매니페스트 파일의 이름을 vm-access-request.yaml로 지정한 경우

    kubectl apply -f MANIFEST --kubeconfig KUBECONFIG
    

    다음을 바꿉니다.

    • MANIFEST: 액세스 요청 매니페스트 파일의 이름입니다. 예를 들면 vm-access-request.yaml입니다.
    • KUBECONFIG: 액세스 중인 VM을 호스팅하는 클러스터의 kubeconfig 파일 경로입니다.
  3. 액세스 요청 구성이 성공했는지 확인하려면 VirtualMachineAccessRequest의 상태를 확인합니다.

    kubectl get vmar VMAR_NAME -o yaml --kubeconfig KUBECONFIG
    

    구성이 성공하면 status 섹션에 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
    

게스트 에이전트 사용 중지

새 VM을 만들고 osType 필드를 설정하면 게스트 에이전트가 사용 설정됩니다. 이 기능이 미리보기 상태인 동안에는 VirtualMachine 커스텀 리소스를 수정하여 이 기능을 사용 중지할 수 있습니다. 게스트 에이전트를 사용 중지하면 VM에 대한 비밀번호 없는 SSH 액세스가 사용 중지됩니다.

게스트 에이전트를 중지하려면 다음을 실행합니다.

  1. 구성을 변경하기 전에 kubectl를 사용하여 VM을 중지합니다.

    kubectl virt stop VM_NAME --kubeconfig KUBECONFIG
    
  1. VM 리소스를 수정합니다.

    kubectl edit gvm VM_NAME --kubeconfig KUBECONFIG
    
  2. VirtualMachine 구성을 업데이트하여 빈 spec.guestEnvironment를 명시적으로 추가합니다.

    apiVersion: vm.cluster.gke.io/v1alpha1
    kind: VirtualMachine
    metadata:
      name: vm-example
      namespace: default
    spec:
      compute:
      ...
      osType: Linux
      guestEnvironment: {}
    
  3. 편집기에서 업데이트된 VM 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 VM을 시작합니다.

    kubectl virt start VM_NAME --kubeconfig KUBECONFIG
    

IP 주소를 사용하여 연결

VM에 액세스 가능한 IP 주소가 있고 VM에 액세스하기 위한 사용자 인증 정보가 이미 있으면 해당 SSH, VNC, RDP와 같은 프로토콜을 사용하여 연결할 수 있습니다.

IP 주소를 통해 연결

VM의 IP 주소에 직접 연결할 수 있으면 다음 방법 중 하나를 사용합니다.

SSH

  1. VM 세부정보를 가져와서 IP 주소를 확인합니다.

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

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • VM_NAMESPACE: VM의 네임스페이스입니다.

    다음 예시 출력은 VM 정보 및 IP 주소를 보여줍니다.

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. SSH 클라이언트를 사용하여 VM에 연결합니다.

    ssh USERNAME@IP_ADDRESS -i PATH_TO_KEY
    

    다음 값을 바꿉니다.

    • USERNAME: VM 계정의 사용자 이름입니다.
    • IP_ADDRESS: 이전 단계에서 가져온 VM의 IP 주소입니다.
    • PATH_TO_KEY: 비공개 SSH 키의 경로입니다.

VNC 또는 RDP

가상 네트워크 컴퓨팅(VNC)원격 데스크톱 프로토콜(RDP)에서는 그래픽 콘솔을 사용하여 VM에 액세스할 수 있습니다. IP 주소를 사용할 때는 VM에 연결하는 데 사용하기 전 게스트 OS에서 VNC 또는 RDP를 사용 설정해야 합니다. VNC 또는 RDP 사용 설정 및 사용에 대한 자세한 내용은 게스트 OS 문서를 참조하세요.

또한 VM을 만들 때 초기 사용자 인증 정보를 만들기 위해 정의하는 것과 같이 VM에 로그인하기 위해 기존 사용자 인증 정보가 필요합니다.

  1. VM 세부정보를 가져와서 IP 주소를 확인합니다.

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

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • VM_NAMESPACE: VM의 네임스페이스입니다.

    다음 예시 출력은 VM 정보 및 IP 주소를 보여줍니다.

    NAME   STATUS    AGE   IP
    vm1    Running   7m    10.200.0.21
    
  2. 클라이언트 도구와 VNC 포트 5900 또는 RDP 포트 3389와 같은 적합한 포트를 사용해서 이전 단계에서 가져온 VM의 IP 주소에 연결합니다.

서비스를 통해 연결

VM이 기본 pod-network에 연결되고 VM의 IP 주소와 직접 통신할 수 없으면 부하 분산기 Service 뒤에 VM을 노출합니다.

  1. 원하는 편집기에서 my-service-load-balancer.yaml과 같은 Service 매니페스트를 만듭니다.

    nano my-service-load-balancer.yaml
    
  2. 다음 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
    

    Service 매니페스트 유형에서 다음 값을 바꿉니다.

    • VM_NAME: 원격 액세스에 노출할 VM의 이름입니다.
    • PORT_NAME: ssh, vnc, rdp와 같은 프로토콜의 이름입니다.
    • PROTOCOL_TYPE: SSH 및 RDP의 tcp, VNC의 udp와 같은 프로토콜 유형입니다.
    • EXTERNAL_PORT: 노출 및 연결에 사용할 외부 포트 번호입니다.
    • TARGET_PORT: SSH의 22와 같은 대상 포트입니다.
  3. 편집기에서 Service 매니페스트를 저장하고 닫습니다.

  4. kubectl을 사용하여 Service를 만듭니다.

    kubectl apply -f my-service-load-balancer.yaml  --kubeconfig KUBECONFIG
    
  5. 부하 분산기 서비스의 EXTERNAL-IP 주소를 가져옵니다.

    kubectl get service VM_NAME-service --kubeconfig KUBECONFIG
    

    다음 예시 출력에 표시된 것처럼 부하 분산기의 IP 주소가 표시됩니다.

    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. SSH 클라이언트 사용과 같이 표준 프로토콜을 사용해서 부하 분산기의 EXTERNAL-IP 주소에 연결합니다.

    ssh USERNAME@LOAD_BALANCER_IP_ADDRESS  -i PATH_TO_KEY
    

    다음 값을 바꿉니다.

    • USERNAME: VM 계정의 사용자 이름입니다.
    • LOAD_BALANCER_IP_ADDRESS: 부하 분산기의 IP 주소입니다.
    • PATH_TO_KEY: 비공개 SSH 키의 경로입니다.

SSH를 통해 직접 연결

클라이언트가 베어메탈용 Anthos 클러스터 노드와 동일한 물리적 네트워크에 연결되어 있고 클러스터에 연결하기 위해 SSH 터널을 사용할 필요가 없으면 kubectl virt ssh를 사용하여 연결할 수 있습니다.

  1. SSH를 사용하여 virtctl 부가기능으로 Console에서 Linux VM에 연결하려면 다음 안내를 따르세요.

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

    다음 값을 바꿉니다.

    • USERNAME: VM에 액세스하기 위한 사용자 이름입니다. 이 계정이 VM에 없으면 생성됩니다.
    • VM_NAME: VM의 이름입니다.
  2. SSH를 사용해서 VM에 성공적으로 연결되었고 더 이상 연결이 필요하지 않으면 SSH 세션을 종료합니다.

    exit
    

Console을 직접 사용하여 연결

SSH 액세스를 위해 Linux VM에 대한 직접 네트워크 연결이 없으면 Google Distributed Cloud용 VM 런타임 콘솔을 사용해서 VM의 콘솔에 연결합니다. 이 방법은 직렬 콘솔을 엽니다. 연결 후에는 그래픽 콘솔 대신 명령 프롬프트가 표시됩니다.

  1. Console에서 Linux VM에 액세스하려면 virtctl 부가기능을 사용합니다.

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    VM_NAME을 VM 이름으로 바꿉니다.

    메시지가 표시되면 VM에 대한 사용자 인증 정보를 입력합니다. 이러한 사용자 인증 정보는 VM에 존재하거나 VM이 생성될 때 적용되어야 합니다. 필요에 따라 VM을 만들 때 초기 사용자 인증 정보를 만드는 방법은 다음 섹션을 참조하세요.

  2. VM의 Console에 성공적으로 연결되었고 연결이 더 이상 필요하지 않으면 VM 세션과 Console을 종료합니다.

    Ctrl + ]
    

VNC를 직접 사용하여 연결

kubectl virt vnc 명령어를 사용하여 가상 네트워크 컴퓨팅(VNC) 그래픽 콘솔을 열어 VM에 액세스할 수 있습니다. 이 방법은 Windows 또는 Linux 게스트 OS를 실행하는 VM에 적합합니다. kubectl virt vnc 명령어를 사용하면 Google Distributed Cloud용 VM 런타임이 VNC를 열기 때문에 게스트 OS에서 VNC를 사용 설정할 필요가 없습니다.

VM을 만들 때 초기 사용자 인증 정보를 만들기 위해 정의하는 것과 같이 VM에 로그인하기 위해 기존 사용자 인증 정보가 필요합니다.

  1. VNC를 사용하여 VM에 액세스하려면 virtctl 부가기능을 사용합니다.

    kubectl virt vnc VM_NAME --kubeconfig KUBECONFIG
    

    VM_NAME을 VM 이름으로 바꿉니다.

    메시지가 표시되면 VM에 대한 사용자 인증 정보를 입력합니다.

  2. VM의 VNC 세션에 성공적으로 연결되었고 연결이 더 이상 필요하지 않으면 VM에서 로그오프하고 VNC 연결을 종료합니다.

초기 사용자 인증 정보 만들기

Console을 사용하여 VM에 연결할 때는 사용자 인증 정보를 지정해야 합니다. 초기 사용자 인증 정보를 만드는 프로세스는 Linux 및 Windows 게스트 운영체제에 따라 다릅니다.

Linux 게스트 OS

Linux VM의 경우 커스텀 이미지에 사용자 인증 정보를 내장하거나 VM을 만들 때 지정할 수 있습니다.

  • kubectl virt create 명령어에 --configure-initial-password 매개변수를 사용합니다.

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

    다음 값을 바꿉니다.

    • VM_NAME: VM의 이름입니다.
    • USERNAME: VM에서 만들려는 계정의 사용자 이름입니다.
    • PASSWORD: 사용자 계정의 비밀번호입니다.

    이 예시 명령어는 Ubuntu 20.04를 실행하는 Linux VM을 만듭니다. VM에 처음 로그인한 후 초기 사용자 인증 정보를 변경하는 것이 좋습니다.

Windows 게스트 OS

다음 단계를 따라 기존 사용자의 비밀번호를 재설정하거나 새 사용자의 초기 비밀번호를 만듭니다.

  1. Windows VM에서 게스트 에이전트를 사용 설정합니다.

    1. VM을 구성하여 게스트 에이전트를 사용 설정합니다.

    2. VNC 또는 RDP를 사용하여 VM에 연결합니다.

    3. VM에서 guest agent 드라이브로 이동합니다. 대부분의 경우 E: 드라이브입니다.

    4. PowerShell을 사용하여 install.ps1을 실행합니다.

      이렇게 하면 게스트 에이전트가 설치되고 시작됩니다. 이후 VM 재부팅 시 게스트 에이전트가 자동으로 시작됩니다.

    5. 원격 세션을 닫습니다.

  2. 관리자 워크스테이션에서 다음 명령어를 사용하여 Windows VM 비밀번호를 재설정하거나 새 사용자 이름을 사용하는 경우 설정합니다.

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

    다음을 바꿉니다.

    • VM_NAME: VM의 이름
    • USERNAME: 비밀번호를 재설정(또는 설정)할 사용자 이름입니다. 새 사용자 이름의 경우 명령어는 새 Windows 계정을 만들고 초기 비밀번호를 설정합니다.
    • VM_NAMESPACE: (선택사항) VM의 네임스페이스입니다. 이 플래그는 선택사항입니다. 지정하지 않으면 기본 네임스페이스 default가 사용됩니다.

    확인 메시지 없이 비밀번호를 재설정(또는 설정)하려면 선택사항인 --force 플래그를 사용합니다. --force 플래그를 사용하면 기존 계정의 비밀번호를 재설정하여 나타나는 결과에 대한 경고가 표시됩니다. --force 플래그가 없으면 명령어는 다음 텍스트로 비밀번호 재설정을 확인하라는 메시지를 표시합니다.

    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)?
    

    비밀번호 재설정을 확인하거나 강제한 후 이 명령어는 지정된 VM 및 사용자 이름의 새 비밀번호를 반환합니다.

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

다음 단계