×

您可以使用无头服务通过稳定的完全限定域名 (FQDN) 访问连接到默认内部 Pod 网络的虚拟机 (VM)。

Kubernetes *无头服务* 是一种不分配集群 IP 地址来表示一组 Pod 的服务形式。无头服务不为服务提供单个虚拟 IP 地址,而是为与服务关联的每个 Pod 创建 DNS 记录。您可以通过其 FQDN 公开虚拟机,而无需公开特定的 TCP 或 UDP 端口。

如果您使用 OpenShift Container Platform Web 控制台创建了虚拟机,则可以在**虚拟机详细信息**页面的**概述**选项卡上的**网络**磁贴中找到其内部 FQDN。有关连接到虚拟机的更多信息,请参阅使用其内部 FQDN 连接到虚拟机

使用 CLI 在项目中创建无头服务

要在命名空间中创建无头服务,请将clusterIP: None参数添加到服务 YAML 定义中。

先决条件
  • 您已安装 OpenShift CLI (oc)。

步骤
  1. 创建Service清单以公开虚拟机,例如以下示例

    apiVersion: v1
    kind: Service
    metadata:
      name: mysubdomain (1)
    spec:
      selector:
        expose: me (2)
      clusterIP: None (3)
      ports: (4)
      - protocol: TCP
        port: 1234
        targetPort: 1234
    1 服务的名称。这必须与VirtualMachine清单文件中的spec.subdomain属性匹配。
    2 此服务选择器必须与VirtualMachine清单文件中的expose:me标签匹配。
    3 指定无头服务。
    4 服务公开的端口列表。您必须定义至少一个端口。这可以是任何任意值,因为它不影响无头服务。
  2. 保存Service清单文件。

  3. 运行以下命令创建服务

    $ oc create -f headless_service.yaml

使用 CLI 将虚拟机映射到无头服务

要使用其内部完全限定域名 (FQDN) 从集群内部连接到虚拟机 (VM),您必须首先将虚拟机映射到无头服务。在 VM 配置文件中设置spec.hostnamespec.subdomain参数。

如果存在名称与子域名匹配的无头服务,则会为虚拟机创建唯一的 DNS A 记录,形式为<vm.spec.hostname>.<vm.spec.subdomain>.<vm.metadata.namespace>.svc.cluster.local

步骤
  1. 编辑VirtualMachine清单以添加服务选择器标签和子域名,运行以下命令

    $ oc edit vm <vm_name>
    示例VirtualMachine清单文件
    apiVersion: kubevirt.io/v1
    kind: VirtualMachine
    metadata:
      name: vm-fedora
    spec:
      template:
        metadata:
          labels:
            expose: me (1)
        spec:
          hostname: "myvm" (2)
          subdomain: "mysubdomain" (3)
    # ...
    1 expose:me标签必须与您之前创建的Service清单的spec.selector属性匹配。
    2 如果未指定此属性,则生成的 DNS A 记录采用<vm.metadata.name>.<vm.spec.subdomain>.<vm.metadata.namespace>.svc.cluster.local的形式。
    3 spec.subdomain属性必须与Service对象的metadata.name值匹配。
  2. 保存更改并退出编辑器。

  3. 重新启动虚拟机以应用更改。

使用内部 FQDN 连接虚拟机

您可以使用虚拟机 (VM) 的内部完全限定域名 (FQDN) 连接到虚拟机。

先决条件
  • 您已安装virtctl工具。

  • 您已从 Web 控制台或通过将 VM 映射到无头服务来识别 VM 的内部 FQDN。内部 FQDN 的格式为<vm.spec.hostname>.<vm.spec.subdomain>.<vm.metadata.namespace>.svc.cluster.local

步骤
  1. 输入以下命令连接到 VM 控制台

    $ virtctl console vm-fedora
  2. 要使用请求的 FQDN 连接到 VM,请运行以下命令

    $ ping myvm.mysubdomain.<namespace>.svc.cluster.local
    示例输出
    PING myvm.mysubdomain.default.svc.cluster.local (10.244.0.57) 56(84) bytes of data.
    64 bytes from myvm.mysubdomain.default.svc.cluster.local (10.244.0.57): icmp_seq=1 ttl=64 time=0.029 ms

    在上述示例中,myvm.mysubdomain.default.svc.cluster.local 的 DNS 条目指向 10.244.0.57,这是当前分配给 VM 的集群 IP 地址。