Service 簡介:
Kubernetes Service
定義了這樣一種抽象:一個 Pod
的邏輯分組,一種可以訪問它們的策略 —— 通常稱爲微服務。 這一組 Pod
能夠被 Service
訪問到,通常是通過 [Label Selector
]
對 Kubernetes 集羣中的應用,Kubernetes 提供了簡單的 Endpoints
API,只要 Service
中的一組 Pod
發生變更,應用程序就會被更新。 對非 Kubernetes 集羣中的應用,Kubernetes 提供了基於 VIP 的網橋的方式訪問 Service
,再由 Service
重定向到 backend Pod
。
Service 的五種類型
- ClusterIP
- NodePort
- LoadBalancer
- ExternalName
- None
ClusterIP
簡介:
通過集羣內部的虛擬IP暴露服務,這種類型只在集羣內部可達,無法被外部的客戶端調用。
設置方式:
kind: Service
apiVersion: v1
metadata:
name: test
spec:
type: ClusterIP
不設置 type 類型時,默認爲ClusterIP。
NodePort
簡介:
建立在 ClusterIP
之上,通過每個 Node 的IP和靜態端口暴露服務,外部客戶端通過訪問 NodePort
,NodePort
將請求路由到集羣內的 ClusterIP
上訪問服務。
部署k8s集羣時可以預留指定的端口範圍,默認爲:30000~32767。
設置方式:
kind: Service
apiVersion: v1
metadata:
name: test
spec:
type: NodePort
建議不需要自定義port
,而是讓集羣自動分配一個 NodePort
, 否則可能會導致端口衝突。
LoadBalancer
簡介:
建立在 NodePort 之上,通過外部的雲服務提供廠商提供的負載均衡器路由至集羣內的NodePort上。
設置方式:
kind: Service
apiVersion: v1
metadata:
name: test
spec:
type: LoadBalancer
ExternalName
簡介:
通過service
的 externalName
字段指定外部服務的訪問地址,使得集羣內部的服務可以訪問到集羣外部的服務。
這種類型的 service
不會產生 ClusterIP
和 NodePort
,一般不需要使用 labelSelector
所以也沒有 EndPoints
。也稱爲 Headless Service
。
設置方式:
kind: Service
apiVersion: v1
metadata:
name: test
spec:
type: ExternalName
externalName: xxx.com
None
簡介:
Headless Service,不會產生 ClusterIP
, 如果配置了 labelSelector
匹配到了對應的 Pod ,則會生成 EndPoints
設置方式
kind: Service
apiVersion: v1
metadata:
name: test
spec:
clusterIP: None
參考
- https://jimmysong.io/kubernetes-handbook/concepts/service.html
- 《kubernetes 進階實戰》