从 Kubernetes 集群内部查询 pod 和服务子网

Inquiring pod and service subnets from inside Kubernetes cluster

如何以一种可移植且简单的方式从 Kubernetes 集群内部查询正在使用的 Kubernetes pod 和服务子网(例如分别为 10.244.0.0/1610.96.0.0/12)?

例如,kubectl get cm -n kube-system kubeadm-config -o yaml 报告 podSubnetserviceSubnet。但这不是完全可移植的,因为集群可能是通过 kubeadm.

以外的其他方式设置的

kubectl get cm -n kube-system kube-proxy -o yaml 报告 clusterCIDR(即 pod 子网)并且 kubectl get pod -n kube-system kube-apiserver-master1 -o yaml 报告值 作为命令行选项 --service-cluster-ip-range 传递给 kube-apiserver(即服务子网)。 master1 代表任何控制平面节点的名称。但这似乎有点复杂。

有没有更好的方法,例如使用 Kubernetes 1.17 API?

我认为不可能以便携和简单的方式获得您想要的东西。 如果您不指定 Cidr 的参数,它将分配默认参数。

由于您有很多方法 运行 将 kubernetes 作为非托管集群,如 kubeadm、minikbue、k3s、micork8s 或像云提供商(GKE、Azure、AWS)一样进行管理,很难找到一种方法来列出所有 cidr在所有环境中。另一个障碍可能是 Kubernetes 或 CNI 的版本。

在 Kubernetes 1.17 中 Release notes 您可以找到

Deprecate the default service IP CIDR. The previous default was 10.0.0.0/24 which will be removed in 6 months/2 releases. Cluster admins must specify their own desired value, by using --service-cluster-ip-range on kube-apiserver.

以 Kubeadm 为例:$ kubeadm init --pod-network-cidr 10.100.0.0/12 --service-cidr 10.99.0.0/12

有几种方法可以获取此 pod 和 service-cidr:

$ kubectl cluster-info dump | grep -E '(service-cluster-ip-range|cluster-cidr)'
                            "--service-cluster-ip-range=10.99.0.0/12",
                            "--cluster-cidr=10.100.0.0/12",



$ kubeadm config view | grep Subnet
  podSubnet: 10.100.0.0/12
  serviceSubnet: 10.99.0.0/12

但是,如果您要检查此集群中的所有 pods,一些 pods 以 192.168.190.X 或 192.168.137.X

开头
$ kubectl get pods -A -owide
NAMESPACE     NAME                                       READY   STATUS    RESTARTS   AGE    IP                NODE             NOMINATED NODE   READINESS GATES
default       nginx                                      1/1     Running   0          62m    192.168.190.129   kubeadm-worker   <none>           <none>
kube-system   calico-kube-controllers-77c5fc8d7f-9n6m5   1/1     Running   0          118m   192.168.137.66    kubeadm-master   <none>           <none>
kube-system   calico-node-2kx2v                          1/1     Running   0          117m   10.128.0.4        kubeadm-worker   <none>           <none>
kube-system   calico-node-8xqd9                          1/1     Running   0          118m   10.128.0.3        kubeadm-master   <none>           <none>
kube-system   coredns-66bff467f8-sgmkw                   1/1     Running   0          120m   192.168.137.65    kubeadm-master   <none>           <none>
kube-system   coredns-66bff467f8-t84ht                   1/1     Running   0          120m   192.168.137.67    kubeadm-master   <none>           <none>

如果您要描述任何 CNI pods,您可以找到另一个 CIDR:

CALICO_IPV4POOL_CIDR:               192.168.0.0/16

对于 GKE 示例,您将拥有: 节点 CIDR

$ kubectl describe node | grep CIDRs
PodCIDRs:                     10.52.1.0/24
PodCIDRs:                     10.52.0.0/24
PodCIDRs:                     10.52.2.0/24

$ gcloud container clusters describe cluster-2 --zone=europe-west2-b | grep Cidr
clusterIpv4Cidr: 10.52.0.0/14
  clusterIpv4Cidr: 10.52.0.0/14
  clusterIpv4CidrBlock: 10.52.0.0/14
  servicesIpv4Cidr: 10.116.0.0/20
  servicesIpv4CidrBlock: 10.116.0.0/20
  podIpv4CidrSize: 24
servicesIpv4Cidr: 10.116.0.0/20

老实说,我认为没有一种简单且可移植的方法可以在一个简单的命令中列出所有 podCidrs 和 serviceCidrs。