服務(Service)
Kubernetes 中 Service 是 將運行在一個或一組?Pod?上的網絡應用程序公開為網絡服務的方法。
Kubernetes 中 Service 的一個關鍵目標是讓你無需修改現有應用以使用某種不熟悉的服務發現機制。 你可以在 Pod 集合中運行代碼,無論該代碼是為云原生環境設計的, 還是被容器化的老應用。 你可以使用 Service 讓一組 Pod 可在網絡上訪問,這樣客戶端就能與之交互。
如果你使用?Deployment?來運行你的應用, Deployment 可以動態地創建和銷毀 Pod。 在任何時刻,你都不知道有多少個這樣的 Pod 正在工作以及它們健康與否; 你可能甚至不知道如何辨別健康的 Pod。 Kubernetes?Pod?的創建和銷毀是為了匹配集群的預期狀態。 Pod 是臨時資源(你不應該期待單個 Pod 既可靠又耐用)。
每個 Pod 會獲得屬于自己的 IP 地址(Kubernetes 期待網絡插件來保證這一點)。 對于集群中給定的某個 Deployment,這一刻運行的 Pod 集合可能不同于下一刻運行該應用的 Pod 集合。
這就帶來了一個問題:如果某組 Pod(稱為“后端”)為集群內的其他 Pod(稱為“前端”) 集合提供功能,前端要如何發現并跟蹤要連接的 IP 地址,以便其使用負載的后端組件呢?
Kubernetes 中的 Service
Service API 是 Kubernetes 的組成部分,它是一種抽象,幫助你將 Pod 集合在網絡上公開出去。 每個 Service 對象定義端點的一個邏輯集合(通常這些端點就是 Pod)以及如何訪問到這些 Pod 的策略。
Service 所對應的 Pod 集合通常由你定義的選擇算符來確定。
如果你的工作負載使用 HTTP 通信,你可能會選擇使用?Ingress?來控制 Web 流量如何到達該工作負載。Ingress 不是一種 Service,但它可用作集群的入口點。 Ingress 能讓你將路由規則整合到同一個資源內,這樣你就能將工作負載的多個組件公開出去, 這些組件使用同一個偵聽器,但各自獨立地運行在集群中。
用于 Kubernetes 的?Gateway?API 能夠提供 Ingress 和 Service 所不具備的一些額外能力。 Gateway 是使用?CustomResourceDefinitions?實現的一系列擴展 API。 你可以添加 Gateway 到你的集群中,之后就可以使用它們配置如何訪問集群中運行的網絡服務。
云原生服務發現
如果你想要在自己的應用中使用 Kubernetes API 進行服務發現,可以查詢?API 服務器, 尋找匹配的 EndpointSlice 對象。 只要 Service 中的 Pod 集合發生變化,Kubernetes 就會為其更新 EndpointSlice。
對于非本地應用,Kubernetes 提供了在應用和后端 Pod 之間放置網絡端口或負載均衡器的方法。
定義 Service
Kubernetes 中的 Service 是一個對象?(與 Pod 或 ConfigMap 類似)。你可以使用 Kubernetes API 創建、查看或修改 Service 定義。 通常你會使用?kubectl
?這類工具來替你發起這些 API 調用。
你可以定義一個 Service 來發布該 TCP 偵聽器。
apiVersion: v1
kind: Service
metadata:name: my-service
spec:selector:app.kubernetes.io/name: MyAppports:- protocol: TCPport: 80targetPort: 9376
系統將創建一個名為 "my-service" 的、?服務類型默認為 ClusterIP 的 Service。 該 Service 指向帶有標簽?app.kubernetes.io/name: MyApp
?的所有 Pod 的 TCP 端口 9376。
Kubernetes 為該服務分配一個 IP 地址(稱為 “集群 IP”),供虛擬 IP 地址機制使用。?
此 Service 的控制器不斷掃描與其選擇算符匹配的 Pod 集合,然后對 Service 的 EndpointSlice 集合執行必要的更新。
Service 能夠將任意入站?port
?映射到某個?targetPort
。 默認情況下,出于方便考慮,targetPort
?會被設置為與?port
?字段相同的值。