什麼是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,可以使用以下兩種方式:
- 宣告式(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查詢:
- 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