0

如何以一种可移植且简单的方式从 Kubernetes 集群内部查询正在使用的 Kubernetes pod 和服务子网(例如10.244.0.0/16,分别)?10.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-rangekube-apiserver(即服务子网)。master1代表任何控制平面节点的名称。但这似乎有点复杂。

是否有更好的方法可用,例如使用 Kubernetes 1.17 API?

4

1 回答 1

0

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

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

在 Kubernetes 1.17发行说明中,您可以找到以下信息

弃用默认服务 IP CIDR。之前的默认设置10.0.0.0/24将在 6 个月/2 个版本中删除。集群管理员必须通过--service-cluster-ip-range在 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

但如果您检查此集群中的所有 pod,有些 pod 以 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>

如果您要描述任何CNIpod,您可以找到其他 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。

于 2020-05-29T14:25:33.533 回答