Service ClusterIP 配置
在 Kubernetes 中,服務是一種抽象的方式,用於公開在一組 Pod 上執行的應用程式。服務可以具有叢集範圍的虛擬 IP 位址(使用 type: ClusterIP
類型的服務)。用戶端可以使用該虛擬 IP 位址進行連線,然後 Kubernetes 會將流量負載平衡到該服務的不同後端 Pod。
服務 ClusterIP 是如何配置的?
當 Kubernetes 需要為服務指派虛擬 IP 位址時,指派方式有兩種
- 動態
- 叢集的控制平面會自動從為
type: ClusterIP
服務配置的 IP 範圍內選取可用的 IP 位址。 - 靜態
- 您可以從為服務配置的 IP 範圍內,指定您選擇的 IP 位址。
在您的整個叢集中,每個服務 ClusterIP
都必須是唯一的。嘗試建立具有已配置的特定 ClusterIP
的服務將會傳回錯誤。
為什麼您需要保留服務 Cluster IP?
有時您可能希望服務在眾所周知的 IP 位址中執行,以便叢集中的其他元件和使用者可以使用它們。
最好的例子是叢集的 DNS 服務。作為一種軟性慣例,某些 Kubernetes 安裝程式會將服務 IP 範圍中的第 10 個 IP 位址指派給 DNS 服務。假設您使用服務 IP 範圍 10.96.0.0/16 配置了叢集,並且您希望 DNS 服務 IP 為 10.96.0.10,您必須建立如下的服務
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 尚未保留。如果在動態配置之前或與之並行建立其他服務,則它們有可能配置此 IP。因此,您將無法建立 DNS 服務,因為它會因衝突錯誤而失敗。
如何避免服務 ClusterIP 衝突?
在 Kubernetes 中實作的配置策略,用於將 ClusterIP 配置給服務,降低了衝突的風險。
ClusterIP
範圍根據公式 min(max(16, cidrSize / 16), 256)
劃分,描述為永遠不小於 16 或大於 256,並在兩者之間逐步變化。
動態 IP 指派預設使用較高的頻帶,一旦耗盡,它將使用較低的範圍。這將允許使用者在較低的頻帶上使用靜態配置,且衝突風險較低。
範例
範例 1
此範例針對服務的 IP 位址使用 IP 位址範圍:10.96.0.0/24(CIDR 表示法)。
範圍大小: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
範例 2
此範例針對服務的 IP 位址使用 IP 位址範圍:10.96.0.0/20(CIDR 表示法)。
範圍大小: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
範例 3
此範例針對服務的 IP 位址使用 IP 位址範圍:10.96.0.0/16(CIDR 表示法)。
範圍大小: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
下一步
- 閱讀關於 服務外部流量策略
- 閱讀關於 使用服務連接應用程式
- 閱讀關於 服務