Pod 本质上是共享 Network、IPC 和 UTS 名称空间以及存储资源的容器集合,我们可以把每个 Pod 对象想象成一个逻辑主机,它类似于现实世界中的物理主机或虚拟机,而运行于同一个 Pod 对象中多个进程则类似于物理机或虚拟机上独立运行的进程,不同的是,Pod 中各进程运行于彼此隔离的容器中,并于各容器间共享网络和存储两种关键资源。
Service 是由基于匹配规则在集群中挑选出的一组 Pod 对象的集合、访问这组 Pod 集合的固定 IP 地址,以及对请求进行调度的方法等功能所构成的一种 API 资源类型,是 Pod 资源的代理和负载均衡器。Service 匹配 Pod 对象的规则可用“标签选择器”进行体现,并根据标签来过滤符合条件的资源对象。
Kubernetes 使用定制的 DNS 服务为这类需求提供了自动的服务注册和服务发现功能。CoreDNS 附件会为集群中的每个 Service 对象(包括 DNS 服务自身)生成唯一的 DNS 名称标识,以及相应的 DNS 资源记录,服务的 DNS 名称遵循标准的 svc.namespace.svc.cluster-domain 格式。
除非出于管理目的有意调整,Service 资源的名称和 ClusterIP 在其整个生命周期内都不会发生变动。
控制器是支撑 Kubernetes 声明式 API 的关键组件,它持续监视对 API Server 上的 API 对象的添加、更新和删除等更改操作,并在发生此类事件时执行目标对象相应的业务逻辑,从而将客户端的管理指令转为对象管理所需要的真正的操作过程。简单来说,一个具体的控制器对象是一个控制循环程序,它在单个 API 对象上创建一个控制循环以确保该对象的状态符合预期。
Kubernetes 的网络中存在 4 种主要类型的通信:同一 Pod 内的容器间通信、各 Pod 彼此间通信、Pod 与 Service 间的通信以及集群外部的流量与 Service 间的通信。
节点网络:各主机(Master 和 Node)自身所属的网络,相关 IP 地址配置在节点的网络接口,用于各主机之间的通信,例如 Master 与各 Node 间的通信。此地址配置在 Kubernetes 集群构建之前,它并不能由 Kubernetes 管理,需要管理员在集群构建之前就自行确定其地址配置及管理方式。
Pod 网络:Pod 对象所属的网络,相关地址配置在 Pod 网络接口,用于各 Pod 间的通信。Pod 网络是一种虚拟网络,需要通过传统的 kubenet 网络插件或新式的 CNI 网络插件实现,常见的实现机制有 Overlay 和 Underlay 两种。
Service 网络:一个虚拟网络,相关地址不会配置在任何主机或 Pod 的网络接口之上,而是通过 Node 上的 kube-proxy 配置为节点的 iptables 或 ipvs 规则,进而将发往此地址的所有流量调度至 Service 后端的各 Pod 对象之上;Service 网络在 Kubernetes 集群创建时予以指定,而各 Service 的地址则在用户创建 Service 时予以动态配置。
kubernetes 集群上的服务大致可分为两种:API Server 和服务类应用,它们的客户端要么来自集群内的其他 Pod,要么来自集群外部的用户或应用程序。前一种通信通常发生在 Pod 网络和 Service 网络之上的东西向流量;而后一种通信,尤其是访问运行于 Pod 中的服务类应用的南北向流量,则需要先经由集群边界进入集群内部的网络中,即由节点网络到达 Service 网络和 Pod 网络。