Service
- Service 通過 label 關聯對應的 Pod
- Servcie 生命周期不跟 Pod 綁定,不會因為 Pod 重創改變 IP
- 提供了負載均衡功能,自動轉發流量到不同 Pod
- 可對集群外部提供訪問端口
- 集群內部可通過服務名字訪問
創建 Service
kubectl apply -f service.yamlkubectl get svc
內部訪問 Service
服務的默認類型是ClusterIP
,只能在集群內部訪問,我們可以進入到 Pod 里面訪問:
kubectl exec -it pod-name -- bash
curl http://test-k8s:8080
如果你是用 minikube,因為是模擬集群,你的電腦并不是節點,節點是 minikube 模擬出來的,所以你并不能直接在電腦上訪問到服務
外部訪問 Service
如果要在集群外部訪問,可以通過端口轉發實現(只適合臨時測試用):
kubectl port-forward service/test-k8s 8888:8080
如果你用 minikube,也可以這樣
minikube service test-k8s
來將service暴露到外部
K8S中的四種端口號:
-
containerPort
:容器內部進程使用的端口 -
Port
:為service在clusterIP上暴露的端口 -
targetPort
:容器映射在pod上的端口 -
nodeport
:將端口映射到宿主機上,提供外部流量訪問K8S集群中service的入口
對外暴露服務
上面我們是通過端口轉發的方式可以在外面訪問到集群里的服務,如果想要直接把集群服務暴露出來,我們可以使用NodePort
和 Loadbalancer
類型的 Service
。
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8s# 默認 ClusterIP 集群內可訪問,NodePort 節點可訪問,LoadBalancer 負載均衡模式(需要負載均衡器才可用)type: NodePortports:- port: 8080 # 本 Service 的端口targetPort: 8080 # 容器端口nodePort: 31000 # 節點端口,范圍固定 30000 ~ 32767
Loadbalancer
也可以對外提供服務,這需要一個負載均衡器的支持,因為它需要生成一個新的 IP 對外服務,否則狀態就一直是 pendding
,這個很少用了,后面我們會講更高端的 `Ingress 來代替它。
多端口暴露服務
apiVersion: v1
kind: Service
metadata:name: test-k8s
spec:selector:app: test-k8stype: NodePortports:- port: 8080 # 本 Service 的端口name: test-k8s # 必須配置targetPort: 8080 # 容器端口nodePort: 31000 # 節點端口,范圍固定 30000 ~ 32767- port: 8090name: test-othertargetPort: 8090nodePort: 32000
EndPoint
EndPoint 就是將 Pod 的 IP 和端口對應起來,這樣 Service 才能找到 Pod。
apiVersion: v1
kind: Endpoints
metadata:name: test-k8s
subsets:- addresses:- ip: 10.244.1.10ports:- port: 8080
- 一個或多個subset對象,每個subset中包含一組IP地址和端口號的列表。不同的subset可以根據Label Selector將后端Pod進行分類。
- addresses:一個IP地址列表,表示屬于該Endpoint的Pod的IP地址。
- ports:一個端口號列表,表示屬于該Endpoint的Pod所開放的端口號
- 每個subset都包含一個或多個address和ports,表示一個或多個Pod的IP地址和端口號。
- 通過使用Endpoint資源對象,Kubernetes可以動態地管理后端Pod實例的地址和端口信息。
這樣,當后端Pod的數量發生變化、新的Pod加入或舊的Pod刪除時,Kubernetes會及時更新Endpoint中的信息,保持負載均衡和流量路由的正確性。
總結來說,Endpoint是Kubernetes中用于關聯Service與后端Pod實例
的資源對象,存儲了一組IP地址和端口號
的列表。
總結service 類型 yaml中通過type指定
ClusterIP
默認的,僅在集群內可用
NodePort
暴露端口到節點,提供了集群外部訪問的入口
端口范圍固定 30000 ~ 32767
LoadBalancer
需要負載均衡器(通常都需要云服務商提供,裸機可以安裝 METALLB 測試)
會額外生成一個 IP 對外服務
K8S 支持的負載均衡器:負載均衡器
Headless
適合數據庫
clusterIp 設置為 None 就變成 Headless 了,不會再分配 IP,通過 DNS 解析獲取,以Pod名為DNS