Kubernetes 中的服务位于何处?

Where do services live in Kubernetes?

我正在学习 Kubernetes,目前正在深入研究高可用性,虽然我知道我可以使用本地(或远程)设置高可用性控制平面(API-服务器、控制器、调度程序) etcds 以及一组高可用性的 minions(通过 Kubernetes 本身),我仍然不确定服务在这个概念中的位置。

如果他们住在控制平面中:很好,我可以将它们设置为高可用性。

如果他们住在某个节点上:好的,但是如果节点出现故障或以任何其他方式变得不可用怎么办?

据我了解,需要服务将我的 pods 公开到互联网以及负载平衡。所以没有 HA 服务,我冒着无法访问我的应用程序的风险(即使它可能对系统的任何其他方面都具有超高可用性)。

您可以将服务视为内部(在某些情况下是外部)负载均衡器。该定义存储在 Kubernetes API 服务器中,但它存在的事实如果没有实现它就没有任何意义。与服务一起工作的最常见组件是 kube-proxy,它使用 iptables 在节点上实现服务(这意味着每个节点都在其本地 iptables 规则中实现了每个服务),但也有 ie。 Ingress Controller 实现使用 API 中的服务概念来查找端点并将流量定向到它们,有效地跳过了 iptables 实现。最后还有像 linkerd or istio 这样的服务网格解决方案,它们可以自己利用服务定义。

在大多数实施中 pods 之间的服务负载平衡,这意味着只要您有一个支持 pod 处于活动状态(并且具有足够的容量),您的 "service" 就会响应(因此您也可以获得 HA ,特别是如果你实施 readiness/liveness 探测,除其他外,将从服务中删除不健康的 pods)

Kubernetes Service 文档对此提供了很好的见解

Kubernetes Service是k8s Cluster中的另一个REST Object。有以下类型的服务。它们中的每一个在集群中都有不同的用途。

  • 集群IP
  • 节点端口
  • 负载均衡器
  • 无头

服务的基本目的

  • 为 pods
  • 提供单点网关
  • 负载平衡 pods
  • 内部Pods通讯
  • 提供稳定性,因为 pods 可以用不同的 Ip
  • 死机和重启
  • 更多

这些对象存储在 etcd 中,因为它是集群中唯一的真实来源。

Kube-proxy 负责创建这些对象。它使用选择器和标签。

例如,每个 pod 对象都有标签,因此服务对象有选择器来匹配这些标签。此外,每个 Pod 都有端点,所以基本上 kube-proxy 将这些端点 (IP:Port) 分配给服务 (IP:Port)。Kube-proxy 使用 IP-Tables 规则来实现这个魔法。

Kube-Proxy 在每个集群节点中部署为 DaemonSet,因此它们通过使用 etcd 相互了解。