如何找到 Kubernetes 集群的集群和服务 CIDR?

44

一旦 Kubernetes 集群已经运行,您如何查找集群/服务的 CIDR?

我知道在 Minikube 中它是 10.0.0.1/24。

对于 GKE,您可以通过以下方式找到:

gcloud container clusters describe XXXXXXX --zone=XXXXXX |
  grep -e clusterIpv4Cidr -e servicesIpv4Cidr

但是在通用的 Kubernetes 集群上,特别是通过 kubectl,您如何找出呢?

9个回答

66

我花了数小时寻找一种通用的方式来做这件事。最终我放弃了搜索并自己动手写了。从 Kubernetes 1.18 开始,这种方法可适用于所有云提供商,而不仅仅是 GKE。

SVCRANGE=$(echo '{"apiVersion":"v1","kind":"Service","metadata":{"name":"tst"},"spec":{"clusterIP":"1.1.1.1","ports":[{"port":443}]}}' | kubectl apply -f - 2>&1 | sed 's/.*valid IPs is //')
echo $SVCRANGE
172.21.0.0/16

这个一行命令通过将一个无效的服务群集 IP 输入到 kubectl apply 并解析错误输出来工作,从而提供了服务 CIDR 信息。


4
干净的解决方案,也是唯一一个对我有效的。 - Anirudh
非常感谢您的积极反馈!这是我在stackoverflow上的第一个回答 :) 如果有任何改进的方式,请告诉我。 - Steven Dake
1
我失去了对“dump”的访问权限,而当时正是非办公时间,这个帮助了我解决问题 :) - Dejan Marjanović
2
你是MVP @StevenDake。我在1.14.9上尝试了一下,它也可以工作。 - Kiran
1
谢谢。第一个答案对我没用,但这个有用!是否有类似的方法来查找集群CIDR?(Pod IP范围) - Mohammad Yosefpor
Mohammad,我已经查看了各种API以获取任何形式的Pod IP输入。但是似乎找不到任何一个。这并不意味着不存在这样的API,但在K8s中大约有50个不同的API。如果你找到一个接受POD IP的API,我很乐意进行原型设计。 - Steven Dake

62

获取服务IP范围

kubectl cluster-info dump | grep -m 1 service-cluster-ip-range

你将会看到类似于--service-cluster-ip-range=xxx.yy.0.0/13的东西

获取Pods IP地址范围

kubectl cluster-info dump | grep -m 1 cluster-cidr

你会看到类似这样的东西,比如--cluster-cidr=xxx.yy.0.0/11


2
无法在 DOKS 上运行。 - Abderrahim Soubai-Elidrisi
这对我没有起作用,可能是因为我让它使用了默认的CIDR,而在“kubeadm init”期间没有指定自己的CIDR。 - ComradeJoecool

7

您是否检查了以下命令是否包含所需的信息?

kubectl cluster-info dump


7
对我而言,kubectl cluster-info dump | grep -i cidr命令可以用来查找pidCIDRs和clusterCIDR。 - damick
错误:缺少apiVersion或kind并且无法分配它;未为类型core.NodeList注册任何kind。 - Breedly
这个错误存在于1.11版本中,应该在1.12版本中得到修复:https://github.com/kubernetes/kubernetes/issues/65221 - lanoxx
不能与所有网络插件配合使用(我正在使用 Canal)。 - leodotcloud

5
该命令的作用是查看名为"kubeadm-config"的ConfigMap在"kube-system"命名空间中的描述信息,并过滤出包含"Subnet"关键字的行。

这对我没有起作用,可能是因为我让它使用了默认的CIDR,而在“kubeadm init”期间没有指定自己的CIDR。 - ComradeJoecool

2

使用kubeadm

kubeadm config view | grep Subnet

下面的输出是自解释的

podSubnet: 10.10.0.0/16

serviceSubnet: 10.96.0.0/12


这对我没有起作用,可能是因为我让它使用了默认的CIDR,而在“kubeadm init”期间没有指定自己的CIDR。 - ComradeJoecool

2

如果您没有指定--pod-network-cidr--service-cidr,则会使用默认值。获取默认值:

kubeadm config print init-defaults

或者获取配置映射:

kubectl  --namespace kube-system get configmap kubeadm-config -o yaml

对我没有起作用。在初始化期间,我没有指定 --pod-network-cidr,并且它也没有列在 kubeadm config print init-defaultskubectl --namespace kube-system get configmap kubeadm-config -o yaml 中。 - ComradeJoecool

1

由于我的声望还不够,我暂时无法留下评论,所以我将回答我所发现的内容。

对于minikube而言,CIDR似乎是可以更改的,特别是对于我来说。我在.minikube目录下找到了CIDR,具体路径为:

.minikube\profiles\minikube

对于Windows系统,您可以在以下位置找到它:

C:\Users\YourUserName\.minikube\profiles\minikube

对于linux和mac,我认为它应该在~/.minikube目录下。
在该目录中,应该有一个名为config.json的文件,其中包含一个名为“KubernetesConfig”的json对象:{},其具有以下字段:ServiceCIDR。该值应为您的服务的CIDR。
不幸的是,我没有其他关于kubectl查找CIDR的提示,也许这更多是一个提供商问题,取决于您如何运行kubernetes。

0

与之前提出的before类似,但仅返回CIDR:

POD_CIDR=$(kubectl cluster-info dump | grep -m 1 -Po '(?<=--cluster-cidr=)[0-9.\/]+')
SERVICE_RANGE=$(kubectl cluster-info dump | grep -m 1 -Po '(?<=--service-cluster-ip-range=)[0-9.\/]+')

这对我没有起作用,可能是因为我让它使用了默认的CIDR,而在“kubeadm init”期间没有指定自己的CIDR。 - ComradeJoecool

0
所有这些答案/解决方案在我的情况下都没有起作用。
这就是对我有效的方法,也是另一种查看使用的所有 POD CIDR 的方式。
kubectl describe node | egrep 'PodCIDR|Name:'

名称:是为了让你也能识别节点的名称。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接