如何查看Kubernetes中各Pod对应的Context?
问题
我通过以下命令创建了关联DevDan-context的Pod:
kubectl config set-context DevDan-context \ --cluster=kubernetes \ --namespace=development \ --user=DevDan
执行kubectl --context=DevDan-context get pods能看到这个Pod,但直接执行kubectl get pods看不到。我想知道有没有办法显示所有Pod并附带Context列?
我知道kubectl get pods --all-namespaces命令,但它只展示Pod信息,不会标注每个Pod对应的Context,执行后输出示例如下:
ubuntu@HOST:~$ kubectl get pods --all-namespaces NAMESPACE NAME READY STATUS RESTARTS AGE development nginx-8586cf59-plq29 1/1 Running 0 19h kube-system etcd-HOST 1/1 Running 1 9d kube-system kube-apiserver-HOST 1/1 Running 1 9d kube-system kube-controller-manager-HOST 1/1 Running 1 9d kube-system kube-dns-6f4fd4bdf-25ddh 3/3 Running 3 9d kube-system kube-flannel-ds-5vgd9 1/1 Running 1 9d kube-system kube-flannel-ds-vvstn 1/1 Running 0 9d kube-system kube-proxy-62xrx 1/1 Running 1 9d kube-system kube-proxy-g7w7l 1/1 Running 0 9d kube-system kube-scheduler-HOST 1/1 Running 1 9d
目前我只能先执行kubectl config get-contexts获取所有Context,再逐个执行kubectl --context=<my_context> get pods,但Context多的时候操作太繁琐,有没有更高效的办法?
解决方案
方法1:用kubectl自定义输出批量查询
你可以直接用shell循环遍历所有Context,结合kubectl的自定义列功能,把Context作为固定列输出。试试这个命令:
for ctx in $(kubectl config get-contexts -o name); do kubectl --context="$ctx" get pods -o custom-columns="CONTEXT:=$ctx,NAMESPACE:.metadata.namespace,NAME:.metadata.name,READY:.status.readyReplicas,STATUS:.status.phase,RESTARTS:.status.containerStatuses[0].restartCount,AGE:.metadata.creationTimestamp" --all-namespaces done
这个命令会自动遍历所有Context,查询每个Context下的所有Pod,并且在结果里明确标注每个Pod所属的Context,输出格式和常规kubectl get pods的风格保持一致。
方法2:封装成脚本简化操作
如果需要频繁使用这个功能,把逻辑封装成shell脚本会更方便。比如创建一个名为kubectl-get-pods-with-context.sh的文件,内容如下:
#!/bin/bash # 打印表头 echo -e "CONTEXT\t\tNAMESPACE\tNAME\t\t\t\tREADY\tSTATUS\tRESTARTS\tAGE" echo -e "-------\t\t----------\t----\t\t\t\t-----\t------\t---------\t---" # 遍历所有Context for ctx in $(kubectl config get-contexts -o name); do # 查询当前Context下的Pod,去掉表头后添加Context列 kubectl --context="$ctx" get pods --all-namespaces | tail -n +2 | awk -v ctx="$ctx" '{print ctx "\t" $1 "\t" $2 "\t\t\t" $3 "\t" $4 "\t" $5 "\t\t" $6}' done
给脚本添加执行权限:
chmod +x kubectl-get-pods-with-context.sh
之后直接运行脚本,就能看到排版整齐的带Context列的Pod列表了。
方法3:用jq优化JSON格式输出(可选)
如果你习惯用JSON格式查看或者后续要做数据处理,可以结合jq工具来格式化输出。先确保系统已经安装jq,然后执行:
for ctx in $(kubectl config get-contexts -o name); do kubectl --context="$ctx" get pods -o json --all-namespaces | jq --arg ctx "$ctx" '.items[] | {CONTEXT: $ctx, NAMESPACE: .metadata.namespace, NAME: .metadata.name, READY: .status.readyReplicas, STATUS: .status.phase, RESTARTS: .status.containerStatuses[0].restartCount, AGE: .metadata.creationTimestamp}' done | jq -s '.'
这个命令会把所有结果整理成一个标准的JSON数组,方便你做进一步的分析或处理。
内容的提问来源于stack exchange,提问作者E235

