本文發表於一年多前。舊文章可能包含過時內容。請檢查頁面中的資訊自發布以來是否已變得不正確。
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 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,兩者之間有分級步長*。
動態 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
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
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
參與 SIG Network
當前的 SIG-Network KEPs 和 GitHub 上的議題展示了 SIG 的重點領域。
SIG Network 會議是一個友好、開放的平臺,供您與社群聯絡並分享您的想法。期待您的加入!