一、簡介
Kubernetes 中的 Service 是一個重要的概念,它將一組 Pod 封裝成一個邏輯單元,並提供網路訪問,對外暴露一個統一的 IP 和埠號。這樣,無論後端 Pod 如何變化,用戶都可以使用相同的地址訪問服務。
Service 是基於 Labels 進行匹配的,使用 Selector 進行 Pod 的篩選,從而建立了後端 Pod 到 Service 的映射關係,並提供負載均衡和服務發現功能。同時,Service 還支持多種負載均衡演算法和多種協議,如 TCP、UDP、HTTP、HTTPS。
二、基本使用
在 Kubernetes 中創建 Service 有多種方式,其中最簡單的方式是使用 kubectl expose 命令,如下所示:
kubectl expose deployment nginx --port=80 --type=LoadBalancer
這樣就創建了一個 Service,它會自動將所有具有 label app=nginx 的 Pod 進行負載均衡,並向外部暴露埠號 80。
另一種常見的方法是使用 YAML 文件進行定義,如下所示:
apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80
這裡的 selector 指定了將哪些 Pod 加入到 Service 中,ports 用於指定埠號和協議。
三、負載均衡和服務發現
Service 提供了內置的負載均衡功能,可以將請求分發到後端 Pod 上,從而實現高可用性。同時,Service 還支持不同的負載均衡演算法,例如 round-robin、least connections、IP hash、random 等等。
服務發現是指通過 DNS 或其他方式,自動獲取服務的 IP 和埠,從而使客戶端無需知道後端 Pod 的具體 IP 和埠。這樣,當 Pod 發生變化時,Service 可以自動更新 DNS 記錄,從而實現無縫的服務遷移。
四、Session Affinity
在默認情況下,Service 使用 round-robin 的負載均衡演算法,將每個請求按順序分配到不同的後端 Pod 上。但是,在某些場景下,需要確保同一個用戶的請求都被分配到同一個後端 Pod 上,從而實現 session 的持久化。這時可以使用 Session Affinity。
Session Affinity 可以指定一個 key,例如用戶的 ID,將同一個 key 的請求都路由到同一個後端 Pod 上。可以選擇兩種模式,一種是 ClientIP,根據客戶端 IP 進行負載均衡,一種是 None,禁用 Session Affinity。
使用 YAML 文件可以指定 Session Affinity,如下所示:
apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 sessionAffinity: ClientIP
五、網路策略
Kubernetes 中的網路策略允許對 Service 的訪問進行精細控制,可以限制來自特定 Pod 的流量、限制訪問特定的埠、禁止訪問特定 IP 地址等等。
具體實現上,需要定義一個 NetworkPolicy 對象,其中包含了需要限制的 Pod 的選擇器和限制規則。例如,下面的 YAML 文件表示禁止來自 label app=nginx 的 Pod 訪問本 Service 的 8080 埠:
apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: nginx-policy spec: podSelector: matchLabels: app: nginx policyTypes: - Ingress ingress: - from: - podSelector: {} ports: - port: 8080
六、安全性
在 Kubernetes 中,Service 可以通過 TLS 加密來保證網路傳輸的安全性。可以通過設置 Secret 對象來管理證書和私鑰,然後在 Service 中指定使用 TLS 加密。
使用 YAML 文件可以指定 TLS 加密,如下所示:
apiVersion: v1 kind: Service metadata: name: nginx spec: selector: app: nginx ports: - name: http port: 80 targetPort: 80 - name: https port: 443 targetPort: 443 tls: - secretName: tls-secret
這裡的 tls 指定了使用哪個 Secret 對象來進行 TLS 加密。
七、總結
Kubernetes 中的 Service 是一個重要的概念,它提供了負載均衡、服務發現、Session Affinity、網路策略和安全性等多種功能。在實際應用中,需要根據具體情況選擇不同的負載均衡演算法和 Session Affinity 模式,同時也需要注意安全性和網路策略的設置。
原創文章,作者:QSJWI,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/372381.html