如何通过JSONPath过滤kubectl节点查询结果,排除主节点获取工作节点IP
解决方案
方案1:基于节点角色标签筛选(最稳定,优先推荐)
绝大多数Kubernetes集群的工作节点都会自带标准角色标签node-role.kubernetes.io/worker,直接用kubectl的标签筛选参数就可以直接过滤出工作节点,不需要做字符串匹配:
kubectl get nodes -l node-role.kubernetes.io/worker -o jsonpath="{range .items[*]}{.status.addresses[?(@.type=='InternalIP')].address}{'\n'}{end}"
如果你的集群主节点有单独的角色标签,也可以用!排除,比如参数改成-l '!node-role.kubernetes.io/master'即可排除所有主节点。
方案2:基于节点名称字符串匹配(Go模板实现)
kubectl的原生JSONPath没有内置字符串包含匹配能力,你可以改用Go模板格式输出,Go模板内置了contains函数可以实现你的需求:
排除名称包含-master-的节点
kubectl get nodes -o go-template='{{range .items}}{{if not (contains .metadata.name "-master-")}}{{range .status.addresses}}{{if eq .type "InternalIP"}}{{.address}}{{"\n"}}{{end}}{{end}}{{end}}{{end}}'
仅保留名称包含-worker-的节点
把上面命令的判断条件改成正匹配即可:
kubectl get nodes -o go-template='{{range .items}}{{if contains .metadata.name "-worker-"}}{{range .status.addresses}}{{if eq .type "InternalIP"}}{{.address}}{{"\n"}}{{end}}{{end}}{{end}}{{end}}'
方案3:管道过滤(逻辑更直观,易修改)
如果你更熟悉Linux命令行工具,也可以先输出节点名+IP的组合,再用管道工具过滤提取:
kubectl get nodes -o jsonpath="{range .items[*]}{.metadata.name}{' '}{.status.addresses[?(@.type=='InternalIP')].address}{'\n'}{end}" | grep -v "-master-" | awk '{print $2}'
如果要仅保留worker节点,把grep -v "-master-"改成grep "-worker-"即可。
内容的提问来源于stack exchange,提问作者Vaccano
相关产品推荐
相关产品推荐

