扩展服务 IP 范围
Kubernetes v1.27 [alpha]
本文档介绍了如何扩展分配给集群的现有服务 IP 范围。
开始之前
您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点(不充当控制平面主机)的集群上运行本教程。如果您还没有集群,可以使用 minikube 创建一个,或者可以使用以下 Kubernetes 游乐场之一
您的 Kubernetes 服务器必须是 v1.29 或更高版本。要检查版本,请输入kubectl version
。API
启用了 MultiCIDRServiceAllocator
功能开关 和 networking.k8s.io/v1alpha1
API 的 kube-apiserver 的 Kubernetes 集群将创建一个新的 ServiceCIDR 对象,该对象采用众所周知的名称 kubernetes
,并使用基于 --service-cluster-ip-range
命令行参数的值的 IP 地址范围到 kube-apiserver。
kubectl get servicecidr
NAME CIDRS AGE
kubernetes 10.96.0.0/28 17d
众所周知的 kubernetes
服务(将 kube-apiserver 端点公开给 Pod)从默认 ServiceCIDR 范围计算第一个 IP 地址,并使用该 IP 地址作为其集群 IP 地址。
kubectl get service kubernetes
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 17d
在这种情况下,默认服务使用集群 IP 10.96.0.1,该 IP 具有相应的 IPAddress 对象。
kubectl get ipaddress 10.96.0.1
NAME PARENTREF
10.96.0.1 services/default/kubernetes
ServiceCIDR 受 终结器 的保护,以避免留下孤儿服务集群 IP;只有在存在包含现有 IPAddress 的另一个子网或没有属于该子网的 IPAddress 时,才会删除终结器。
扩展可用于服务的 IP 数量
在某些情况下,用户需要增加可用于服务的地址数量,以前,增加服务范围是一个破坏性操作,也可能导致数据丢失。使用此新功能,用户只需添加一个新的 ServiceCIDR 即可增加可用地址的数量。
添加新的 ServiceCIDR
在为服务使用 10.96.0.0/28 范围的集群中,只有 2^(32-28) - 2 = 14 个 IP 地址可用。kubernetes.default
服务始终创建;对于此示例,这将使您只剩下 13 个可能的服务。
for i in $(seq 1 13); do kubectl create service clusterip "test-$i" --tcp 80 -o json | jq -r .spec.clusterIP; done
10.96.0.11
10.96.0.5
10.96.0.12
10.96.0.13
10.96.0.14
10.96.0.2
10.96.0.3
10.96.0.4
10.96.0.6
10.96.0.7
10.96.0.8
10.96.0.9
error: failed to create ClusterIP service: Internal error occurred: failed to allocate a serviceIP: range is full
您可以通过创建一个扩展或添加新 IP 地址范围的新 ServiceCIDR 来增加可用于服务的 IP 地址数量。
cat <EOF | kubectl apply -f -
apiVersion: networking.k8s.io/v1alpha1
kind: ServiceCIDR
metadata:
name: newcidr1
spec:
cidrs:
- 10.96.0.0/24
EOF
servicecidr.networking.k8s.io/newcidr1 created
这将允许您创建具有从该新范围中选择的集群 IP 的新服务。
for i in $(seq 13 16); do kubectl create service clusterip "test-$i" --tcp 80 -o json | jq -r .spec.clusterIP; done
10.96.0.48
10.96.0.200
10.96.0.121
10.96.0.144
删除 ServiceCIDR
如果存在依赖于 ServiceCIDR 的 IPAddress,则无法删除 ServiceCIDR。
kubectl delete servicecidr newcidr1
servicecidr.networking.k8s.io "newcidr1" deleted
Kubernetes 在 ServiceCIDR 上使用终结器来跟踪这种依赖关系。
kubectl get servicecidr newcidr1 -o yaml
apiVersion: networking.k8s.io/v1alpha1
kind: ServiceCIDR
metadata:
creationTimestamp: "2023-10-12T15:11:07Z"
deletionGracePeriodSeconds: 0
deletionTimestamp: "2023-10-12T15:12:45Z"
finalizers:
- networking.k8s.io/service-cidr-finalizer
name: newcidr1
resourceVersion: "1133"
uid: 5ffd8afe-c78f-4e60-ae76-cec448a8af40
spec:
cidrs:
- 10.96.0.0/24
status:
conditions:
- lastTransitionTime: "2023-10-12T15:12:45Z"
message: There are still IPAddresses referencing the ServiceCIDR, please remove
them or create a new ServiceCIDR
reason: OrphanIPAddress
status: "False"
type: Ready
通过删除包含阻止删除 ServiceCIDR 的 IP 地址的服务
for i in $(seq 13 16); do kubectl delete service "test-$i" ; done
service "test-13" deleted
service "test-14" deleted
service "test-15" deleted
service "test-16" deleted
控制平面会注意到删除。然后,控制平面会删除其终结器,以便正在等待删除的 ServiceCIDR 将被实际删除。
kubectl get servicecidr newcidr1
Error from server (NotFound): servicecidrs.networking.k8s.io "newcidr1" not found