8.17. 仮想マシンのネットワーク

8.17.1. 仮想マシンのデフォルト Pod ネットワークの使用

OpenShift Virtualization でデフォルトの Pod ネットワークを使用できます。これを実行するには、masquerade バインディングメソッドを使用する必要があります。デフォルト以外のネットワークには、masquerade モードを使用しないでください。

セカンダリーネットワークの場合は、bridge バインディングメソッドを使用します。

8.17.1.1. コマンドラインでのマスカレードモードの設定

マスカレードモードを使用し、仮想マシンの送信トラフィックを Pod IP アドレスの背後で非表示にすることができます。マスカレードモードは、ネットワークアドレス変換 (NAT) を使用して仮想マシンを Linux ブリッジ経由で Pod ネットワークバックエンドに接続します。

仮想マシンの設定ファイルを編集して、マスカレードモードを有効にし、トラフィックが仮想マシンに到達できるようにします。

前提条件

  • 仮想マシンは、IPv4 アドレスを取得するために DHCP を使用できるように設定される必要がある。以下の例では、DHCP を使用するように設定されます。

手順

  1. 仮想マシン設定ファイルの interfaces 仕様を編集します。

    kind: VirtualMachine
    spec:
      domain:
        devices:
          interfaces:
            - name: red
              masquerade: {} 1
              ports: 2
                - port: 80
      networks:
      - name: red
        pod: {}
    1
    マスカレードモードを使用した接続
    2
    オプション: 仮想マシンから公開するポートを一覧表示します。それぞれは port フィールドで指定します。port の値は、0 から 65536 の間の数字でなければなりません。ポート アレイが使用されていない場合、有効な範囲内のすべてのポートが着信トラフィックに対して開かれます。この例では、受信トラフィックはポート 80 で許可されます。
    注記

    ポート 49152 および 49153 は libvirt プラットフォームで使用するために予約され、これらのポートへの着信トラフィックはすべて破棄されます。

  2. 仮想マシンを作成します。

    $ oc create -f <vm-name>.yaml

8.17.1.2. デュアルスタック(IPv4 および IPv6)でのマスカレードモードの設定

cloud-init を使用して、新規仮想マシンを、デフォルトの Pod ネットワークで IPv6 と IPv4 の両方を使用するように設定できます。

IPv6 ネットワークアドレスは、仮想マシン設定のゲートウェイの fd10:0:2::1fd10:0:2::2/120 に静的に設定される必要があります。これらは IPv6 トラフィックを仮想マシンにルーティングするために virt-launcher Pod で使用され、外部では使用されません。

仮想マシンが実行されている場合、仮想マシンの送受信トラフィックは、virt-launcher Pod の IPv4 アドレスと固有の IPv6 アドレスの両方にルーティングされます。次に、virt-launcher Pod は IPv4 トラフィックを仮想マシンの DHCP アドレスにルーティングし、IPv6 トラフィックを仮想マシンの静的に設定された IPv6 アドレスにルーティングします。

前提条件

  • OpenShift Container Platform クラスターは、デュアルスタック用に設定された OVN-Kubernetes Container Network Interface (CNI) ネットワークプロバイダーを使用する必要があります。

手順

  1. 新規の仮想マシン設定では、masquerade を指定したインターフェースを追加し、cloud-init を使用して IPv6 アドレスとデフォルトゲートウェイを設定します。

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm-ipv6
    ...
              interfaces:
                - name: red
                  masquerade: {} 1
                  ports:
                    - port: 80 2
          networks:
          - name: red
            pod: {}
          volumes:
          - cloudInitNoCloud:
              networkData: |
                version: 2
                ethernets:
                  eth0:
                    dhcp4: true
                    addresses: [ fd10:0:2::2/120 ] 3
                    gateway6: fd10:0:2::1 4
    1
    マスカレードモードを使用した接続
    2
    ポート 80 の受信トラフィックを仮想マシンに対して許可します。
    3
    IPv6 アドレス fd10:0:2::2/120 を使用する必要があります。
    4
    ゲートウェイ fd10:0:2::1 を使用する必要があります。
  2. namespace で仮想マシンインスタンスを作成します。

    $ oc create -f example-vm-ipv6.yaml

検証

  • IPv6 が設定されていることを確認するには、仮想マシンを起動し、仮想マシンインスタンスのインターフェースステータスを表示して、これに IPv6 アドレスがあることを確認します。
$ oc get vmi <vmi-name> -o jsonpath="{.status.interfaces[*].ipAddresses}"

8.17.1.3. バインディング方法の選択

OpenShift Virtualization Web コンソールウィザードから仮想マシンを作成する場合、Networking 画面で必要なバインディングメソッドを選択します。

8.17.1.3.1. ネットワークフィールド
名前説明

名前

ネットワークインターフェースコントローラーの名前。

モデル

ネットワークインターフェースコントローラーのモデルを示します。サポートされる値は e1000e および virtio です。

Network

利用可能なネットワーク接続定義の一覧。

Type

利用可能なバインディングメソッドの一覧。デフォルトの Pod ネットワークについては、masquerade が唯一の推奨されるバインディングメソッドになります。セカンダリーネットワークの場合は、 bridge バインディングメソッドを使用します。masquerade メソッドは、デフォルト以外のネットワークではサポートされません。SR-IOV ネットワークデバイスを設定し、namespace でそのネットワークを定義した場合は、SR-IOV を選択します。

MAC Address

ネットワークインターフェースコントローラーの MAC アドレス。MAC アドレスが指定されていない場合、これは自動的に割り当てられます。

8.17.1.4. デフォルトネットワーク用の仮想マシン設定の例

8.17.1.4.1. テンプレート: 仮想マシンの設定ファイル
apiVersion: kubevirt.io/v1
kind: VirtualMachine
metadata:
  name: example-vm
  namespace: default
spec:
  running: false
  template:
    spec:
      domain:
        devices:
          disks:
            - name: containerdisk
              disk:
                bus: virtio
            - name: cloudinitdisk
              disk:
                bus: virtio
          interfaces:
          - masquerade: {}
            name: default
        resources:
          requests:
            memory: 1024M
      networks:
        - name: default
          pod: {}
      volumes:
        - name: containerdisk
          containerDisk:
            image: kubevirt/fedora-cloud-container-disk-demo
        - name: cloudinitdisk
          cloudInitNoCloud:
            userData: |
              #!/bin/bash
              echo "fedora" | passwd fedora --stdin
8.17.1.4.2. テンプレート: Windows 仮想マシンインスタンスの設定ファイル
apiVersion: kubevirt.io/v1
kind: VirtualMachineInstance
metadata:
  labels:
    special: vmi-windows
  name: vmi-windows
spec:
  domain:
    clock:
      timer:
        hpet:
          present: false
        hyperv: {}
        pit:
          tickPolicy: delay
        rtc:
          tickPolicy: catchup
      utc: {}
    cpu:
      cores: 2
    devices:
      disks:
      - disk:
          bus: sata
        name: pvcdisk
      interfaces:
      - masquerade: {}
        model: e1000
        name: default
    features:
      acpi: {}
      apic: {}
      hyperv:
        relaxed: {}
        spinlocks:
          spinlocks: 8191
        vapic: {}
    firmware:
      uuid: 5d307ca9-b3ef-428c-8861-06e72d69f223
    machine:
      type: q35
    resources:
      requests:
        memory: 2Gi
  networks:
  - name: default
    pod: {}
  terminationGracePeriodSeconds: 0
  volumes:
  - name: pvcdisk
    persistentVolumeClaim:
      claimName: disk-windows

8.17.1.5. 仮想マシンからのサービスの作成

仮想マシンを公開するために Service オブジェクトを最初に作成し、実行中の仮想マシンからサービスを作成します。

注記

IPv4 および IPv6 のデュアルスタックネットワークがクラスターに対して有効にされている場合、Service オブジェクトに spec.ipFamilyPolicy および spec.ipFamilies フィールドを定義して、IPv4、IPv6、またはそれら両方を使用するサービスを作成できます。

spec.ipFamilyPolicy フィールドは以下の値のいずれかに設定できます。

  • SingleStack: コントロールプレーンは、最初に設定されたサービスクラスターの IP 範囲に基づいて、サービスのクラスター IP アドレスを割り当てます。
  • PreferDualStack: コントロールプレーンは、デュアルスタックが設定されたクラスターのサービス用に IPv4 および IPv6 クラスター IP アドレスの両方を割り当てます。
  • RequireDualStack: このオプションは、デュアルスタックネットワークが有効にされていないクラスターの場合には失敗します。デュアルスタックが設定されたクラスターの場合、その値が PreferDualStack に設定されている場合と同じになります。コントロールプレーンは、IPv4 アドレスと IPv6 アドレス範囲の両方からクラスター IP アドレスを割り当てます。

単一スタックに使用する IP ファミリーや、デュアルスタック用の IP ファミリーの順序は、spec.ipFamilies を以下のアレイ値のいずれかに設定して定義できます。

  • [IPv4]
  • [IPv6]
  • [IPv4, IPv6]
  • [IPv6, IPv4]

ClusterIP サービスタイプは、クラスター内で仮想マシンを内部に公開します。NodePort または LoadBalancer サービスタイプは、クラスター外から仮想マシンを外部に公開します。

この手順では、type: ClusterIPService オブジェクトを仮想マシンバックエンドサービスとして作成し、これに接続し、公開する方法についての例を示します。

注記

ClusterIP は、サービスの type が指定されていない場合のデフォルトサービスの type です。

手順

  1. 以下のように仮想マシンの YAML を編集します。

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-ephemeral
      namespace: example-namespace
    spec:
      running: false
      template:
        metadata:
          labels:
            special: key 1
        spec:
          domain:
            devices:
              disks:
                - name: containerdisk
                  disk:
                    bus: virtio
                - name: cloudinitdisk
                  disk:
                    bus: virtio
              interfaces:
              - masquerade: {}
                name: default
            resources:
              requests:
                memory: 1024M
          networks:
            - name: default
              pod: {}
          volumes:
            - name: containerdisk
              containerDisk:
                image: kubevirt/fedora-cloud-container-disk-demo
            - name: cloudinitdisk
              cloudInitNoCloud:
                userData: |
                  #!/bin/bash
                  echo "fedora" | passwd fedora --stdin
    1
    ラベル special: keyspec.template.metadata.labels セクションに追加します。
    注記

    仮想マシンのラベルは Pod に渡されます。VirtualMachine 設定のラベル (例: special: key) は、この手順の後で作成する Service YAML selector 属性のラベルに一致する必要があります。

  2. 仮想マシン YAML を保存して変更を適用します。
  3. Service YAML を編集し、Service オブジェクトを作成し、公開するために必要な設定を行います。

    apiVersion: v1
    kind: Service
    metadata:
      name: vmservice 1
      namespace: example-namespace 2
    spec:
      ports:
      - port: 27017
        protocol: TCP
        targetPort: 22 3
      selector:
        special: key 4
      type: ClusterIP 5
    1
    作成および公開するサービスの name を指定します。
    2
    仮想マシン YAML に指定する namespace に対応する Service YAML の metadata セクションの namespace を指定します。
    3
    targetPort: 22 を追加し、SSH ポート 22 にサービスを公開します。
    4
    Service YAML の spec セクションで、special: keyselector 属性に追加します。これは、仮想マシン YAML 設定ファイルに追加した labels に対応します。
    5
    Service YAML の spec セクションで、ClusterIP サービスの type: ClusterIP を追加します。NodePortLoadBalancer などのクラスター外にある他のタイプのサービスを作成し、公開するには、type: ClusterIPtype: NodePort または type: LoadBalancer に随時置き換えます。
  4. Service YAML を保存し、サービス設定を保管します。
  5. ClusterIP サービスを作成します。

    $ oc create -f <service_name>.yaml
  6. 仮想マシンを起動します。仮想マシンがすでに実行中の場合は、これを再起動します。
  7. Service オブジェクトをクエリーし、これが利用可能であり、ClusterIP タイプで設定されていることを確認します。

    検証

    • oc get service コマンドを実行し、仮想マシンで参照する namespace および Service YAML ファイルを指定します。

      $ oc get service -n example-namespace

      出力例

      NAME        TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)     AGE
      vmservice   ClusterIP   172.30.3.149   <none>        27017/TCP   2m

      • 出力で示されているように、vmservice が実行されています。
      • TYPE は、Service YAML で指定したように ClusterIP として表示されます。
  8. サービスをサポートするために使用する仮想マシンへの接続を確立します。別の仮想マシンなど、クラスター内のオブジェクトから接続します。

    1. 以下のように仮想マシンの YAML を編集します。

      apiVersion: kubevirt.io/v1
      kind: VirtualMachine
      metadata:
        name: vm-connect
        namespace: example-namespace
      spec:
        running: false
        template:
          spec:
            domain:
              devices:
                disks:
                  - name: containerdisk
                    disk:
                      bus: virtio
                  - name: cloudinitdisk
                    disk:
                      bus: virtio
                interfaces:
                - masquerade: {}
                  name: default
              resources:
                requests:
                  memory: 1024M
            networks:
              - name: default
                pod: {}
            volumes:
              - name: containerdisk
                containerDisk:
                  image: kubevirt/fedora-cloud-container-disk-demo
              - name: cloudinitdisk
                cloudInitNoCloud:
                  userData: |
                    #!/bin/bash
                    echo "fedora" | passwd fedora --stdin
    2. oc create コマンドを実行して 2 番目の仮想マシンを作成します。ここで、file.yaml は仮想マシン YAML の名前になります。

      $ oc create -f <file.yaml>
    3. 仮想マシンを起動します。
    4. 以下の virtctl コマンドを実行して仮想マシンに接続します。

      $ virtctl -n example-namespace console <new-vm-name>
      注記

      サービスタイプ LoadBalancer の場合、vinagre クライアントを使用し、パブリック IP およびポートを使用して仮想マシンに接続します。外部ポートは、サービスタイプ LoadBalancer を使用する場合に動的に割り当てられます。

    5. ssh コマンドを実行して接続を認証します。ここで、172.30.3.149 はサービスの ClusterIP であり、fedora は仮想マシンのユーザー名です。

      $ ssh fedora@172.30.3.149 -p 27017

      検証

      • 公開するサービスをサポートする仮想マシンのコマンドプロンプトが表示されます。実行中の仮想マシンがサポートするサービスの準備ができました。