k8s多集群kubeconfig管理
多集群管理
在实际生产环境中,往往需要维护多个k8s集群,如何实现在一台机器上操作多个集群。通过设置kubeconfig文件来实现。
合并多个kubeconfig文件
方案1:kubectl config命令
假设存在两套集群,集群1:master1/node1、集群2:master2/node2。现在在master1上配置访问master2的集群
查看两个集群
kubectl config view
#或者直接查看config文件
cat /root/.kube/config
在集群1上添加集群2的信息
#添加cluster,在集群1上
kubectl config set-cluster k8smaster2 --server=https://192.168.40.185:6443 --insecure-skip-tls-verify=true
#添加user
##集群2上获取token
kubeadm token create --print-join-command
##集群1上设置token
kubectl config set-credentials k8smaster2-user --token=xxx
#添加context,集群1上
kubectl config set-context k8smaster2-context --cluster=k8smaster2 --user=k8smaster2-user
#可以在集群1上通过切换context来操作
kubectl config use-context k8smaster2-context
方案2:KUBECONFIG 环境变量指向多个文件
通过在 KUBECONFIG 环境变量中指定多个文件,可以临时将 KUBECONFIG 文件组合在一起,并在 kubectl中使用。如下,那么kubeconfig 是在内存中做的合并:
export KUBECONFIG=~/.kube/config:~/another-config-file-location
多文件合并优先级
Kubernetes 的规则是:第一个设置某个值或同名 map key 的文件胜出,不是后面的文件覆盖前面的文件。例如两个文件都定义了名为 prod 的 context,使用前一个文件中的完整定义。可用 kubectl config view 检查最终合并结果。
方案3:flatten 导出
export KUBECONFIG=~/.kube/config:~/anotherconfig
kubectl config view --flatten
--flatten:将生成的 kubeconfig 文件扁平化为自包含的输出(用于创建可移植的kubeconfig 文件)
如果需要,还可以管道输出到另外一个新文件。
方案4:kubectl 插件 konfig
kubectl 有个 krew 插件包管理器,可以通过 krew 安装 konfig 实用插件来管理 kubeconfig。
安装:
kubectl krew install konfig
krew插件 konfig 可以帮助你管理 ~/.kube/config,使用 konfig 插件的语法如下:
kubectl konfig import -s new.yaml
kubectx 与 kubens:多集群快速切换
kubectx 用来切换 kubeconfig 中的 context,kubens 用来修改当前 context 的默认 namespace。它们没有引入新的 Kubernetes 连接机制,而是把 kubectl config use-context 和 namespace 配置封装成更短、更适合交互操作的命令。
context 的组成与切换原理
kubeconfig 的核心关系如下:
clusters:API Server 地址、CA 等集群连接信息。users:证书、Token 或exec凭证等身份信息。contexts:把一个 cluster、一个 user 和可选的默认 namespace 组合起来。current-context:kubectl 默认使用的 context。
原生 kubectl 已经能够完成查看和切换:
kubectl config get-contexts
kubectl config current-context
kubectl config use-context prod-ap-sg
kubectx 的价值在于缩短命令、支持返回上一个 context、重命名长 context,并可配合 fzf 进行交互式模糊选择。
安装
优先使用项目官方列出的包管理方式,避免在笔记中固定某个可能过期的 release 版本:
| 平台/方式 | 命令 |
|---|---|
| macOS 或 Linux(Homebrew) | brew install kubectx |
| Debian/Ubuntu | sudo apt install kubectx |
| Arch Linux | sudo pacman -S kubectx |
| Windows(Chocolatey) | choco install kubens kubectx |
| Windows(Scoop) | scoop bucket add main && scoop install main/kubens main/kubectx |
| kubectl Krew 插件 | kubectl krew install ctx && kubectl krew install ns |
Krew 方式对应的命令是 kubectl ctx 和 kubectl ns;独立安装则使用 kubectx 和 kubens。
kubectx 常用操作
# 列出 context;安装 fzf 后会进入交互式模糊选择
kubectx
# 切换到指定 context
kubectx prod-ap-sg
# 返回上一个 context,适合 dev/prod 往返
kubectx -
# 将云厂商生成的长 context 重命名为短名称:新名称=旧名称
kubectx prod-ap-sg=arn:aws:eks:ap-southeast-1:123456789012:cluster/prod-ap-sg
# 启动只暴露指定 context 的隔离 shell
kubectx -s prod-ap-sg
# 启动阻止写操作的只读 shell
kubectx -r prod-ap-sg
交互式选择条件
只有当 fzf 在 PATH 中时,无参数运行 kubectx/kubens 才会显示可搜索菜单。设置 KUBECTX_IGNORE_FZF=1 可临时关闭该行为。没有 fzf 时仍可列出名称并通过参数精确切换。
kubectx -r 是本地防误操作层,不应替代 Kubernetes RBAC。生产环境仍应使用受限凭证,并把日常 context 绑定到只读或最小权限身份。
kubens 常用操作
# 列出 namespace;安装 fzf 后可交互选择
kubens
# 修改当前 context 的默认 namespace
kubens kube-system
# 返回上一个 namespace
kubens -
# 即使 namespace 尚不存在也强制设置
kubens namespace-404 -f
执行 kubens monitoring 后,后续 kubectl get pods 默认查询 monitoring,无需每次附加 -n monitoring。切换 context 后应重新确认默认 namespace,因为 namespace 是 context 的组成部分。
使用 kube-ps1 持续显示当前位置
只依赖记忆区分 dev、staging、prod 风险很高。kube-ps1 可以把当前 context 和 namespace 常驻显示在 Bash/Zsh 提示符中。
# macOS
brew install kube-ps1
# 或从源码安装
git clone https://github.com/jonmosco/kube-ps1.git ~/.kube-ps1
source ~/.kube-ps1/kube-ps1.sh
根据 context 名称动态着色:
kube_ps1_ctx_color() {
local context="$1"
case "$context" in
*prod*) echo red ;;
*staging*|*stg*) echo yellow ;;
*dev*) echo green ;;
*) echo cyan ;;
esac
}
export KUBE_PS1_CTX_COLOR_FUNCTION=kube_ps1_ctx_color
export KUBE_PS1_PREFIX="["
export KUBE_PS1_SUFFIX="] "
将它接入提示符:
# Bash
PS1='$(kube_ps1)'$PS1
# Zsh
PROMPT='$(kube_ps1)'$PROMPT
最终提示符会持续显示类似 [prod-ap-sg:default] 的信息。动态颜色应使用 kube-ps1 官方的 KUBE_PS1_CTX_COLOR_FUNCTION,无需修改 PROMPT_COMMAND。
多 kubeconfig 合并与排错
Linux/macOS 使用冒号分隔多个文件,Windows 使用分号:
export KUBECONFIG="${HOME}/.kube/config:${HOME}/.kube/eks.yaml:${HOME}/.kube/gke.yaml"
# 查看合并后的有效配置
kubectl config view
kubectl config get-contexts
kubectl config get-users
同名 context、cluster 或 user 冲突时,列表中第一个定义该键的文件胜出。因此应给 context 加上环境、账号或地域信息,例如 prod-aws-a-sg、prod-gcp-a-tw,不要在多个文件中都使用笼统的 prod。
需要生成单一、自包含的 kubeconfig 时:
KUBECONFIG="${HOME}/.kube/config:${HOME}/.kube/eks.yaml:${HOME}/.kube/gke.yaml" \
kubectl config view --flatten > "${HOME}/merged-kubeconfig.yaml"
chmod 600 "${HOME}/merged-kubeconfig.yaml"
KUBECONFIG="${HOME}/merged-kubeconfig.yaml" kubectl config get-contexts
--flatten 会把外部证书引用转成内联数据,便于迁移,但也会让单个文件包含更多敏感凭证。不要提交到 Git,也不要接收和直接使用不可信 kubeconfig;其中的 exec 凭证插件可能执行本地命令。
生产环境防误操作清单
- [ ] context 名称包含环境、云账号/项目和地域,避免重名。
- [ ] 提示符持续显示 context 和 namespace,生产环境使用醒目颜色。
- [ ] 日常生产 context 使用只读或最小权限凭证,写权限单独建 context。
- [ ] 高风险操作前运行
kubectl config current-context,必要时显式传入--context。 - [ ] 进入并行排障场景时使用
kubectx -s隔离 shell,降低全局 context 来回切换的风险。 - [ ] 多 kubeconfig 合并后用
kubectl config view检查同名条目和实际生效配置。 - [ ] 合并后的 kubeconfig 权限设置为
600,不进入代码仓库或共享聊天记录。 - [ ]
kubectx -r、提示符颜色和 shell 包装只能辅助防呆,真正的权限边界仍是认证凭证与 RBAC。
参考资料
OIDC 认证:kubelogin
传统 kubeconfig 使用静态证书或长期 token,存在密钥泄露风险。kubelogin 是基于 OpenID Connect(OIDC)的 kubectl 插件,实现浏览器一键登录 + 短期令牌自动刷新。
- 官方仓库:https://github.com/int128/kubelogin
核心特性
| 特性 | 说明 |
|---|---|
| 浏览器一键登录 | 运行 kubectl 命令时自动弹出浏览器完成 OIDC 认证(支持 Google / Azure AD 等) |
| 短期令牌 | 默认 1 小时有效期的 ID Token,替代长期静态凭证 |
| 自动刷新 | 通过 Refresh Token 自动续期,无需手动重新认证 |
| 加密存储 | 令牌存储在系统钥匙串中(macOS Keychain / Windows Credential Manager) |
| 无缝集成 | 作为 kubectl 插件运行,不改变现有 kubectl 工作流 |
安装
# macOS
brew install kubelogin
# Windows
choco install kubelogin
# krew 插件方式
kubectl krew install oidc-login
kubeconfig 配置
在 kubeconfig 的 users 段使用 exec 模式调用 kubelogin:
users:
- name: oidc
user:
exec:
apiVersion: client.authentication.k8s.io/v1
command: kubectl
args:
- oidc-login
- get-token
- --oidc-issuer-url=ISSUER_URL
- --oidc-client-id=YOUR_CLIENT_ID
配置完成后,正常执行 kubectl get pods 等命令时会自动触发浏览器认证流程。
适用场景
- 企业 SSO 集成:接入公司统一身份认证(Azure AD、Okta、Keycloak 等)
- 多团队共享集群:每个用户用自己的身份登录,便于审计和权限控制
- 合规审计要求:所有操作都关联到具体用户身份,满足安全合规
- 开发测试环境快速切换:浏览器登录比手动管理证书/token 更高效
调试
添加 -v1 参数查看详细认证日志:kubectl oidc-login get-token -v1