服務 ClusterIP 分配

在 Kubernetes 中,Service 是一種抽象方式,用於暴露執行在一組 Pod 上的應用程式。Service 可以擁有一個叢集範圍內的虛擬 IP 地址(使用 type: ClusterIP 的 Service)。客戶端可以使用該虛擬 IP 地址進行連線,Kubernetes 會將流量負載均衡到該 Service 的不同後端 Pod 上。

Service ClusterIP 是如何分配的?

當 Kubernetes 需要為 Service 分配虛擬 IP 地址時,分配方式有兩種:

動態
叢集的控制平面會自動從為 type: ClusterIP Service 配置的 IP 範圍內選擇一個空閒的 IP 地址。
靜態
你從為 Service 配置的 IP 範圍內指定一個你選擇的 IP 地址。

在整個叢集中,每個 Service ClusterIP 都必須是唯一的。嘗試建立一個指定了已分配的 ClusterIP 的 Service 將會返回錯誤。

為什麼需要保留 Service Cluster IP?

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

最好的例子是叢集的 DNS Service。作為一種約定俗成的做法,一些 Kubernetes 安裝程式會將 Service IP 範圍內的第 10 個 IP 地址分配給 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 中實現的將 ClusterIP 分配給 Service 的分配策略降低了衝突的風險。

ClusterIP 範圍根據公式 min(max(16, cidrSize / 16), 256) 進行劃分,該公式描述為**不小於 16,不大於 256,且兩者之間有一個漸進的步長**。

動態 IP 分配預設使用上部範圍,一旦上部範圍耗盡,它將使用下部範圍。這允許使用者在下部範圍進行靜態分配,並降低衝突風險。

示例

示例 1

此示例使用 IP 地址範圍:10.96.0.0/24 (CIDR 表示法) 作為 Service 的 IP 地址。

範圍大小: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

餅圖顯示資料 標題 10.96.0.0/24 "靜態" : 16 "動態" : 238

示例 2

此示例使用 IP 地址範圍:10.96.0.0/20 (CIDR 表示法) 作為 Service 的 IP 地址。

範圍大小: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

餅圖顯示資料 標題 10.96.0.0/20 "靜態" : 256 "動態" : 3838

示例 3

此示例使用 IP 地址範圍:10.96.0.0/16 (CIDR 表示法) 作為 Service 的 IP 地址。

範圍大小: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

餅圖顯示資料 標題 10.96.0.0/16 "靜態" : 256 "動態" : 65278

下一步

最後修改於 2024 年 10 月 24 日太平洋標準時間下午 5:03:更新 cluster-ip-allocation.md (e57546d9a1)