跳转到内容

kubectx — kubectl 切换 context 和 namespace 的两行命令

是什么

kubectx 是一对专门替你切换 K8s context 和 namespace 的小工具,包含两个独立命令:

  • kubectx:切 cluster context(家里 minikube / 公司 EKS / 客户 GKE 来回跳)
  • kubens:切当前 context 的默认 namespace(default / kube-system / dev / prod 来回跳)

日常类比:

  • 用裸 kubectl config手动改电脑环境变量——要打全名 kubectl config use-context arn:aws:eks:us-east-1:123:cluster/prod-east,每次复制粘贴。
  • 用 kubectx 像装了快捷开关的拨钮——一个命令带个名字甚至直接弹列表选,按一下就切。

它由 Ahmet Alp Balkan(前 Microsoft / Twitter / Google Cloud 工程师)2017 年开源,最初是几行 bash 脚本,2020 年用 Go 重写打成单二进制。GitHub 17k+ 星,是 K8s 用户日常工具链里普及度仅次于 kubectl 本身的小工具。

为什么重要

不用 kubectx,下面这些事都额外打几十个字符:

  • 多集群切换kubectl config use-context my-very-long-context-name 每次都打一行;kubectx 是 kubectx my-very-long-context-name,配 fzf 后只要 kubectx 一个字然后箭头选
  • 回到上一个 contextkubectx -(学 shell 的 cd -),kubectl 原生没有这个体感
  • 重命名 context:AWS EKS 自动生成的名字超长(arn:aws:eks:...),kubectx short=long-name 一行重命名,往后都用短名
  • 当前 namespace 不用每条命令带 -nkubens dev 切完,后续所有 kubectl 默认在 dev ns 里,少打 -n dev
  • fzf 集成:装了 fzf 后输 kubectx 不带参数会弹模糊搜索框,敲两个字符回车就切

核心要点

kubectx 干的事可以拆成 三个抽象

  1. kubectx:context 的快捷操作

    • kubectx:列出所有 context,标星当前
    • kubectx <name>:切到指定 context
    • kubectx -:切回上一个(最常用)
    • kubectx <new>=<old>:重命名
    • kubectx -d <name>:删除(同步删 cluster + user 配置)
  2. kubens:namespace 的快捷操作(和 kubectx 镜像)

    • kubens:列出 ns
    • kubens <name>:切默认 ns
    • kubens -:回上一个
  3. fzf 模糊搜索集成:检测到 $PATH 里有 fzf 就自动启用,不带参数运行进交互模式。这是 kubectx 体验飞跃的关键——20 个 context 里用箭头选远比记全名快。

底层实现就是读写 ~/.kube/config——这个 YAML 文件存所有 context / cluster / user,kubectx 用 client-go 的 clientcmd 库解析,切换就是改 current-context 字段。理解这一层,kubectx 就没什么神秘的了。

实践案例

案例 1:装上立刻见效

Terminal window
brew install kubectx # macOS
brew install fzf # 强烈建议同装
kubectx # 列出所有 context
kubectx - # 切回上一个
kubens kube-system # 切默认 ns
kubectl get pod # 不用 -n kube-system 了

20 秒装完,从此不再打 kubectl config use-context 全名。

案例 2:给 EKS 长名字起短名

AWS EKS 默认 context 名长这样:

arn:aws:eks:us-east-1:123456789:cluster/prod-east-1

每次切要复制粘贴或 tab 补全。kubectx 一行重命名:

Terminal window
kubectx prod=arn:aws:eks:us-east-1:123456789:cluster/prod-east-1
kubectx prod # 以后这样切

~/.kube/config 里的 context 名被改写,kubectl 也认。

案例 3:fzf 模糊搜索切 context

装了 fzf 后输 kubectx 不带参数:

> stag
staging-east-1
staging-eu
prod-east-1
prod-eu

输入 stag 自动过滤出含 staging 的,箭头选回车切。20 个 cluster 也能 2 秒切完

案例 4:脚本里拿当前 context / ns

Terminal window
ctx=$(kubectx -c) # 当前 context 名
ns=$(kubens -c) # 当前 ns 名
echo "running on $ctx / $ns"

CI 里做安全检查(“不允许在 prod context 跑 destroy”)特别有用。

踩过的坑

  1. ~/.kube/config 是真改文件:kubectx 直接写文件,不是 in-memory。脚本批量改 context 时如果同时多个 shell 在写会冲突。建议封装好串行执行。

  2. kubectx - 不跨 shell session:上一个 context 存在 ~/.kube/kubectx(小文件),但每个 shell 看到的”上一个”取决于自己用 kubectx 切过什么。开新窗口 kubectx - 行为不一定符合直觉。

  3. kubens 改的是 context 内置 namespace:是写到 context 的 namespace: 字段,不是临时变量。换 context 会重置默认 ns。新人有时困惑”我刚切到 dev 怎么又回 default 了”——因为换 context 了。

  4. 不能切 user / token:kubectx 只切 context(context 是 cluster + user + ns 的三元组)。如果要换登录身份,得编辑 ~/.kube/config 或用 aws-iam-authenticator / gke-gcloud-auth-plugin 这类 exec 插件。

  5. fzf 没装就回退到列表模式:很多人装 kubectx 不装 fzf,体验差一半。务必同装。

适用 vs 不适用场景

适用

  • 日常本地开发 / 运维同时管多 K8s cluster
  • AWS EKS / GCP GKE 自动生成长 context 名的环境
  • 终端键盘流爱好者
  • 需要在脚本里读当前 context / ns

不适用

  • 只用一个 cluster 一个 ns(kubectl 默认就够)
  • CI / 自动化里写死 --context--namespace 参数更可控
  • 需要图形化批量管理(用 k9s:ctx 视图更直观)
  • 想要切登录身份 / token(kubectx 不管这个)

历史小故事(可跳过)

  • 2017 年:Ahmet Alp Balkan 在 Microsoft Azure 做 K8s 相关工作,每天切 context 切到手指疼,写了 50 行 bash 脚本叫 kubectx。
  • 2017 年下半年:加入 kubens 镜像 namespace 切换,社区开始传播。
  • 2018-2019 年:fzf 集成加入,体验断崖式提升,star 数飞涨。
  • 2020 年:v0.9 用 Go 重写,打成单二进制,Windows 也能用(之前 bash 脚本只 macOS / Linux)。
  • 至今:仓库放在 github.com/ahmetb/kubectx,作者后来去 Google Cloud 做 DevRel,工具仍在维护,issue 响应慢但功能稳定。

Balkan 还做过 krew(kubectl 插件管理器,捐给 k8s SIG),是社区有名的”kubectl 用户体验改良派”代表。

学到什么

  1. 小工具可以非常专一——kubectx 只干”切 context”一件事,做到极致就是普及度第二的 K8s 工具
  2. bash 原型 → Go 重写 是开源工具典型成长路径:先用脚本验证需求,火了再用编译语言重写换性能 + 跨平台
  3. fzf 是终端流的乘法器——任何”从列表选一个”的工具加上 fzf 就值钱一倍,kubectx / ghq / git-fuzzy 都是案例
  4. 复用 client-go 的 clientcmd——和 kubectl 共享同一份 ~/.kube/config 解析逻辑,行为一致不会出现”kubectx 改了 kubectl 不认”

延伸阅读

  • 官方仓库:ahmetb/kubectx
  • 作者博客:Ahmet Alp Balkan 有多篇 K8s 工具体验文
  • fzf 项目:junegunn/fzf(kubectx 体验关键)
  • krew 插件管理器:krew.sigs.k8s.io(同作者的另一个工具)
  • 视频快速上手:YouTube 搜 “kubectx kubens tutorial”,3 分钟视频通常够用

关联

  • kubernetes —— kubectx 操作的对象,所有 context 都是 K8s cluster 的引用
  • k9s —— k9s 内置 :ctx :ns 也能切,但 kubectx 是命令行习惯党的首选

反向链接

  • k9s —— k9s — 让 kubectl 长出眼睛和键盘的终端 UI
  • kubernetes —— Kubernetes — 容器编排平台
  • stern —— stern — 多 pod 多 container 日志聚合 tail