Kubernetes 服务类型

如果一个 pod 要与另一个 pod 通信,需要知道另一个 pod 的 IP 地址。Kubernetes 服务提供了一种机制以找到其他 pod。{:shortdesc}

根据 Kubernetes 网络模型,pod IP 是临时的;如果 pod 崩溃或被删除,并且在创建了一个新的 pod 代替,那么很可能会收到新的 IP 地址。Kubernetes 服务 在新选项卡中打开 允许您选择机制以找到其他 pod。

集群 IP

可以根据需要在 pod 或副本前创建名为 ClusterIP 的内部固定 IP。此固定 IP 地址来自另一个 IP 池,此 IP 池通过在安装 IBM® Cloud Private 时使用 config.yaml 中的 service_cluster_ip_range 参数指定。此 IP 地址选自 RFC1918 专用网络范围,和 network_cidr 参数一样。选择此子网的大小时,必须考虑集群中预期服务数;但是之后也可使用 扩展服务 IP 范围manage_network/extend_service_ip.md) 调整大小。

注:必须注意,所选子网不能与容器可能与其通信的集群外部任何网络资源(包括 network_cidr 参数)及集群节点所在的一个或多个子网冲突。

ClusterIP 提供负载均衡的 IP 地址。与标签选择器匹配的一个或多个 pod 可以将流量转发到此 IP 地址。ClusterIP 服务必须定义一个或多个要侦听的端口以及目标端口,以将 TCP/UDP 流量转发到容器。用于 ClusterIP 的 IP 地址在集群外不可路由,如同 pod IP 地址一样。

ClusterIP

在内部,Kubernetes 将标签选择器解析为一组 pod,并采用临时 pod IP 地址,生成 Endpoints 资源,以便 ClusterIP 通过代理将流量转发到这些资源。在每个节点上运行的 kube-proxy 用于配置每个工作程序节点。此 kube-proxy 将发送到 ClusterIP IP 地址的流量转发到与集群中其他位置的标签选择器匹配的实时 pod 的临时 IP 地址。启动或移除与标签选择器匹配的 pod 或者 pod 活跃度更改的情况下,创建或移除新的服务时会更新转发规则。

pod 的活跃度由用于部署的 yaml 中定义的运行状况检查确定。此运行状况检查可以是:预期为 200 状态码的 HTTP GET、打开的 TCP 端口或从容器内部执行的返回特定状态码的命令。这些项在 pod 的资源定义中进行定义。运行状况检查由 kubelet 进程在每个工作程序节点中本地执行,并与控制平面同步。如果达到运行状况检查失败阈值,那么 ClusterIP 会从目标组移除容器。

利用以下两种主要技术来实现转发规则:iptables 在新选项卡中打开ipvs 在新选项卡中打

NodePort

通过在较大的端口(缺省为 30000-32767)上公开集群外部的 ClusterIP 服务,基于 ClusterIP 类型服务构建的类型为 NodePort 的服务。如果未指定端口,那么 Kubernetes 会自动选择一个可用端口。本地 kube-proxy 负责侦听节点上的端口,并将 NodePort 上的客户端流量转发到 ClusterIP

缺省情况下,集群中每个节点侦听此端口,包括其上 pod 所匹配的标签选择器未运行的节点。这些节点上的流量在内部进行 NAT,并转发到目标 pod(Cluster 外部流量策略)。

具有 Cluster externalTrafficPolicy 的 NodePort

此行为可通过将 .spec.externalTrafficPolicy 属性设置为 Local 控制,这样会仅允许运行 pod 的工作程序节点侦听指定 NodePort。通过这种方式,可以避免额外中继段,且使客户端的 IP 地址在与 pod 通信时得以保留。

手动配置外部负载均衡器以将来自集群外部客户端的 4 层流量转发到在 Kubernetes 集群中运行的一组特定 pod 时,可以使用 NodePort。在此类情况下,必须提前设置用于 NodePort 的特定端口号,且必须配置外部负载均衡器以将流量转发到所有工作程序节点上的侦听端口。必须在外部负载均衡器上配置运行状况检查,以确定哪些工作程序节点是正常运行的 pod,哪些不是。

具有 Local externalTrafficPolicy 的 NodePort

LoadBalancer

LoadBalancer 服务类型通过供应和配置来自公共和专有云提供者的外部负载均衡器,基于 NodePort 服务类型构建。它通过将 4 层流量转发到工作程序节点公开在集群中运行的服务。通过此动态方式,实现涉及外部负载均衡器和 NodePort 类型服务的案例。但是,通常,需要执行在 Kubernetes 集群内部运行的集成,此集群在 API 上监视类型为 LoadBalancer 的服务。

具有 AWS 的 loadbalancer 服务类型