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

时间:2020-05-17 06:23:00

标签: kubernetes kube-apiserver

如何从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?

1 个答案:

答案 0 :(得分:0)

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

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

在Kubernetes 1.17 Release notes中,您可以找到有关信息

弃用默认服务IP CIDR。先前的默认值为10.0.0.0/24,它将在6个月/ 2个发行版中删除。集群管理员必须通过在kube-apiserver上使用--service-cluster-ip-range来指定自己想要的值。

以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>

如果您将描述任何CNI个窗格,则可以找到另一个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。