在 Kubernetes 集群中,Service 是将运行在一组 Pods 上的应用程序公开为网络服务的形象办法。Service 能够充当服务发现机制,使咱们能轻松地和上游 Pod 通信,而无需晓得各个 Pod 的确切 IP 地址。
在某些状况下,咱们想检索并连贯到特定 Service 所有 Pod 的 IP 地址。当 Pod 是有状态的(例如已部署的数据库)时,各个 Pod 须要与其同属实例进行通信。在这种状况下,Pod 如果想晓得哪些其余成员是数据库集群的一部分时,Headless Service 能够派上用场。
什么是 Headless Service?
部署 Service 时,能够设置三种不同的 ServiceTypes
以指定所需的 Service 类型:
- ClusterIP:仅在集群外部 ip 地址上公开 Service,这也是默认的
ServiceType
。 - NodePort:容许通过节点上的动态端口公开 Service。
- LoadBalancer:容许应用云提供商的内部负载均衡器公开 Service。
为防止申请在单个 IP 地址前面进行负载平衡,当不须要单个 IP 地址时,咱们能够通过指定 Cluster IP(spec.clusterIP
)的值为 "None"
来创立 Headless Service。Kubernetes 不会为该 Service 调配任何 IP 地址。这种 Service 就称为 Headless Services。
DNS 解析和 Headless Service
部署 Service 时,Kubernetes 会为其调配一个 DNS 名称。集群中的其余组件能够应用此名称与 DNS 和上游 Pod 通信。DNS 名称遵循以下命名约定:
在 IP 地址上应用可读名称后,其余组件就不须要调配给 Service 理论 IP 地址。应用正确的 Pod 抉择(selector)配置 Headless Service 时,Kubernetes 将为上游选定的 Pod 创立正确端点记录和 DNS 配置。
对于将连贯到 Headless Service 的每个已连贯 Pod,也会配置 A 或 AAAA 记录。这样就能够对 Headless Service 执行 DNS 查问,以解析所连贯 Pod 的所有 IP 地址。
如何实际?
假如存在以下问题:Kubernetes 集群中运行着一组有状态的三个 MongoDB Pod。这三个 Pod 独特形成一个 MongoDB 正本集,这是一个高度可用的数据集。
为了可能将控制台应用程序连贯到 MongoDB 正本集,咱们应用 MongoDB C# 驱动程序,同时须要显式定义三个 Pod 的地址。
咱们用 Headless Service 解决这个问题。假设 MongoDb Pod 都带有 app=mongodb
标签,该标签能够在 Headless Service 中用于抉择 Pod。咱们定义的 Headless Service 资源如下所示:
通过将 clusterIp
设置为 "none"
,咱们通知 Kubernetes 将此 Service 视为 Headless Service。因为咱们定义了名称和命名空间,因而能够推断出 DNS 名称。咱们在集群外部应用 mongodb-headless-service.infrastructure.svc.cluster.local
或 mongodb-headless-service.infrastructure
作为地址与 Service 进行通信。
接下来让咱们来执行 DNS 查问,以检索连贯 Pod 的 IP 地址。Dns.GetHostAddresses
办法位于 System.Net
命名空间中,可帮忙咱们执行该 DNS 查问并返回 IP 地址数组。它须要一个主机名或 IP 地址。最初,咱们能够应用 MongoDB 创立连贯字符串(connection string)。代码如下:
通过该解决方案,咱们能够动态创建连贯字符串,其次要长处是,在必须扩大数据库集群时,咱们不用手动更改连贯字符串。
留神:MongoDB 的确通过 DNS 实现了相似的服务发现过程,只需定义 Headless Service 的 DNS 名称即可,这样咱们就不用本人生成连贯字符串。
原文链接:https://mp.weixin.qq.com/s/a_…