7.3. 使用服务公开虚拟机


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

7.3.1. 关于服务

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

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

7.3.2. 双栈支持

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

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

SingleStack
control plane 根据配置的第一个服务集群 IP 范围为该服务分配集群 IP 地址。
PreferDualStack
control plane 为配置了双栈的集群中的服务分配 IPv4 和 IPv6 集群 IP 地址。
RequireDualStack
对于没有启用双栈网络的集群,这个选项会失败。对于配置了双栈的集群,其行为与将值设置为 PreferDualStack 时相同。control plane 从 IPv4 和 IPv6 地址范围分配集群 IP 地址。

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

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

7.3.3. 使用命令行创建服务

您可以使用命令行创建服务并将其与虚拟机 (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
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.