我如何直接知道 Pod 所属的根父工作负载
How do i directly know the root parent workload that a Pod belongs to
问题陈述:
我有一个属于工作负载的 Pod,现在我想知道启动该 Pod 的工作负载。现在执行此操作的一种方法是遍历 ownerReference
,然后递归地沿着链向上查找启动 pod 的根父工作负载。
有什么方法可以直接知道哪个根父工作负载启动了 Pod?
首先,请记住由特定工作负载创建的 pods 在 pod 名称中包含此工作负载的名称。例如,deployments 中定义的 pods 具有以下 pod 命名约定:
<replicaset-name>-<some-string>
副本集名称为:
<deployment-name>-<some-string>
例如:
广告连播名称:nginx-66b6c48dd5-84rml
副本集名称:nginx-66b6c48dd5
部署名称:nginx
所以名称的第一部分似乎不是一些随机字母/数字是根工作负载名称。
只有podsdefined in StatefulSet have ordinal indexes,如下:
<statefulset-name>-<ordinal index>
例如:
广告连播名称:web-0
StafeulSet 名称: web
当然,根据工作负载名称我们无法知道它是哪种工作负载。检查下面我的回答的第二部分。
好吧,不考虑 pod 的名称,看来您的想法是正确的,找到“根”工作负载的唯一方法是递归遍历链并找到下一个“父”工作负载。
当你运行命令kubectl get pod {pod-name} -o json
(获取关于pod的所有信息)时,只有关于上面级别的信息(正如你所说的在部署中定义的pod,在pod信息中有只是关于副本集的信息。
我写了一个小的 bash 脚本,它递归地检查每个工作负载的 ownerReferences
,直到它找到“根”工作负载(根工作负载没有 ownerRefernces
)。它要求您在系统上安装 jq
utility。检查这个:
#!/bin/bash
function get_root_owner_reference {
# Set kind, name and namespace
kind=
name=
namespace=
# 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 ]]; then
namespace="default"
else
namespace=
fi
get_root_owner_reference $namespace
您需要提供两个参数 - 资源和资源名称。命名空间名称是可选的(如果没有给出它将使用 Kubernetes default
命名空间)。
示例:
部署中定义的 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
问题陈述:
我有一个属于工作负载的 Pod,现在我想知道启动该 Pod 的工作负载。现在执行此操作的一种方法是遍历 ownerReference
,然后递归地沿着链向上查找启动 pod 的根父工作负载。
有什么方法可以直接知道哪个根父工作负载启动了 Pod?
首先,请记住由特定工作负载创建的 pods 在 pod 名称中包含此工作负载的名称。例如,deployments 中定义的 pods 具有以下 pod 命名约定:
<replicaset-name>-<some-string>
副本集名称为:
<deployment-name>-<some-string>
例如:
广告连播名称:nginx-66b6c48dd5-84rml
副本集名称:nginx-66b6c48dd5
部署名称:nginx
所以名称的第一部分似乎不是一些随机字母/数字是根工作负载名称。
只有podsdefined in StatefulSet have ordinal indexes,如下:
<statefulset-name>-<ordinal index>
例如:
广告连播名称:web-0
StafeulSet 名称: web
当然,根据工作负载名称我们无法知道它是哪种工作负载。检查下面我的回答的第二部分。
好吧,不考虑 pod 的名称,看来您的想法是正确的,找到“根”工作负载的唯一方法是递归遍历链并找到下一个“父”工作负载。
当你运行命令kubectl get pod {pod-name} -o json
(获取关于pod的所有信息)时,只有关于上面级别的信息(正如你所说的在部署中定义的pod,在pod信息中有只是关于副本集的信息。
我写了一个小的 bash 脚本,它递归地检查每个工作负载的 ownerReferences
,直到它找到“根”工作负载(根工作负载没有 ownerRefernces
)。它要求您在系统上安装 jq
utility。检查这个:
#!/bin/bash
function get_root_owner_reference {
# Set kind, name and namespace
kind=
name=
namespace=
# 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 ]]; then
namespace="default"
else
namespace=
fi
get_root_owner_reference $namespace
您需要提供两个参数 - 资源和资源名称。命名空间名称是可选的(如果没有给出它将使用 Kubernetes default
命名空间)。
示例: 部署中定义的 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