问题陈述:
我有一个属于工作负载的 Pod,现在我想知道启动该 Pod 的工作负载。现在这样做的一种方法是遍历ownerReference
链,然后递归地向上查找启动 pod 的根父工作负载。
有没有办法可以直接知道哪个根父工作负载启动了 Pod?
问题陈述:
我有一个属于工作负载的 Pod,现在我想知道启动该 Pod 的工作负载。现在这样做的一种方法是遍历ownerReference
链,然后递归地向上查找启动 pod 的根父工作负载。
有没有办法可以直接知道哪个根父工作负载启动了 Pod?
首先,请记住特定工作负载创建的 Pod 在 Pod 名称中具有此工作负载的名称。例如,部署中定义的pod 具有以下 pod 命名约定:
<replicaset-name>-<some-string>
副本集名称为:
<deployment-name>-<some-string>
例如:
Pod 名称: nginx-66b6c48dd5-84rml
副本集名称:nginx-66b6c48dd5
部署名称:nginx
所以名称的第一部分似乎不是一些随机字母/数字是根工作负载名称。
只有在 StatefulSet 中定义的 pod 有序数索引,如下:
<statefulset-name>-<ordinal index>
例如:
Pod 名称:web-0
StafeulSet 名称:web
当然,根据工作负载名称,我们无法知道它是哪种工作负载。检查下面我答案的第二部分。
好吧,不考虑 pod 的名字,看来你的想法是正确的,找到“根”工作负载的唯一方法是递归地遍历链并找到下一个“父母”工作负载。
当您运行命令kubectl get pod {pod-name} -o json
(获取有关 pod 的所有信息)时,只有有关上述级别的信息(如您所说,在部署中定义的 pod 的情况下,在 pod 信息中只有有关副本集的信息)。
我编写了一个小的 bash 脚本,它递归地检查每个工作负载,ownerReferences
直到找到“根”工作负载(根工作负载没有ownerRefernces
)。它要求您在系统上安装jq
实用程序。检查这个:
#!/bin/bash
function get_root_owner_reference {
# Set kind, name and namespace
kind=$1
name=$2
namespace=$3
# Get ownerReferences
owner_references=$(kubectl get $kind $name -o json -n $namespace | jq -r 'try (.metadata.ownerReferences[])')
# If ownerReferences does not exists assume that it is root workload; if exists run get_root_owner_reference function
if [[ -z "$owner_references" ]]; then
resource_json=$(kubectl get $kind $name -o json -n $namespace)
echo "Kind: $(echo $resource_json | jq -r '.kind')"
echo "Name: $(echo $resource_json | jq -r '.metadata.name')"
else
get_root_owner_reference $(echo $owner_references | jq -r '.kind') $(echo $owner_references | jq -r '.name') $namespace
fi
}
# Get namespace if set
if [[ -z $3 ]]; then
namespace="default"
else
namespace=$3
fi
get_root_owner_reference $1 $2 $namespace
您需要提供两个参数 - 资源和资源名称。命名空间名称是可选的(如果没有给出它将使用 Kubernetesdefault
命名空间)。
示例:部署中定义的 Pod:
user@cloudshell:~/ownerRefernce$ ./get_root_owner_reference.sh pod nginx-66b6c48dd5-84rml
Kind: Deployment
Name: nginx
从 CronJob 创建的 Pod:
user@cloudshell:~/ownerRefernce$ ./get_root_owner_reference.sh pod hello-27247072-mv4l9
Kind: CronJob
Name: hello
直接从 pod 定义创建的 Pod:
user@cloudshell:~/ownerRefernce$ ./get_root_owner_reference.sh pod hostipc-exec-pod
Kind: Pod
Name: hostipc-exec-pod
来自其他命名空间的 Pod:
user@cloudshell:~/ownerRefernce$ ./get_root_owner_reference.sh pod kube-dns-679799b55c-7pzr7 kube-system
Kind: Deployment
Name: kube-dns