Kubernetes Service:Overview

2023/04/24閱讀時間約 6 分鐘

什麼是Kubernetes Service?

先來個官網的解說
A Kubernetes Service is an abstraction which defines a logical set of Pods and a policy by which to access them.
白話文就是,訪問Pod用的一個Component。XD
Kubernetes Service是個抽象概念,通過Service,當我們的Pod創建好後,定義訪問它們的策略,該如何去訪問一群相同邏輯的Pod,給Pod提供一組穩定的IP或是Port。
因此也可以把Service當作是一種掛在一群運行相同應用程式前面的LoadBalancer,詳見下圖。

為什麼需要Kubernetes Service?

因為在Kubernetes集群中,Pod的IP地址是不穩定的,可能因為重新調度或重啟Container而改變了IP。為了使其他應用程式能夠穩定地訪問Pod,需要使用Kubernetes Service。

Kubernetes Service是如何工作的?

當Pod啟動時,它們會自動註冊到Kubernetes集群中的一個服務發現機制中,例如Kubernetes DNS或etcd。Service會監聽這個服務發現機制,並根據Label Selector選擇要提供服務的Pod。
當其他應用程式需要訪問Pod時,它們可以通過Service的IP和Port進行訪問,Service會將請求根據Label Selector轉發到選定的Pod。由於Service的IP和端口是穩定的,即使Pod的IP地址發生變化,其他應用程式依然可以一直使用相同的IP和Port訪問該Pod。

Kubernetes Service的類型有哪些?

Kubernetes Service有以下四種類型:
  • ClusterIP: 在Kubernetes集群內部使用,通常用於應用程式的內部通訊。
  • NodePort: 將Pod暴露到Kubernetes集群的外部,並使用Node的IP和一個Static Port進行訪問。
  • LoadBalancer: LoadBalancer是ClusterIP和NodePort的一種擴展。在公有雲上使用,使用雲供應商提供的LoadBalancer將流量轉發到Service中的Pod。
  • ExternalName: 允許服務將外部DNS名稱映射到Kubernetes集群內部的svc名稱上。這樣可以在不修改應用程式代碼的情況下實現外部服務的訪問。

Kubernetes Service有哪些功能?

Kubernetes Service具有以下功能:
  • 透明地將請求轉發到Pod中,無需修改應用程式代碼。
  • 提供負載均衡,分散流量到多個Pod中。
  • 支持多種協議,例如TCP、UDP和HTTP。
  • 可以設置Session Affinity,將請求路由到相同的Pod。
  • 可以進行Port轉發,將請求轉發到Pod中的不同Port。
  • 支持跨命名空間訪問。

如何創建和管理Kubernetes Service:

  • 要創建 Kubernetes Service,可以使用以下兩種方式:
  1. 宣告式(Declarative)
kind: Service  
apiVersion: v1
metadata:
name: my-service
spec:
# type 一共有四種(ClusterIP, NodePort, LoadBalancer, ExternalName),預設是 ClusterIP
type: ClusterIP
# 選擇帶有 "app=MyApp" 的 pod
selector:
app: MyApp
# Service 實際對外服務的設定
ports:
# 使用的協定與port,預設為TCP
- protocol: TCP
port: 80
# Pod對外開放的port,如無設定,預設與spec.ports.port相同
targetPort: 9376
透過以上的定義,網路的流向會呈現下方的樣子:
Request <---> Service(tcp:80) <---> Endpoint(tcp:9376) <---> Pod
Service 會將符合 Label Selector 設定的 Pod 建立 Endpoint resource object 做搭配。
2. 命令式(Imperative)
kubectl create service nodeport <myservicename>
  • 管理svc,可用以下方式:
  1. Svc查詢:
  • kubectl get svc
  • kubectl describe svc
  • kubectl get svc -o wide 顯示Label Selector選定的Label。
2. Svc的更新:kubectl edit svc
3. Svc的刪除:kubectl delete svc

Reference

為什麼會看到廣告
16會員
74內容數
golang
留言0
查看全部
發表第一個留言支持創作者!