這篇文章已超過一年。較舊的文章可能包含過時的內容。請檢查頁面中的資訊自發布以來是否已變得不正確。

Kubernetes 1.24:避免碰撞為服務指派 IP 位址

在 Kubernetes 中,Service 是一種抽象的方式,用於公開在 Pod 集合上執行的應用程式。Service 可以具有叢集範圍的虛擬 IP 位址(使用 type: ClusterIP 的 Service)。用戶端可以使用該虛擬 IP 位址連線,然後 Kubernetes 會將流量負載平衡到該 Service 在不同的後端 Pod 之間。

Service ClusterIP 如何分配?

Service ClusterIP 可以被指派為

動態
叢集的控制平面會自動從為 type: ClusterIP Service 設定的 IP 範圍內選取一個可用的 IP 位址。
靜態
您可以從為 Service 設定的 IP 範圍內指定您選擇的 IP 位址。

在您的整個叢集中,每個 Service ClusterIP 都必須是唯一的。嘗試建立具有已分配的特定 ClusterIP 的 Service 將會傳回錯誤。

為何您需要保留 Service Cluster IP?

有時您可能希望 Service 在眾所周知的 IP 位址中執行,以便叢集中的其他元件和使用者可以使用它們。

最好的例子是叢集的 DNS Service。某些 Kubernetes 安裝程式會將 Service IP 範圍中的第 10 個位址指派給 DNS Service。假設您將叢集設定為 Service IP 範圍 10.96.0.0/16,並且您希望您的 DNS Service IP 為 10.96.0.10,您必須建立如下的 Service

apiVersion: v1
kind: Service
metadata:
  labels:
    k8s-app: kube-dns
    kubernetes.io/cluster-service: "true"
    kubernetes.io/name: CoreDNS
  name: kube-dns
  namespace: kube-system
spec:
  clusterIP: 10.96.0.10
  ports:
  - name: dns
    port: 53
    protocol: UDP
    targetPort: 53
  - name: dns-tcp
    port: 53
    protocol: TCP
    targetPort: 53
  selector:
    k8s-app: kube-dns
  type: ClusterIP

但正如我之前解釋的,IP 位址 10.96.0.10 尚未保留;如果在動態分配之前或與之並行建立其他 Service,則它們有可能分配此 IP,因此,您將無法建立 DNS Service,因為它會因衝突錯誤而失敗。

如何避免 Service ClusterIP 衝突?

在 Kubernetes 1.24 中,您可以啟用新的功能閘道 ServiceIPStaticSubrange。開啟此功能可讓您為 Service 使用不同的 IP 分配策略,從而降低衝突的風險。

ClusterIP 範圍將根據公式 min(max(16, cidrSize / 16), 256) 進行劃分,描述為永遠不小於 16 或大於 256,並在兩者之間有graduated step

動態 IP 指派預設會使用較高的頻帶,一旦耗盡,它將使用較低的範圍。這將允許使用者在較低的頻帶上使用靜態分配,而衝突的風險較低。

範例

Service IP CIDR 區塊:10.96.0.0/24

範圍大小:28 - 2 = 254
頻帶偏移:min(max(16, 256/16), 256) = min(16, 256) = 16
靜態頻帶開始:10.96.0.1
靜態頻帶結束:10.96.0.16
範圍結束:10.96.0.254

pie showData title 10.96.0.0/24 "靜態" : 16 "動態" : 238

Service IP CIDR 區塊:10.96.0.0/20

範圍大小:212 - 2 = 4094
頻帶偏移:min(max(16, 4096/16), 256) = min(256, 256) = 256
靜態頻帶開始:10.96.0.1
靜態頻帶結束:10.96.1.0
範圍結束:10.96.15.254

pie showData title 10.96.0.0/20 "靜態" : 256 "動態" : 3838

Service IP CIDR 區塊:10.96.0.0/16

範圍大小:216 - 2 = 65534
頻帶偏移:min(max(16, 65536/16), 256) = min(4096, 256) = 256
靜態頻帶開始:10.96.0.1
靜態頻帶結束:10.96.1.0
範圍結束:10.96.255.254

pie showData title 10.96.0.0/16 "靜態" : 256 "動態" : 65278

參與 SIG Network

目前的 SIG-Network KEP 和 GitHub 上的 issue 說明了 SIG 的重點領域。

SIG Network 會議 是一個友善、歡迎的場所,您可以在此與社群建立聯繫並分享您的想法。期待收到您的來信!