×

您可以通过创建Service对象来公开集群内或集群外的虚拟机。

关于服务

Kubernetes 服务为客户端公开对在一些 Pod 上运行的应用程序的网络访问。服务提供抽象、负载均衡,并且在NodePortLoadBalancer类型的情况下,还提供对外部世界的访问。

ClusterIP

在内部 IP 地址和 DNS 名称上公开服务,以便集群内的其他应用程序可以使用。单个服务可以映射到多个虚拟机。当客户端尝试连接到服务时,客户端的请求会在可用的后端之间进行负载均衡。ClusterIP是默认的服务类型。

NodePort

在集群中每个选定节点的同一端口上公开服务。NodePort使得端口可以从集群外部访问,只要节点本身对客户端外部可访问即可。

LoadBalancer

在当前云中(如果支持)创建一个外部负载均衡器,并为服务分配一个固定的外部 IP 地址。

对于内部部署集群,您可以通过部署 MetalLB 运算符来配置负载均衡服务。

双协议栈支持

如果为您的集群启用了 IPv4 和 IPv6 双协议栈网络,则可以通过定义Service对象中的spec.ipFamilyPolicyspec.ipFamilies字段来创建使用 IPv4、IPv6 或两者的服务。

spec.ipFamilyPolicy字段可以设置为以下值之一

SingleStack

控制平面根据第一个配置的服务集群 IP 范围为服务分配集群 IP 地址。

PreferDualStack

对于已配置双协议栈的集群,控制平面将为服务分配 IPv4 和 IPv6 集群 IP 地址。

RequireDualStack

对于未启用双协议栈网络的集群,此选项将失败。对于已配置双协议栈的集群,其行为与值设置为PreferDualStack时相同。控制平面将从 IPv4 和 IPv6 地址范围分配集群 IP 地址。

您可以定义要用于单协议栈的 IP 族,或者通过将spec.ipFamilies字段设置为以下数组值之一来定义双协议栈的 IP 族顺序

  • [IPv4]

  • [IPv6]

  • [IPv4, IPv6]

  • [IPv6, IPv4]

使用命令行创建服务

您可以使用命令行创建服务并将其与虚拟机 (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 special: key添加到spec.template.metadata.labels节。

    虚拟机上的标签会传递到 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