首页 > 解决方案 > 我如何直接知道 Pod 所属的根父工作负载

问题描述

问题陈述:

我有一个属于工作负载的 Pod,现在我想知道启动该 Pod 的工作负载。现在这样做的一种方法是遍历ownerReference链,然后递归地向上查找启动 pod 的根父工作负载。

有没有办法可以直接知道哪个根父工作负载启动了 Pod?

标签: kuberneteskubernetes-podkubernetes-deploymentkubernetes-dashboardworkload

解决方案


首先,请记住特定工作负载创建的 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

推荐阅读