2. 配置集群配置文件

任务目标

在多集群环境中,每个集群都有独立的kubeconfig配置。本案例将创建两个模拟集群的kubeconfig文件,并通过KUBECONFIG环境变量合并它们,实现使用kubectl config use-context快速切换集群上下文。

环境准备

需要一台已安装kubectl的Linux/macOS机器。为模拟两个独立集群,我们将使用kubectl config set-cluster等命令生成指向不同API Server地址(无需真实集群)的kubeconfig文件。

实现步骤与代码

以下命令创建两个独立的kubeconfig文件,分别代表cluster-a(生产环境)和cluster-b(开发环境),并设置对应的用户与上下文。

```bash # 1. 创建 cluster-a 的 kubeconfig export KUBECONFIG=~/.kube/config-a kubectl config set-cluster cluster-a \ --server=https://api.cluster-a.example.com:6443 \ --certificate-authority=/etc/kubernetes/pki/ca.crt kubectl config set-credentials admin-a \ --=eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3QtYSJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50In0.signature-a kubectl config set-context ctx-a \ --cluster=cluster-a --user=admin-a --namespace=prod kubectl config use-context ctx-a # 2. 创建 cluster-b 的 kubeconfig export KUBECONFIG=~/.kube/config-b kubectl config set-cluster cluster-b \ --server=https://api.cluster-b.example.com:6443 \ --certificate-authority=/etc/kubernetes/pki/ca.crt kubectl config set-credentials admin-b \ --=eyJhbGciOiJSUzI1NiIsImtpZCI6InRlc3QtYiJ9.eyJpc3MiOiJrdWJlcm5ldGVzL3NlcnZpY2VhY2NvdW50In0.signature-b kubectl config set-context ctx-b \ --cluster=cluster-b --user=admin-b --namespace=dev kubectl config use-context ctx-b # 3. 合并两个配置文件(通过环境变量临时合并,不修改原文件) export KUBECONFIG=~/.kube/config-a:~/.kube/config-b kubectl config view --merge --flatten > ~/.kube/config-merged ```

合并后的config-merged文件包含两个集群的全部信息。为便于日常使用,将其设为默认配置:

```bash cp ~/.kube/config-merged ~/.kube/config unset KUBECONFIG # 确保kubectl读取默认的~/.kube/config ```

验证方法

执行以下命令验证上下文切换是否生效:

```bash # 查看当前所有可用上下文 kubectl config get-contexts # 切换到 cluster-a 的上下文 kubectl config use-context ctx-a kubectl config current-context # 预期输出: ctx-a # 切换到 cluster-b 的上下文 kubectl config use-context ctx-b kubectl config current-context # 预期输出: ctx-b # 验证当前上下文对应的集群服务器地址 kubectl config view --minify -o jsonpath='{.clusters[].cluster.server}' ```

通过条件:

  • kubectl config get-contexts能同时列出ctx-a和ctx-b两个上下文;
  • 执行use-context后,current-context输出与切换目标一致;
  • 最后一条命令输出的服务器地址与当前上下文对应(ctx-a输出https://api.cluster-a.example.com:6443,ctx-b输出https://api.cluster-b.example.com:6443)。

常见问题

  • 证书路径不存在:本案例仅为演示配置结构,API Server地址与证书均为模拟值。实际环境中应替换为真实集群的CA证书路径或使用--insecure-skip-tls-verify=true(仅测试环境)。
  • 合并后上下文丢失:若使用KUBECONFIG环境变量直接指向多个文件(不执行--flatten),kubectl仍可读取全部上下文,但部分旧版本工具可能不支持。建议始终使用--flatten生成单一合并文件。