GDC で VM ランタイムを使用する VM に接続する

このドキュメントは、ベアメタル版 GKE を実行するアプリケーション オーナーを対象としています。このドキュメントでは、GDC で VM ランタイムを使用する仮想マシン(VM)に接続する方法について説明します。IP アドレスを使用して直接 VM に接続することも、SSH やコンソール アクセス用の組み込みツールを使用して接続することも可能です。

準備

このドキュメントの内容を実施するには、次のリソースへのアクセス権が必要です。

VM へのパスワードなしの SSH アクセスを構成する

VM への直接のパスワードなし SSH アクセスは、GDC 上の VM ランタイムによってインストールされたゲスト エージェントによって容易になります。具体的には、ゲスト エージェントが 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
    

    ゲスト エージェントが機能している場合、GuestEnvironmentEnabled 条件と GuestEnvironmentDataSynced 条件に 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. 任意のエディタで、VirtualMachineAccessRequest マニフェスト(vm-access-request.yaml など)を作成します。

    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

Virtual Network Computing(VNC)リモート デスクトップ プロトコル(RDP)では、グラフィカル コンソールを使用して VM にアクセスできます。IP アドレスを使用する場合は、ゲスト OS で VNC または RDP を有効にしてから、いずれかを使用して VM に接続する必要があります。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 アドレスに接続します。

Service を介して接続する

VM がデフォルトの pod-network に接続し、VM の IP アドレスと直接通信できない場合は、ロードバランサ Service の背後で VM を公開します。

  1. 任意のエディタで、Service マニフェスト(my-service-load-balancer.yaml など)を作成します。

    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: プロトコルの名前(sshvncrdp など)。
    • 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 clusters on bare metal と同じ物理ネットワークに接続されていて、クラスタへの接続に SSH トンネルを使用する必要がない場合は、kubectl virt ssh を使用して接続できます。

  1. SSH を使用して、コンソールから virtctl アドオンで Linux VM を接続するには:

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

    次の値を置き換えます。

    • USERNAME: VM にアクセスするためのユーザー名。このアカウントが VM に存在しない場合は作成されます。
    • VM_NAME: VM の名前。
  2. SSH を使用して VM が正常に接続され、接続が不要になると SSH セッションを終了します。

    exit
    

コンソールを使用して直接接続する

SSH アクセス用に Linux VM に直接ネットワーク接続できない場合は、GDC コンソールの VM ランタイムを使用して VM のコンソールに接続します。この方法では、シリアル コンソールが開かれます。接続時に、グラフィカル コンソールではなく、コマンド プロンプトが表示されます。

  1. コンソールから Linux VM にアクセスするには、virtctl アドオンを使用します。

    kubectl virt console VM_NAME --kubeconfig KUBECONFIG
    

    VM_NAME は実際の VM 名に置き換えます。

    プロンプトが表示されたら、VM のユーザー認証情報を入力します。これらの認証情報は VM 上に存在するか、VM の作成時に適用することが必要です。必要に応じて、次のセクションを参照して、VM の作成時に初期ユーザー認証情報を作成します。

  2. VM のコンソールに正常に接続し、接続が不要になると VM セッションとコンソールを終了します。

    Ctrl + ]
    

VNC を使用して直接接続する

kubectl virt vnc コマンドを実行して Virtual Network Computing(VNC)グラフィカル コンソールを開き、VM にアクセスできます。この方法は、Windows と Linux のいずれかのゲスト OS を実行している VM で機能します。kubectl virt vnc コマンドを使用すると、GDC 上の 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 接続を閉じます。

最初のユーザー認証情報を作成する

コンソールを使用して 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
    

次のステップ