首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在服务的所有kubernetes pod上运行命令

在服务的所有kubernetes pod上运行命令
EN

Stack Overflow用户
提问于 2018-06-25 22:43:59
回答 5查看 9K关注 0票数 12

嘿,我正在运行一个kubernetes集群,我想在属于某个特定服务的所有pod上运行一个命令。

据我所知,kubectl exec只能在pod上运行,跟踪我所有的pod是一个荒谬的工作量(这是服务的好处之一)。

有没有什么方法或工具可以让你“广播”到服务中的所有pod?

提前感谢您的帮助!

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2018-06-26 19:21:37

正如Bal Chua所写的,kubectl无法做到这一点,但你可以使用bash脚本来做到这一点:

代码语言:javascript
运行
复制
 #!/usr/bin/env bash

PROGNAME=$(basename $0)

function usage {
    echo "usage: $PROGNAME [-n NAMESPACE] [-m MAX-PODS] -s SERVICE -- COMMAND"
    echo "  -s SERVICE   K8s service, i.e. a pod selector (required)"
    echo "     COMMAND   Command to execute on the pods"
    echo "  -n NAMESPACE K8s namespace (optional)"
    echo "  -m MAX-PODS  Max number of pods to run on (optional; default=all)"
    echo "  -q           Quiet mode"
    echo "  -d           Dry run (don't actually exec)"
}

function header {
    if [ -z $QUIET ]; then
        >&2 echo "###"
        >&2 echo "### $PROGNAME $*"
        >&2 echo "###"
    fi
}

while getopts :n:s:m:qd opt; do
    case $opt in
        d)
            DRYRUN=true
            ;;
        q)
            QUIET=true
            ;;
        m)
            MAX_PODS=$OPTARG
            ;;
        n)
            NAMESPACE="-n $OPTARG"
            ;;
        s)
            SERVICE=$OPTARG
            ;;
        \?)
            usage
            exit 0
            ;;
    esac
done

if [ -z $SERVICE ]; then
    usage
    exit 1
fi

shift $(expr $OPTIND - 1)

while test "$#" -gt 0; do
    if [ "$REST" == "" ]; then
        REST="$1"
    else
        REST="$REST $1"
    fi

    shift
done

if [ "$REST" == "" ]; then
    usage
    exit 1
fi

PODS=()

for pod in $(kubectl $NAMESPACE get pods --output=jsonpath={.items..metadata.name}); do
    echo $pod | grep -qe "^$SERVICE" >/dev/null 2>&1
    if [ $? -eq 0 ]; then
        PODS+=($pod)
    fi
done

if [ ${#PODS[@]} -eq 0 ]; then
    echo "service not found in ${NAMESPACE:-default}: $SERVICE"
    exit 1
fi

if [ ! -z $MAX_PODS ]; then
    PODS=("${PODS[@]:0:$MAX_PODS}")
fi

header "{pods: ${#PODS[@]}, command: \"$REST\"}"

for i in "${!PODS[@]}"; do
    pod=${PODS[$i]}
    header "{pod: \"$(($i + 1))/${#PODS[@]}\", name: \"$pod\"}"

    if [ "$DRYRUN" != "true" ]; then
        kubectl $NAMESPACE exec $pod -- $REST
    fi
done
票数 6
EN

Stack Overflow用户

发布于 2019-07-23 01:50:20

下面是一个简单的示例,使用kubectl管道连接到xargs,打印每个pod的env:

代码语言:javascript
运行
复制
k get pod \
    -l {your label selectors} \
    --field-selector=status.phase=Running \
    -o custom-columns=name:metadata.name --no-headers \
    | xargs -I{} kubectl exec {} env
票数 13
EN

Stack Overflow用户

发布于 2020-03-08 17:25:29

我已经写了一个简单的kubectl插件,“boardcast”的命令到所有的豆荚,使用Tmux。假设服务中的所有pod都应该在其规范中共享相同的标签,例如app=foobar,您可以使用以下命令:

代码语言:javascript
运行
复制
kubectl tmux-exec -l app=foobar bash

这个插件可以在Github:predatorray/kubectl-tmux-exec上找到。希望它能对你有所帮助!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51026174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档