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 網絡。