我如何直接知道 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