Kubectl Foreach 在多个集群中执行 Kubectl 命令

Kubectl Foreach 在多个集群中执行 Kubectl 命令

作者:Addo Zhang 2022-12-02 19:37:36

云计算

云原生 今天偶然间发现了一个 kubectl 插件 kubectl foreach​ ,可以在多个集群(contexts​)上执行 kubectl 命令。比如 kubectl foreach cluster-1 cluster-2 — get po -n kube-system 。

上周在写 K8s 多集群的流量调度 的 demo 部分时需要不停地在多个集群中安装组件、部署应用,或者执行各种命令。当时是通过 Linux shell 脚本并通过工具 kubectx 进行集群的切换,像这样:

或者这样:

操作繁琐,很是痛苦。

今天偶然间发现了一个 kubectl 插件 kubectl foreach​ ,可以在多个集群(contexts​)上执行 kubectl 命令。比如 kubectl foreach cluster-1 cluster-2 — get po -n kube-system 。

插件安装和使用很简单,通过 krew 进行安装:

kubectl krew install foreach

使用也很简单:

kubectl foreach -h
Usage:
kubectl foreach [OPTIONS][PATTERN]... -- [KUBECTL_ARGS...]

Patterns can be used to match context names from kubeconfig:
(empty): matches all contexts
NAME: matches context with exact name
/PATTERN/: matches context with regular expression
^NAME: remove context with exact name from the matched results
^/PATTERN/: remove contexts matching the regular expression from the results

Options:
-c=NUM Limit parallel executions (default:0, unlimited)
-I=VAL Replace VAL occurring in KUBECTL_ARGS with context name
-q Disable and accept confirmation prompts ($KUBECTL_FOREACH_DISABLE_PROMPTS)
-h/--help Print help

Examples:
# get nodes on contexts named a b c
kubectl foreach a b c -- get nodes

# get nodes on all contexts named c0..9 except c1 (note the escaping)
kubectl foreach '/^c[0-9]/'^c1 -- get nodes

# get nodes on all contexts that has "prod" but not"foo"
kubectl foreach /prod/^/foo/-- get nodes

# use 'kubectl tail' plugin to follow logs of pods in contexts named *test*
kubectl foreach -I _ /test/-- tail --cnotallow=_ -l app=foo

接下来测试下,使用 k3d 创建 3 个集群 (k3d 貌似不支持同时创建多个集群,还是需要 for 脚本来操作):

for CLUSTER_NAME in cluster-1 cluster-2 cluster-3
do
k3d cluster create ${CLUSTER_NAME} \
--image docker.io/rancher/k3s:v1.23.8-k3s2 \
--servers-memory 4g \
--k3s-arg "--disable=traefik@server:0" \
--no-lb \
--timeout 120s \
--wait
done

集群安装完成:

k3d cluster list
NAME SERVERS AGENTS LOADBALANCER
cluster-11/10/0false
cluster-21/10/0false
cluster-31/10/0false

注意,k3d 安装的集群的 context 都带有前缀 k3d-​ ,在使用 kubectl foreach 的时候要注意:

kubectx
k3d-cluster-1
k3d-cluster-2
k3d-cluster-3

比如查看各个集群中的 kube-sysmte 下的 pod:

kubectl foreach -q k3d-cluster-1 k3d-cluster-2 k3d-cluster-3-- get po -n kube-system

或者试试创建 deployment,这次我们不列出完整的 context name,而是使用正则 /cluster/:

kubectl foreach -q /cluster/-- create deploy pipy --image flomesh/pipy -n default
Will run command in context(s):
- k3d-cluster-1
- k3d-cluster-2
- k3d-cluster-3
k3d-cluster-1| deployment.apps/pipy created
k3d-cluster-3| deployment.apps/pipy created
k3d-cluster-2| deployment.apps/pipy created

然后查看下 pod:

kubectl foreach -q /cluster/-- get pod -n default
Will run command in context(s):
- k3d-cluster-1
- k3d-cluster-2
- k3d-cluster-3
k3d-cluster-1| NAME READY STATUS RESTARTS AGE
k3d-cluster-1| pipy-df659b55f-bnr27 1/1 Running 025s
k3d-cluster-3| NAME READY STATUS RESTARTS AGE
k3d-cluster-3| pipy-df659b55f-p9j49 1/1 Running 025s
k3d-cluster-2| NAME READY STATUS RESTARTS AGE
k3d-cluster-2| pipy-df659b55f-9bjgf 1/1 Running 025s

查看日志:

kubectl foreach -q /cluster/-- logs -l app=pipy -n default --tail 3
Will run command in context(s):
- k3d-cluster-1
- k3d-cluster-2
- k3d-cluster-3
k3d-cluster-2|2022-11-3010:40:56.520[INF][listener] Listening on TCP port 8080 at 0.0.0.0
k3d-cluster-2|2022-11-3010:40:56.520[INF][listener] Listening on TCP port 8081 at 0.0.0.0
k3d-cluster-2|2022-11-3010:40:56.520[INF][listener] Listening on TCP port 8082 at 0.0.0.0
k3d-cluster-1|2022-11-3010:40:56.551[INF][listener] Listening on TCP port 8080 at 0.0.0.0
k3d-cluster-1|2022-11-3010:40:56.551[INF][listener] Listening on TCP port 8081 at 0.0.0.0
k3d-cluster-1|2022-11-3010:40:56.551[INF][listener] Listening on TCP port 8082 at 0.0.0.0
k3d-cluster-3|2022-11-3010:40:55.813[INF][listener] Listening on TCP port 8080 at 0.0.0.0
k3d-cluster-3|2022-11-3010:40:55.813[INF][listener] Listening on TCP port 8081 at 0.0.0.0
k3d-cluster-3|2022-11-3010:40:55.813[INF][listener] Listening on TCP port 8082 at 0.0.0.0

注意,多集群的操作要谨慎,尤其是使用正则来匹配 context name;还有 ​-q 参数会跳过要操作的集群提醒,直接执行命令。​

文章来源网络,作者:运维,如若转载,请注明出处:https://shuyeidc.com/wp/230725.html<

(0)
运维的头像运维
上一篇2025-04-19 09:01
下一篇 2025-04-19 09:04

相关推荐

  • 个人主题怎么制作?

    制作个人主题是一个将个人风格、兴趣或专业领域转化为视觉化或结构化内容的过程,无论是用于个人博客、作品集、社交媒体账号还是品牌形象,核心都是围绕“个人特色”展开,以下从定位、内容规划、视觉设计、技术实现四个维度,详细拆解制作个人主题的完整流程,明确主题定位:找到个人特色的核心主题定位是所有工作的起点,需要先回答……

    2025-11-20
    0
  • 社群营销管理关键是什么?

    社群营销的核心在于通过建立有温度、有价值、有归属感的社群,实现用户留存、转化和品牌传播,其管理需贯穿“目标定位-内容运营-用户互动-数据驱动-风险控制”全流程,以下从五个维度展开详细说明:明确社群定位与目标社群管理的首要任务是精准定位,需明确社群的核心价值(如行业交流、产品使用指导、兴趣分享等)、目标用户画像……

    2025-11-20
    0
  • 香港公司网站备案需要什么材料?

    香港公司进行网站备案是一个涉及多部门协调、流程相对严谨的过程,尤其需兼顾中国内地与香港两地的监管要求,由于香港公司注册地与中国内地不同,其网站若主要服务内地用户或使用内地服务器,需根据服务器位置、网站内容性质等,选择对应的备案路径(如工信部ICP备案或公安备案),以下从备案主体资格、流程步骤、材料准备、注意事项……

    2025-11-20
    0
  • 如何企业上云推广

    企业上云已成为数字化转型的核心战略,但推广过程中需结合行业特性、企业痛点与市场需求,构建系统性、多维度的推广体系,以下从市场定位、策略设计、执行落地及效果优化四个维度,详细拆解企业上云推广的实践路径,精准定位:明确目标企业与核心价值企业上云并非“一刀切”的方案,需先锁定目标客户群体,提炼差异化价值主张,客户分层……

    2025-11-20
    0
  • PS设计搜索框的实用技巧有哪些?

    在PS中设计一个美观且功能性的搜索框需要结合创意构思、视觉设计和用户体验考量,以下从设计思路、制作步骤、细节优化及交互预览等方面详细说明,帮助打造符合需求的搜索框,设计前的规划明确使用场景:根据网站或APP的整体风格确定搜索框的调性,例如极简风适合细线条和纯色,科技感适合渐变和发光效果,电商类则可能需要突出搜索……

    2025-11-20
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注