从 Kubernetes 集群内部查询 pod 和服务子网
Inquiring pod and service subnets from inside Kubernetes cluster
如何以一种可移植且简单的方式从 Kubernetes 集群内部查询正在使用的 Kubernetes pod 和服务子网(例如分别为 10.244.0.0/16
和 10.96.0.0/12
)?
例如,kubectl get cm -n kube-system kubeadm-config -o yaml
报告 podSubnet
和 serviceSubnet
。但这不是完全可移植的,因为集群可能是通过 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。
如何以一种可移植且简单的方式从 Kubernetes 集群内部查询正在使用的 Kubernetes pod 和服务子网(例如分别为 10.244.0.0/16
和 10.96.0.0/12
)?
例如,kubectl get cm -n kube-system kubeadm-config -o yaml
报告 podSubnet
和 serviceSubnet
。但这不是完全可移植的,因为集群可能是通过 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。