【发布时间】:2019-10-30 16:03:13
【问题描述】:
如何使用 kubectl 获取没有任何标签的 K8S 节点? 另外,如何获取没有任何标签的 K8S pod?
【问题讨论】:
标签: kubernetes google-kubernetes-engine kubectl azure-aks kubernetes-pod
如何使用 kubectl 获取没有任何标签的 K8S 节点? 另外,如何获取没有任何标签的 K8S pod?
【问题讨论】:
标签: kubernetes google-kubernetes-engine kubectl azure-aks kubernetes-pod
根据官方documentation,我认为没有办法做到这一点,但你可以通过否定平等来做类似的事情:
kubectl get nodes --selector=kubernetes.io/hostname!=node_host_name
基本上你可以选择所有没有特定标签的东西,你也可以链接选择器
更多阅读:https://kubernetes.io/docs/concepts/overview/working-with-objects/field-selectors/
【讨论】:
如果不列出所有可能的标签,通常没有特定的方法来检查是否没有标签。你必须做这个客户端。
【讨论】:
没有办法检查没有标签的节点/pod。相反,您可以做的是检查特定标签的节点/pod
按照以下步骤进行
添加标签 mylabel=k8s
master $ kubectl get no
NAME STATUS ROLES AGE VERSION
master Ready master 51m v1.11.3
node01 Ready <none> 50m v1.11.3
master $
master $
master $ kubectl label nodes node01 mylabel=k8s
node/node01 labeled
master $
master $ kubectl get no -L mylabel
NAME STATUS ROLES AGE VERSION MYLABEL
master Ready master 52m v1.11.3
node01 Ready <none> 52m v1.11.3 k8s
列出标签为 mylabel=k8s 的节点
master $ kubectl get no -l mylabel=k8s
NAME STATUS ROLES AGE VERSION
node01 Ready <none> 53m v1.11.3
master $
列出没有标签 mylabel=k8s 的节点
master $ kubectl get no -l mylabel!=k8s
NAME STATUS ROLES AGE VERSION
master Ready master 53m v1.11.3
【讨论】:
您必须利用 kubectl -o 标志和 go-template 输出:
kubectl get nodes -o go-template='{{range .items }}{{if .metadata.labels }}{{else}}{{printf "%s\n" .metadata.name}}{{ end }}{{end}}
此命令将仅显示没有任何标签的节点。同样可以用于 pod:
kubectl get pods --all-namespaces -o go-template='{{range .items }}{{if .metadata.labels }}{{else}}{{printf "%s\n" .metadata.name}}{{ end }}{{end}}'
【讨论】:
kubectl get pods --all-namespaces -o jsonpath='{.items[?(@.metadata.labels)].metadata.name}' 使用 jsonpath 获取带有标签的 pod,但以下内容不起作用 kubectl get pods --all-namespaces -o jsonpath='{.items[?(!@.metadata.labels)].metadata.name}'
对于那些想要查找没有特定标签的资源的人,无论其价值如何:
kubectl get ns --selector='!label_name'
【讨论】:
第一个答案有效,但您也可以使用以下答案
kubectl get nodes -l '!label_name'
【讨论】: