關于 K8s Service,你真的理解了嗎?詳細版了解一下
一、相關概念
1. 什么是Service?
在 Kubernetes 中,Service 是一種抽象的資源,它提供了穩(wěn)定的訪問接口,將外部或集群內(nèi)部的流量路由到對應的 Pod 上。 Pod 是 Kubernetes 中的基本調(diào)度單元,但它們是臨時的,IP 地址和生命周期都可能發(fā)生變化。Service 為 Pod 提供一個穩(wěn)定的訪問方式,解決了 Pod 的動態(tài) IP 問題。
Kubernetes 的 Service 有幾種不同的類型,能夠幫助我們根據(jù)不同的需求將服務暴露給外部用戶或者集群內(nèi)部的其他服務。
2. Service的核心概念
(1) Pod 和 Service
在 Kubernetes 中,Pod 是部署應用的基本單位。每個 Pod 都會有一個 IP 地址,但這個 IP 地址只在 Pod 生命周期內(nèi)有效。當 Pod 被銷毀、重建或調(diào)度到其他節(jié)點時,Pod 的 IP 地址會發(fā)生變化。這使得直接依賴 Pod IP 地址來訪問服務變得不可行。
Service 解決了這個問題,它為一組 Pod 提供一個穩(wěn)定的訪問入口,不會隨著 Pod 的變化而變化。Service 將流量路由到匹配標簽的 Pod 上,并為客戶端提供一個固定的 IP 地址和 DNS 名稱來訪問這些 Pod。
(2) Service 和 Endpoints
Endpoints 是與 Service 關聯(lián)的資源,它記錄了與該 Service 匹配的 Pod 的 IP 地址。當 Service 創(chuàng)建時,Kubernetes 會根據(jù)標簽選擇器(selector)找到符合條件的 Pod,并自動生成 Endpoints,確保流量能夠正確地路由到這些 Pod。
容易混淆的幾個端口的關系:
3. Service 類型
Kubernetes 提供了幾種不同的 Service 類型,適應不同的網(wǎng)絡通信需求。每種類型都有自己的特性和應用場景。
(1) ClusterIP(默認類型)
功能:ClusterIP 類型的 Service 只能在集群內(nèi)部訪問,外部無法直接訪問該服務。它為服務分配一個虛擬 IP 地址(ClusterIP),客戶端通過該 IP 與服務進行通信。
用途:適用于集群內(nèi)部的微服務通信,常見于服務間通信。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app # 選擇標簽為 app=my-app 的 Pod
ports:
- protocol: TCP
port: 80 # 服務對外暴露的端口
targetPort: 8080 # 實際服務運行的 Pod 端口
clusterIP: 10.96.0.1 # Kubernetes 自動分配 ClusterIP
這個 Service 會將請求轉發(fā)到符合條件的 Pod 上(標簽為 app=my-app)。 訪問該服務時,Kubernetes 會自動通過虛擬 IP 地址 10.96.0.1 來路由流量。
(2) NodePort
功能:NodePort 類型的 Service 將服務暴露到每個 Node 上的指定端口,外部客戶端可以通過訪問任意 Node 的 IP 地址和指定端口來訪問該服務。
用途:適用于開發(fā)和測試場景,或者希望通過某個特定端口暴露服務的場景。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # 外部客戶端訪問的端口
targetPort: 8080 # Pod 上的目標端口
nodePort: 30001 # 每個 Node 暴露的端口
type: NodePort
在這個例子中,nodePort 為 30001,可以通過集群中任意一個節(jié)點的 NodeIP:30001 訪問服務。
(3) LoadBalancer
功能:LoadBalancer 類型的 Service 會在云環(huán)境中創(chuàng)建一個外部負載均衡器,將外部流量自動分發(fā)到集群中的多個 Pod 上。
用途:適用于需要對外暴露服務,并且需要自動負載均衡的生產(chǎn)環(huán)境。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80 # 外部訪問的端口
targetPort: 8080 # Pod 上的目標端口
type: LoadBalancer
創(chuàng)建該 Service 后,Kubernetes 會自動請求云平臺(如 AWS、阿里云,華為云)創(chuàng)建一個負載均衡器,將流量轉發(fā)到集群中的 Pod 上。
(4) ExternalName
功能:ExternalName 類型的 Service 將流量路由到外部的 DNS 名稱,而不是內(nèi)部的 Pod。
用途:適用于需要訪問集群外部服務(如外部數(shù)據(jù)庫或第三方 API)的場景。
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ExternalName
externalName: example.com # 外部服務的 DNS 名稱
在這種配置下,my-service 將請求轉發(fā)到 example.com,而不是集群內(nèi)部的 Pod。
二、Service 工作原理
1. Pod 的 IP 和生命周期管理
每個 Pod 都有一個自己的 IP 地址,當 Pod 被刪除或重新調(diào)度時,IP 地址會發(fā)生變化。Kubernetes 會監(jiān)控這些變化,并確保流量能夠正確地轉發(fā)到新的 Pod 上。
2. 標簽選擇器
Service 通過標簽選擇器來匹配需要暴露的 Pod。當 Service 創(chuàng)建時,Kubernetes 會根據(jù)該標簽選擇器找到所有匹配的 Pod,并通過 Endpoints 記錄它們的 IP 地址。
3. DNS 解析
Kubernetes 會為每個 Service 分配一個 DNS 名稱,Pod 可以通過 DNS 名稱訪問 Service,而不需要關心具體的 IP 地址。這使得服務發(fā)現(xiàn)變得非常容易。
三、Service常用操作
1. 創(chuàng)建service
# 命令行創(chuàng)建,通過暴露deployment創(chuàng)建Service
kubectl expose deployment <deployment-name> --type=<service-type> --port=<port> --target-port=<target-port>
kubectl expose deploy nginx --port=80 --target-port=80 --type=NodePort
# 基于yaml文件創(chuàng)建
# 創(chuàng)建Service資源清單
apiVersion: v1
kind: Service
metadata:
name: nginx
spec:
selector:
app: nginx
ports:
- protocol: TCP
port: 80
targetPort: 8080
nodePort: 30080 # 指定節(jié)點上的端口
type: type: NodePort
# 創(chuàng)建
kubectl apply -f service.yaml
2. 查看service
# 查看所有service信息
kubectl get svc
kubectl get svc -o wide -n prod
# 查看指定service的詳細信息
kubectl get svc nginx -o yaml -n prod
kubectl describe svc nginx -n prod
# 查看Service的endpoint信息
kubectl get endpoints <service-name>
kubectl get ep nginx
3. 編輯更新Service
注意:修改后,service會立即重啟
kubectl edit service <service-name>
kubectl edit svc nginx -n prod
# 更新端口
kubectl patch service my-service -p '{"spec":{"ports":[{"port":80,"targetPort":8081}]}}'
4. 刪除Service
# 命令行刪除
kubectl delete svc <service-name>
kubectl delete svc nginx
# 基于yaml文件刪除
kubectl delete -f service.yaml
Service為 Pod 提供了穩(wěn)定的訪問入口,解決了 Pod 生命周期變化帶來的網(wǎng)絡問題。通過不同類型的 Service(如 ClusterIP、NodePort、LoadBalancer 和 ExternalName),Kubernetes 可以滿足各種網(wǎng)絡通信需求。
在生產(chǎn)環(huán)境中,Service 不僅可以幫助實現(xiàn)服務間的可靠通信,還能為外部用戶提供負載均衡和高可用的訪問入口。