apiVersion: v1
kind: Service
metadata:
name: mysubdomain (1)
spec:
selector:
expose: me (2)
clusterIP: None (3)
ports: (4)
- protocol: TCP
port: 1234
targetPort: 1234
您可以使用无头服务通过稳定的完全限定域名 (FQDN) 访问连接到默认内部 Pod 网络的虚拟机 (VM)。
Kubernetes *无头服务* 是一种不分配集群 IP 地址来表示一组 Pod 的服务形式。无头服务不为服务提供单个虚拟 IP 地址,而是为与服务关联的每个 Pod 创建 DNS 记录。您可以通过其 FQDN 公开虚拟机,而无需公开特定的 TCP 或 UDP 端口。
如果您使用 OpenShift Container Platform Web 控制台创建了虚拟机,则可以在**虚拟机详细信息**页面的**概述**选项卡上的**网络**磁贴中找到其内部 FQDN。有关连接到虚拟机的更多信息,请参阅使用其内部 FQDN 连接到虚拟机。 |
要在命名空间中创建无头服务,请将clusterIP: None
参数添加到服务 YAML 定义中。
您已安装 OpenShift CLI (oc
)。
创建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 | 服务公开的端口列表。您必须定义至少一个端口。这可以是任何任意值,因为它不影响无头服务。 |
保存Service
清单文件。
运行以下命令创建服务
$ oc create -f headless_service.yaml
要使用其内部完全限定域名 (FQDN) 从集群内部连接到虚拟机 (VM),您必须首先将虚拟机映射到无头服务。在 VM 配置文件中设置spec.hostname
和spec.subdomain
参数。
如果存在名称与子域名匹配的无头服务,则会为虚拟机创建唯一的 DNS A 记录,形式为<vm.spec.hostname>.<vm.spec.subdomain>.<vm.metadata.namespace>.svc.cluster.local
。
编辑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 值匹配。 |
保存更改并退出编辑器。
重新启动虚拟机以应用更改。
您可以使用虚拟机 (VM) 的内部完全限定域名 (FQDN) 连接到虚拟机。
您已安装virtctl
工具。
您已从 Web 控制台或通过将 VM 映射到无头服务来识别 VM 的内部 FQDN。内部 FQDN 的格式为<vm.spec.hostname>.<vm.spec.subdomain>.<vm.metadata.namespace>.svc.cluster.local
。
输入以下命令连接到 VM 控制台
$ virtctl console vm-fedora
要使用请求的 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 地址。