什麼是 Kubernetes 服務?

Kubernetes 服務可為叢集中已部署 Pod 群組 (全數執行相同功能) 進行邏輯抽象化。

鑑於 Pod 為暫時性產物,服務可啟用 Pod 群組來提供特定功能 (網路服務和影像處理等),並為其指派名稱和獨一無二的 IP 位址 (clusterIP)。服務只要於該 IP 位址上執行,就不會遭到變更。此外,服務也會定義其存取原則。

Kubernetes 現況

《讓 Kubernetes 準備就緒並開始運作》(Kubernetes Up and Running)

Kubernetes 領域中的服務和部署有何差異?

對 Kubernetes 而言,部署意味著使用容器化應用程式啟動 Pod,並確保所需數量的複寫一律會在該叢集上執行。

相較之下,服務則會負責向這些 Pod 公開介面,進而啟動來自叢集內部或位於外部流程和服務之間的網路存取。

Kubernetes 服務包含哪些元件?

Kubernetes 服務會將一組 Pod 連至一個抽象化的服務名稱和 IP 位址。服務可在 Pod 之間發揮探索和路由等作用。舉例來說,服務能將應用程式前端連至其後端,並讓兩者於叢集中的個別部署內執行。服務會使用標籤和選取器來比對 Pod 和其他應用程式。Kubernetes 服務的核心屬性包括:

  • 負責找出 Pod 所在位置的標籤選取器
  • ClusterIP IP 位址和指派的連接埠編號
  • 連接埠定義
  • 傳入連接埠和 targetPort 的選擇性對應

服務可在沒有 Pod 選取器的情況下定義,例如將服務指向位於不同命名空間或叢集內的服務。

Kubernetes 服務包含哪些類型?

  • ClusterIP:公開只能從叢集內部存取的服務。
  • NodePort:透過每個節點 IP 上的靜態連接埠公開服務。
  • LoadBalancer:透過雲端供應商的負載平衡器公開服務。
  • ExternalName:透過傳回 CNAME 記錄的值,將服務對應至預先定義的 ExternalName 欄位。

什麼是 Kubernetes ClusterIP 服務?

ClusterIP 為預設的服務類型,可用來公開叢集內部 IP 位址上的服務,僅限從叢集內部存取。

什麼是 Kubernetes Headless 服務?

服務若無需進行負載平衡,而且只會公開單一 IP,可以透過指定「none」做為 ClusterIP,以建立「Headless」(無周邊) 服務。

Headless 服務可使用選取器定義,定義時,將在 API 中建立端點記錄來修改網域名稱系統 (DNS),以傳回位址,而該位址會指向公開服務的 Pod。沒有選取器的 Headless 服務,並不會建立端點記錄。網域名稱系統 (DNS) 系統會使用與服務相同的名稱,以設定 CNAME 記錄或適用於端點的記錄。

什麼是 Kubernetes NodePort 服務?

NodePort 為每個叢集節點上的開放連接埠。Kubernetes 會將流入 NodePort 的流量路由至服務,即使服務並未在該節點上執行。NodePort 可做為其他進階流入方法 (例如負載平衡器) 的基礎,對開發而言相當實用。

什麼是 Kubernetes ExternalName 服務?

ExternalName 服務與其他 Kubernetes 服務十分相似,但不會透過 ClusterIP 位址存取,而是使用在建立服務期間,於 ExternalName 參數中定義的值傳回 CNAME 記錄。

什麼是 Kubernetes LoadBalancer 服務?

針對在 AWS 或 Azure 等公有雲供應商上執行的叢集,建立 LoadBalancer 服務可提供等同 ClusterIP 服務的項目,有助於將其延伸至雲端供應商專屬的外部負載平衡器。Kubernetes 將自動建立負載平衡器、在必要時提供防火牆規則,並使用雲端供應商指派的外部 IP 位址填入服務。

Kubernetes 服務如何運作?

服務會使用標籤來指向 Pod。由於服務不會專屬於節點,因此,無論在任何指定的時間點,於叢集中的任一處執行服務,服務都能夠指向 Pod。只要服務繼續存在,就能擇一選用公開服務 IP 位址或網域名稱系統 (DNS) 服務名稱等方法,以連接應用程式。

如何定義 Kubernetes 服務?

如同所有 Kubernetes 物件一樣,服務也會在 YAML 中定義。假設您部署了執行後端服務的 Pod,以處理來自網頁前端的資料。若要在「deployment-backend」部署上公開名為「service-backend」的服務,您需要使用:

apiVersion v1

kind: Service

metadata:

name: service-backend

spec:

ports:

- port: 4000

protocol: TCP

targetPort: 333

selector:

run: deployment-backend

type: ClusterIP

如此將會建立「service-backend」服務,而叢集中的任何 Pod 都可透過 http://service-backend:4000,在其連接埠 333 上加以存取;或在叢集的 IP 位址處,使用連接埠 4000 加以存取。

Kubernetes 服務也可使用「kubectl expose」指令建立,而該指令無需使用 YAML 檔案。使用以下指令,即可建立相同服務:

kubectl expose deployment deployment-backend - - port=333- - target-port=4000 - - name=service-backend

如何存取 Kubernetes 服務?

Kubernetes 服務可透過兩種方式探索:

網域名稱系統 (DNS) (最為常見):網域名稱系統 (DNS) 方法為建議的服務探索方法。若要使用這項方法,叢集上必須先行安裝網域名稱系統 (DNS) 伺服器。網域名稱系統 (DNS) 伺服器會監控 Kubernetes API,當新服務建立時,其名稱就可用來輕鬆解析應用程式要求。

ENV 變數:這項方法會使用 kubelet,針對執行 Pod 內每個節點的每個作用中服務,新增環境變數。

相關解決方案與產品

實驗室:應用程式現代化改造

在短短數週內,將應用程式移至雲端。

Tanzu Kubernetes for Operation

現代化多雲容器基礎架構的基礎。

Tanzu Application Platform

在 Kubernetes 上享受優異的多雲開發人員體驗。