6.4. 配置对虚拟机的 SSH 访问


您可以使用以下方法配置对虚拟机的 SSH 访问:

  • virtctl ssh 命令

    您可以创建一个 SSH 密钥对,将公钥添加到虚拟机,并使用私钥运行 virtctl ssh 命令连接到虚拟机。

    您可以在运行时将公共 SSH 密钥添加到 Red Hat Enterprise Linux (RHEL) 9 虚拟机,或第一次引导到使用 cloud-init 数据源配置的客户机操作系统的虚拟机。

  • virtctl port-forward 命令

    您可以将 virtctl port-foward 命令添加到 .ssh/config 文件中,并使用 OpenSSH 连接到虚拟机。

  • 服务

    您可以创建一个服务,将服务与虚拟机关联,并连接到该服务公开的 IP 地址和端口。

  • 二级网络

    您可以配置二级网络,将虚拟机(VM)附加到二级网络接口,并连接到 DHCP 分配的 IP 地址。

6.4.1. 访问配置注意事项

根据流量负载和客户端要求,配置对虚拟机(VM)的访问的每个方法都有优点和限制。

服务为从集群外部访问的应用程序提供出色的性能,并推荐使用。

如果内部集群网络无法处理流量负载,您可以配置二级网络。

virtctl sshvirtctl port-forwarding 命令
  • 易于配置。
  • 建议对虚拟机进行故障排除。
  • 推荐使用 Ansible 自动配置虚拟机的 virtctl port-forwarding
  • 动态公共 SSH 密钥可用于使用 Ansible 调配虚拟机。
  • 因为 API 服务器的负担,不建议用于 Rsync 或 Remote Desktop Protocol 等高流量应用程序。
  • API 服务器必须能够处理流量负载。
  • 客户端必须能够访问 API 服务器。
  • 客户端必须具有集群的访问凭证。
集群 IP 服务
  • 内部集群网络必须能够处理流量负载。
  • 客户端必须能够访问内部集群 IP 地址。
节点端口服务
  • 内部集群网络必须能够处理流量负载。
  • 客户端必须能够访问至少一个节点。
负载均衡器服务
  • 必须配置负载均衡器。
  • 每个节点必须能够处理一个或多个负载均衡器服务的流量负载。
二级网络
  • 卓越的性能,因为流量不会通过内部集群网络。
  • 允许灵活的网络拓扑方法。
  • 客户机操作系统必须配置适当的安全性,因为虚拟机直接公开给二级网络。如果虚拟机被破坏,入侵者可能会获得对二级网络的访问权限。

6.4.2. 使用 virtctl ssh

您可以将公共 SSH 密钥添加到虚拟机 (VM),并通过运行 virtctl ssh 命令连接到虚拟机。

这个方法易于配置。但是,不建议在有高流量负载的环境中使用,因为它会对 API 服务器造成负担。

6.4.2.1. 关于静态和动态 SSH 密钥管理

您可以在首次引导时或在运行时动态向虚拟机 (VM) 静态添加公共 SSH 密钥。

注意

只有 Red Hat Enterprise Linux (RHEL) 9 支持动态密钥注入。

静态 SSH 密钥管理

您可以使用 cloud-init 数据源支持配置的客户机操作系统向虚拟机添加静态管理的 SSH 密钥。密钥会在第一次引导时添加到虚拟机 (VM) 中。

您可以使用以下方法之一添加密钥:

  • 在使用 Web 控制台或命令行创建时,向单个虚拟机添加密钥。
  • 使用 Web 控制台向项目添加密钥。之后,密钥会自动添加到您在这个项目中创建的虚拟机。

使用案例

  • 作为虚拟机所有者,您可以使用单个密钥置备所有新创建的虚拟机。
动态 SSH 密钥管理

您可以为安装了 Red Hat Enterprise Linux (RHEL) 9 的虚拟机启用动态 SSH 密钥管理。之后,您可以在运行时更新密钥。密钥由 QEMU 客户机代理添加,该代理使用 Red Hat 引导源安装。

出于安全原因,您可以禁用动态密钥管理。然后,虚拟机会继承创建它的镜像的密钥管理设置。

使用案例

  • 授予或撤销对虚拟机的访问权限:作为集群管理员,您可以通过从应用到命名空间中的所有虚拟机的 Secret 对象添加或删除单个用户的密钥来授予或撤销远程虚拟机访问。
  • 用户访问:您可以将访问凭证添加到您创建和管理的所有虚拟机。
  • Ansible 置备:

    • 作为操作团队成员,您可以创建一个单一 secret,其中包含用于 Ansible 置备的所有密钥。
    • 作为虚拟机所有者,您可以创建虚拟机并附加用于 Ansible 置备的密钥。
  • 密钥轮转:

    • 作为集群管理员,您可以轮转命名空间中虚拟机使用的 Ansible 置备程序密钥。
    • 作为工作负载所有者,您可以轮转您管理的虚拟机的密钥。

6.4.2.2. 静态密钥管理

当使用 Red Hat OpenShift Service on AWS web 控制台或命令行创建虚拟机(VM)时,您可以添加静态管理的公共 SSH 密钥。当虚拟机第一次引导时,密钥会添加为 cloud-init 数据源。

在使用 Web 控制台创建虚拟机时,您还可以将公共 SSH 密钥添加到项目中。密钥保存为 secret,并自动添加到您创建的所有虚拟机中。

注意

如果您在项目中添加 secret,然后删除虚拟机,则 secret 会被保留,因为它是一个命名空间资源。您必须手动删除 secret。

6.4.2.2.1. 从模板创建虚拟机时添加密钥

当使用 Red Hat OpenShift Service on AWS web 控制台创建虚拟机时,您可以添加静态管理的公共 SSH 密钥。密钥会在第一次引导时作为 cloud-init 数据源添加到虚拟机。这个方法不会影响 cloud-init 用户数据。

可选:您可以在项目中添加密钥。之后,此密钥会自动添加到您在项目中创建的虚拟机。

先决条件

  • 您可以通过运行 ssh-keygen 命令生成 SSH 密钥对。

流程

  1. 在 web 控制台中进入到 Virtualization Catalog
  2. 点模板标题。

    客户机操作系统必须支持 cloud-init 数据源的配置。

  3. Customize VirtualMachine
  4. 点击 Next
  5. Scripts 选项卡。
  6. 如果您还没有在项目中添加公共 SSH 密钥,点 Authorized SSH key 旁边的编辑图标,然后选择以下选项之一:

    • 使用现有 :从 secrets 列表中选择一个 secret。
    • 添加新

      1. 浏览到 SSH 密钥文件或在 key 字段中粘贴文件。
      2. 输入 secret 名称。
      3. 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project
  7. 点击 Save
  8. Create VirtualMachine

    VirtualMachine 详情页显示创建虚拟机的进度。

验证

  • Configuration 选项卡上的 Scripts 选项卡。

    secret 名称显示在 Authorized SSH key 部分中。

6.4.2.2.2. 使用 Web 控制台从实例类型创建虚拟机时添加密钥

您可以使用 Red Hat OpenShift Service on AWS web 控制台从实例类型创建虚拟机(VM)。您还可以通过复制现有快照或克隆虚拟机,来使用 Web 控制台创建虚拟机。

您可以从可用可引导卷列表创建虚拟机。您可以在列表中添加基于 Linux 或 Windows 的卷。

当使用 Red Hat OpenShift Service on AWS web 控制台从实例类型创建虚拟机(VM)时,您可以添加静态管理的 SSH 密钥。密钥会在第一次引导时作为 cloud-init 数据源添加到虚拟机。这个方法不会影响 cloud-init 用户数据。

流程

  1. 在 Web 控制台中,导航到 Virtualization Catalog

    InstanceTypes 选项卡默认为打开。

  2. 选择以下选项之一:

    • 从列表中选择合适的可引导卷。如果列表已被截断,请单击 Show all 按钮来显示整个列表。

      注意

      可引导的卷表仅列出 openshift-virtualization-os-images 命名空间中具有 instancetype.kubevirt.io/default-preference 标签的卷。

      • 可选:点星号图标将可引导卷指定为热门卷。不足的可引导卷首先出现在卷列表中。
    • Add volume 上传新卷,或使用现有的持久性卷声明(PVC)、卷快照或 containerDisk 卷。点击 Save

      集群中不可用的操作系统的徽标显示在列表的底部。您可以点击 Add volume 链接为所需的操作系统添加卷。

      另外,还有 创建 Windows 引导源 快速启动的链接。如果您将鼠标悬停在 Select volume 旁边的问号图标上来从行中引导,则同一链接会出现在弹出窗口中。

      安装环境或环境断开连接后,从中引导的卷列表为空。在这种情况下,会显示三个操作系统徽标:Windows、RHEL 和 Linux。您可以点击 Add volume 按钮添加新卷来满足您的要求。

  3. 点实例类型标题,然后选择适合您的工作负载的资源大小。
  4. 可选:选择虚拟机详情,包括虚拟机的名称,适用于您要从其引导的卷:

    • 对于基于 Linux 的卷,请按照以下步骤配置 SSH:

      1. 如果您还没有在项目中添加公共 SSH 密钥,点 VirtualMachine details 部分中的 Authorized SSH key 旁边的编辑图标。
      2. 选择以下选项之一:

        • 使用现有 :从 secrets 列表中选择一个 secret。
        • 添加新: 遵循以下步骤:

          1. 浏览到公共 SSH 密钥文件,或在 key 字段中粘贴文件。
          2. 输入 secret 名称。
          3. 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project
      3. 点击 Save
    • 对于 Windows 卷,请按照以下步骤配置 sysprep 选项:

      • 如果您还没有为 Windows 卷添加 sysprep 选项,请按照以下步骤执行:

        1. VirtualMachine 详情 部分中的 Sysprep 的编辑图标。
        2. 添加 Autoattend.xml 回答文件。
        3. 添加 Unattend.xml 回答文件。
        4. 点击 Save
      • 如果要将现有的 sysprep 选项用于 Windows 卷,请按照以下步骤执行:

        1. 单击 Attach existing sysprep
        2. 输入现有 sysprep Unattend.xml 回答文件的名称。
        3. 点击 Save
  5. 可选: 如果要创建 Windows 虚拟机,您可以挂载 Windows 驱动程序磁盘:

    1. Customize VirtualMachine 按钮。
    2. VirtualMachine 详情页中,点 Storage
    3. 选择 Mount Windows 驱动程序磁盘 复选框。
  6. 可选:点 View YAML & CLI 查看 YAML 文件。点 CLI 查看 CLI 命令。您还可以下载或复制 YAML 文件内容或 CLI 命令。
  7. Create VirtualMachine

创建虚拟机后,您可以在 VirtualMachine 详情页中监控状态。

6.4.2.2.3. 使用命令行在创建虚拟机时添加密钥

当使用命令行创建虚拟机(VM)时,您可以添加静态管理的公共 SSH 密钥。密钥会在第一次引导时添加到虚拟机。

密钥作为 cloud-init 数据源添加到虚拟机中。此方法将访问凭据与 cloud-init 用户数据中的应用数据分隔开。这个方法不会影响 cloud-init 用户数据。

先决条件

  • 您可以通过运行 ssh-keygen 命令生成 SSH 密钥对。

流程

  1. VirtualMachine 对象和 Secret 对象创建清单文件:

    清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      namespace: example-namespace
    spec:
      dataVolumeTemplates:
        - metadata:
            name: example-vm-volume
          spec:
            sourceRef:
              kind: DataSource
              name: rhel9
              namespace: openshift-virtualization-os-images
            storage:
              resources: {}
      instancetype:
        name: u1.medium
      preference:
        name: rhel.9
      running: true
      template:
        spec:
          domain:
            devices: {}
          volumes:
            - dataVolume:
                name: example-vm-volume
              name: rootdisk
            - cloudInitNoCloud: 1
                userData: |-
                  #cloud-config
                  user: cloud-user
              name: cloudinitdisk
          accessCredentials:
            - sshPublicKey:
                propagationMethod:
                  noCloud: {}
                source:
                  secret:
                    secretName: authorized-keys 2
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: authorized-keys
    data:
      key: c3NoLXJzYSB... 3

    1
    指定 cloudInitNoCloud 数据源。
    2
    指定 Secret 对象名称。
    3
    粘贴公共 SSH 密钥。
  2. 运行以下命令来创建 VirtualMachineSecret 对象:

    $ oc create -f <manifest_file>.yaml
  3. 运行以下命令来启动虚拟机:

    $ virtctl start vm example-vm -n example-namespace

验证

  • 获取虚拟机配置:

    $ oc describe vm example-vm -n example-namespace

    输出示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      namespace: example-namespace
    spec:
      template:
        spec:
          accessCredentials:
            - sshPublicKey:
                propagationMethod:
                  noCloud: {}
                source:
                  secret:
                    secretName: authorized-keys
    # ...

6.4.2.3. 动态密钥管理

您可以使用 Red Hat OpenShift Service on AWS web 控制台或命令行为虚拟机(VM)启用动态密钥注入。然后,您可以在运行时更新密钥。

注意

只有 Red Hat Enterprise Linux (RHEL) 9 支持动态密钥注入。

如果您禁用动态密钥注入,则虚拟机会继承创建它的镜像的密钥管理方法。

6.4.2.3.1. 从模板创建虚拟机时启用动态密钥注入

在使用 Red Hat OpenShift Service on AWS web 控制台从模板创建虚拟机时,您可以启用动态公共 SSH 密钥注入。然后,您可以在运行时更新密钥。

注意

只有 Red Hat Enterprise Linux (RHEL) 9 支持动态密钥注入。

密钥由 QEMU 客户机代理添加到虚拟机,该代理使用 RHEL 9 安装。

先决条件

  • 您可以通过运行 ssh-keygen 命令生成 SSH 密钥对。

流程

  1. 在 web 控制台中进入到 Virtualization Catalog
  2. Red Hat Enterprise Linux 9 虚拟机 标题。
  3. Customize VirtualMachine
  4. 点击 Next
  5. Scripts 选项卡。
  6. 如果您还没有在项目中添加公共 SSH 密钥,点 Authorized SSH key 旁边的编辑图标,然后选择以下选项之一:

    • 使用现有 :从 secrets 列表中选择一个 secret。
    • 添加新

      1. 浏览到 SSH 密钥文件或在 key 字段中粘贴文件。
      2. 输入 secret 名称。
      3. 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project
  7. Dynamic SSH 密钥注入 设置为 on。
  8. 点击 Save
  9. Create VirtualMachine

    VirtualMachine 详情页显示创建虚拟机的进度。

验证

  • Configuration 选项卡上的 Scripts 选项卡。

    secret 名称显示在 Authorized SSH key 部分中。

6.4.2.3.2. 使用 Web 控制台在从实例类型创建虚拟机时启用动态密钥注入

您可以使用 Red Hat OpenShift Service on AWS web 控制台从实例类型创建虚拟机(VM)。您还可以通过复制现有快照或克隆虚拟机,来使用 Web 控制台创建虚拟机。

您可以从可用可引导卷列表创建虚拟机。您可以在列表中添加基于 Linux 或 Windows 的卷。

在使用 Red Hat OpenShift Service on AWS web 控制台从实例类型创建虚拟机(VM)时,您可以启用动态 SSH 密钥注入。然后,您可以在运行时添加或撤销密钥。

注意

只有 Red Hat Enterprise Linux (RHEL) 9 支持动态密钥注入。

密钥由 QEMU 客户机代理添加到虚拟机,该代理使用 RHEL 9 安装。

流程

  1. 在 Web 控制台中,导航到 Virtualization Catalog

    InstanceTypes 选项卡默认为打开。

  2. 选择以下选项之一:

    • 从列表中选择合适的可引导卷。如果列表已被截断,请单击 Show all 按钮来显示整个列表。

      注意

      可引导的卷表仅列出 openshift-virtualization-os-images 命名空间中具有 instancetype.kubevirt.io/default-preference 标签的卷。

      • 可选:点星号图标将可引导卷指定为热门卷。不足的可引导卷首先出现在卷列表中。
    • Add volume 上传新卷,或使用现有的持久性卷声明(PVC)、卷快照或 containerDisk 卷。点击 Save

      集群中不可用的操作系统的徽标显示在列表的底部。您可以点击 Add volume 链接为所需的操作系统添加卷。

      另外,还有 创建 Windows 引导源 快速启动的链接。如果您将鼠标悬停在 Select volume 旁边的问号图标上来从行中引导,则同一链接会出现在弹出窗口中。

      安装环境或环境断开连接后,从中引导的卷列表为空。在这种情况下,会显示三个操作系统徽标:Windows、RHEL 和 Linux。您可以点击 Add volume 按钮添加新卷来满足您的要求。

  3. 点实例类型标题,然后选择适合您的工作负载的资源大小。
  4. Red Hat Enterprise Linux 9 虚拟机 标题。
  5. 可选:选择虚拟机详情,包括虚拟机的名称,适用于您要从其引导的卷:

    • 对于基于 Linux 的卷,请按照以下步骤配置 SSH:

      1. 如果您还没有在项目中添加公共 SSH 密钥,点 VirtualMachine details 部分中的 Authorized SSH key 旁边的编辑图标。
      2. 选择以下选项之一:

        • 使用现有 :从 secrets 列表中选择一个 secret。
        • 添加新: 遵循以下步骤:

          1. 浏览到公共 SSH 密钥文件,或在 key 字段中粘贴文件。
          2. 输入 secret 名称。
          3. 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project
      3. 点击 Save
    • 对于 Windows 卷,请按照以下步骤配置 sysprep 选项:

      • 如果您还没有为 Windows 卷添加 sysprep 选项,请按照以下步骤执行:

        1. VirtualMachine 详情 部分中的 Sysprep 的编辑图标。
        2. 添加 Autoattend.xml 回答文件。
        3. 添加 Unattend.xml 回答文件。
        4. 点击 Save
      • 如果要将现有的 sysprep 选项用于 Windows 卷,请按照以下步骤执行:

        1. 单击 Attach existing sysprep
        2. 输入现有 sysprep Unattend.xml 回答文件的名称。
        3. 点击 Save
  6. VirtualMachine 详情 部分中将 Dynamic SSH 密钥注入 设置为 on。
  7. 可选: 如果要创建 Windows 虚拟机,您可以挂载 Windows 驱动程序磁盘:

    1. Customize VirtualMachine 按钮。
    2. VirtualMachine 详情页中,点 Storage
    3. 选择 Mount Windows 驱动程序磁盘 复选框。
  8. 可选:点 View YAML & CLI 查看 YAML 文件。点 CLI 查看 CLI 命令。您还可以下载或复制 YAML 文件内容或 CLI 命令。
  9. Create VirtualMachine

创建虚拟机后,您可以在 VirtualMachine 详情页中监控状态。

6.4.2.3.3. 使用 Web 控制台启用动态 SSH 密钥注入

您可以使用 Red Hat OpenShift Service on AWS web 控制台为虚拟机(VM)启用动态密钥注入。然后,您可以在运行时更新公共 SSH 密钥。

该密钥由 QEMU 客户机代理添加到虚拟机,该代理与 Red Hat Enterprise Linux (RHEL) 9 一起安装。

先决条件

  • 客户机操作系统是 RHEL 9。

流程

  1. 在 web 控制台中进入到 Virtualization VirtualMachines
  2. 选择一个虚拟机以打开 VirtualMachine 详情页。
  3. Configuration 选项卡上,点 Scripts
  4. 如果您还没有在项目中添加公共 SSH 密钥,点 Authorized SSH key 旁边的编辑图标,然后选择以下选项之一:

    • 使用现有 :从 secrets 列表中选择一个 secret。
    • 添加新

      1. 浏览到 SSH 密钥文件或在 key 字段中粘贴文件。
      2. 输入 secret 名称。
      3. 可选: 选择 Automatically apply this key to any new VirtualMachine you create in this project
  5. Dynamic SSH 密钥注入 设置为 on。
  6. 点击 Save
6.4.2.3.4. 使用命令行启用动态密钥注入

您可以使用命令行为虚拟机启用动态密钥注入。然后,您可以在运行时更新公共 SSH 密钥。

注意

只有 Red Hat Enterprise Linux (RHEL) 9 支持动态密钥注入。

密钥由 QEMU 客户机代理添加到虚拟机,该代理使用 RHEL 9 自动安装安装。

先决条件

  • 您可以通过运行 ssh-keygen 命令生成 SSH 密钥对。

流程

  1. VirtualMachine 对象和 Secret 对象创建清单文件:

    清单示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      namespace: example-namespace
    spec:
      dataVolumeTemplates:
        - metadata:
            name: example-vm-volume
          spec:
            sourceRef:
              kind: DataSource
              name: rhel9
              namespace: openshift-virtualization-os-images
            storage:
              resources: {}
      instancetype:
        name: u1.medium
      preference:
        name: rhel.9
      running: true
      template:
        spec:
          domain:
            devices: {}
          volumes:
            - dataVolume:
                name: example-vm-volume
              name: rootdisk
            - cloudInitNoCloud: 1
                userData: |-
                  #cloud-config
                  runcmd:
                  - [ setsebool, -P, virt_qemu_ga_manage_ssh, on ]
              name: cloudinitdisk
          accessCredentials:
            - sshPublicKey:
                propagationMethod:
                  qemuGuestAgent:
                    users: ["cloud-user"]
                source:
                  secret:
                    secretName: authorized-keys 2
    ---
    apiVersion: v1
    kind: Secret
    metadata:
      name: authorized-keys
    data:
      key: c3NoLXJzYSB... 3

    1
    指定 cloudInitNoCloud 数据源。
    2
    指定 Secret 对象名称。
    3
    粘贴公共 SSH 密钥。
  2. 运行以下命令来创建 VirtualMachineSecret 对象:

    $ oc create -f <manifest_file>.yaml
  3. 运行以下命令来启动虚拟机:

    $ virtctl start vm example-vm -n example-namespace

验证

  • 获取虚拟机配置:

    $ oc describe vm example-vm -n example-namespace

    输出示例

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      namespace: example-namespace
    spec:
      template:
        spec:
          accessCredentials:
            - sshPublicKey:
                propagationMethod:
                  qemuGuestAgent:
                    users: ["cloud-user"]
                source:
                  secret:
                    secretName: authorized-keys
    # ...

6.4.2.4. 使用 virtctl ssh 命令

您可以使用 virtcl ssh 命令访问正在运行的虚拟机(VM)。

先决条件

  • 已安装 virtctl 命令行工具。
  • 您已向虚拟机添加了一个公共 SSH 密钥。
  • 已安装 SSH 客户端。
  • 安装 virtctl 工具的环境具有访问虚拟机所需的集群权限。例如,运行 oc login 或设置了 KUBECONFIG 环境变量。

流程

  • 运行 virtctl ssh 命令:

    $ virtctl -n <namespace> ssh <username>@example-vm -i <ssh_key> 1
    1
    指定命名空间、用户名和 SSH 私钥。默认的 SSH 密钥位置为 /home/user/.ssh。如果密钥保存在不同的位置,您必须指定路径。

    Example

    $ virtctl -n my-namespace ssh cloud-user@example-vm -i my-key

提示

您可以在 web 控制台中复制 virtctl ssh 命令,从 VirtualMachines 页面的虚拟机旁的选项 kebab 菜单中选择 Copy SSH 命令

6.4.3. 使用 virtctl port-forward 命令

您可以使用本地 OpenSSH 客户端和 virtctl port-forward 命令连接到正在运行的虚拟机 (VM)。您可以将此方法与 Ansible 配合使用,以自动配置虚拟机。

对于低流量应用程序,建议使用这个方法,因为端口转发流量通过 control plane 发送。对于 Rsync 或 Remote Desktop 协议等高流量应用程序(如 Rsync 或 Remote Desktop 协议)使用这个方法,因为它对 API 服务器造成大量负担。

先决条件

  • 已安装 virtctl 客户端。
  • 您要访问的虚拟机正在运行。
  • 安装 virtctl 工具的环境具有访问虚拟机所需的集群权限。例如,运行 oc login 或设置了 KUBECONFIG 环境变量。

流程

  1. 在客户端机器上的 ~/.ssh/config 文件中添加以下文本:

    Host vm/*
      ProxyCommand virtctl port-forward --stdio=true %h %p
  2. 运行以下命令来连接到虚拟机:

    $ ssh <user>@vm/<vm_name>.<namespace>

6.4.4. 使用服务进行 SSH 访问

您可以为虚拟机(VM)创建服务,并连接到该服务公开的 IP 地址和端口。

服务为从集群外部或集群外部访问的应用程序提供出色的性能,并推荐使用。入口流量受防火墙保护。

如果集群网络无法处理流量负载,请考虑使用二级网络进行虚拟机访问。

6.4.4.1. 关于服务

Kubernetes 服务将客户端的网络访问权限公开给一组容器集上运行的应用。服务在 NodePortLoadBalancer 类型方面提供抽象、负载均衡以及暴露于外部世界。

ClusterIP
在内部 IP 地址上公开服务,并将 DNS 名称公开给集群中的其他应用程序。单个服务可映射到多个虚拟机。当客户端尝试连接到服务时,客户端请求会在可用后端之间平衡负载。ClusterIP 是默认的服务类型。
NodePort
在集群中每个所选节点的同一端口上公开该服务。NodePort 使端口可从集群外部访问,只要节点本身可以被客户端外部访问。
LoadBalancer
在当前云中创建外部负载均衡器(如果支持),并为该服务分配固定的外部 IP 地址。

6.4.4.2. 创建服务

您可以使用 Red Hat OpenShift Service on AWS web 控制台、virtctl 命令行工具或 YAML 文件创建服务来公开虚拟机(VM)。

6.4.4.2.1. 使用 Web 控制台启用负载均衡器服务创建

您可以使用 Red Hat OpenShift Service on AWS web 控制台为虚拟机(VM)启用负载均衡器服务。

先决条件

  • 已为集群配置负载均衡器。
  • 以具有 cluster-admin 角色的用户身份登录。

流程

  1. 进入到 Virtualization Overview
  2. Settings 选项卡中,点 Cluster
  3. 展开 General settingsSSH 配置
  4. SSH over LoadBalancer 服务 设置为 on。
6.4.4.2.2. 使用 Web 控制台创建服务

您可以使用 Red Hat OpenShift Service on AWS web 控制台为虚拟机(VM)创建节点端口或负载均衡器服务。

先决条件

  • 已将集群网络配置为支持负载均衡器或节点端口。
  • 要创建负载均衡器服务,您需要已启用了创建负载均衡器服务。

流程

  1. 进入 VirtualMachines 并选择虚拟机来查看 VirtualMachine 详情页。
  2. Details 选项卡中,从 SSH service type 列表中选择 SSH over LoadBalancer
  3. 可选:点复制图标将 SSH 命令复制到您的剪贴板。

验证

  • 检查 Details 标签页中的 Services 窗格,以查看新服务。
6.4.4.2.3. 使用 virtctl 创建服务

您可以使用 virtctl 命令行工具为虚拟机 (VM) 创建服务。

先决条件

  • 已安装 virtctl 命令行工具。
  • 您已将集群网络配置为支持该服务。
  • 安装 virtctl 的环境具有访问虚拟机所需的集群权限。例如,运行 oc login 或设置了 KUBECONFIG 环境变量。

流程

  • 运行以下命令来创建服务:

    $ virtctl expose vm <vm_name> --name <service_name> --type <service_type> --port <port> 1
    1
    指定 ClusterIPNodePortLoadBalancer 服务类型。

    Example

    $ virtctl expose vm example-vm --name example-service --type NodePort --port 22

验证

  • 运行以下命令验证服务:

    $ oc get service

后续步骤

使用 virtctl 创建服务后,您必须将 special: key 添加到 VirtualMachine 清单的 spec.template.metadata.labels 小节中。请参阅使用命令行创建服务

6.4.4.2.4. 使用命令行创建服务

您可以使用命令行创建服务并将其与虚拟机 (VM) 关联。

先决条件

  • 您已将集群网络配置为支持该服务。

流程

  1. 编辑 VirtualMachine 清单,为创建服务添加标签:

    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: example-vm
      namespace: example-namespace
    spec:
      running: false
      template:
        metadata:
          labels:
            special: key 1
    # ...
    1
    spec.template.metadata.labels 小节中添加 special: key
    注意

    虚拟机上的标签会传递到 pod。special: key 标签必须与 Service 清单的 spec.selector 属性中的标签匹配。

  2. 保存 VirtualMachine 清单文件以应用更改。
  3. 创建 Service 清单以公开虚拟机:

    apiVersion: v1
    kind: Service
    metadata:
      name: example-service
      namespace: example-namespace
    spec:
    # ...
      selector:
        special: key 1
      type: NodePort 2
      ports: 3
        protocol: TCP
        port: 80
        targetPort: 9376
        nodePort: 30000
    1
    指定添加到 VirtualMachine 清单的 spec.template.metadata.labels 小节中的标签。
    2
    指定 ClusterIPNodePortLoadBalancer
    3
    指定您要从虚拟机公开的网络端口和协议集合。
  4. 保存 Service 清单文件。
  5. 运行以下命令来创建服务:

    $ oc create -f example-service.yaml
  6. 重启虚拟机以应用更改。

验证

  • 查询 Service 对象以验证它是否可用:

    $ oc get service -n example-namespace

6.4.4.3. 使用 SSH 连接到服务公开的虚拟机

您可以使用 SSH 连接到服务公开的虚拟机 (VM)。

先决条件

  • 您创建了服务来公开虚拟机。
  • 已安装 SSH 客户端。
  • 已登陆到集群。

流程

  • 运行以下命令来访问虚拟机:

    $ ssh <user_name>@<ip_address> -p <port> 1
    1
    指定集群 IP 服务的集群 IP、节点端口服务的节点 IP 或负载均衡器服务的外部 IP 地址。

6.4.5. 使用二级网络进行 SSH 访问

您可以配置二级网络,将虚拟机 (VM) 附加到二级网络接口,并使用 SSH 连接到 DHCP 分配的 IP 地址。

重要

辅助网络提供卓越的性能,因为流量不是由集群网络堆栈处理。但是,虚拟机直接公开给二级网络,不受防火墙保护。如果虚拟机被破坏,入侵者可能会获得对二级网络的访问权限。如果使用此方法,您必须在虚拟机操作系统中配置适当的安全性。

有关网络选项的更多信息,请参阅 OpenShift Virtualization 调优和扩展指南中的 MultusSR-IOV 文档。

先决条件

6.4.5.1. 使用 Web 控制台配置虚拟机网络接口

您可以使用 Red Hat OpenShift Service on AWS web 控制台为虚拟机配置网络接口。

先决条件

  • 为网络创建了网络附加定义。

流程

  1. 进入到 Virtualization VirtualMachines
  2. 点虚拟机查看 VirtualMachine 详情页。
  3. Configuration 选项卡上,点 Network interfaces 选项卡。
  4. Add network interface
  5. 输入接口名称,然后从 Network 列表中选择网络附加定义。
  6. 点击 Save
  7. 重启虚拟机以应用更改。

6.4.5.2. 使用 SSH 连接到附加到二级网络的虚拟机

您可以使用 SSH 连接到二级网络的虚拟机 (VM)。

先决条件

  • 将虚拟机附加到使用 DHCP 服务器的二级网络。
  • 已安装 SSH 客户端。

流程

  1. 运行以下命令来获取虚拟机的 IP 地址:

    $ oc describe vm <vm_name> -n <namespace>

    输出示例

    # ...
    Interfaces:
      Interface Name:  eth0
      Ip Address:      10.244.0.37/24
      Ip Addresses:
        10.244.0.37/24
        fe80::858:aff:fef4:25/64
      Mac:             0a:58:0a:f4:00:25
      Name:            default
    # ...

  2. 运行以下命令来连接到虚拟机:

    $ ssh <user_name>@<ip_address> -i <ssh_key>

    Example

    $ ssh cloud-user@10.244.0.37 -i ~/.ssh/id_rsa_cloud-user

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.