---
vssueId: 115
description: Kubernete安装文档_kubectl命令行工具从一个配置文件中查找用于调用APIServer接口的信息_可以在一个或多个文件中配置多个集群的访问信息_并在kubectl中切换不同的集群访问
meta:
  - name: keywords
    content: kubectl,kubectl配置,kubectl访问多个集群
---

# 配置Kubectl

<AdSenseTitle/>

> 参考文档： Kubernetes官网文档 [Organizing Cluster Access Using kubeconfig Files](https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/)、[Configure Access to Multiple Clusters](https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/)

`kubectl` 命令行工具从配置文件kubeconfig中查找用于调用 API Server 接口的信息：
* 集群 cluster
* 用户 user
* 名称空间 namespace
* 认证机制 authentication mechanism

> kubeconfig 并不是一个文件的名字，而是 kubectl 配置文件的统称

默认情况下，`kubectl` 读取 `$HOME/.kube/config` 作为配置文件。您可以通过两种方式为 `kubectl` 指定配置文件：
* 环境变量 `KUBECONFIG`
* 命令行参数 `--kubeconfig`

可以在一个或多个kubeconfig文件中配置多个集群的访问信息，并使用 `kubectl config use-context` 命令切换要访问哪个集群。本文描述了如何配置 kubectl 以访问多个集群。

::: tip
kubectl的版本号必须大于等于集群的版本号，执行命令 `kubectl version` 可查看 kubectl 版本
:::

## KUBECONFIG环境变量

可以在 `KUBECONFIG` 环境变量中配置多个 kubeconfig 文件：
* 在 Linux 和 MAC 中，使用英文冒号 `:` 分隔
* 在 Windows 中，使用英文分号 `;` 分隔

当 `KUBECONFIG` 指定了多个 kubeconfig 文件时，kubectl会自动合并所有文件中的配置内容。您可以将每个集群的访问信息存储到一个文件中，并将该文件加入到 `KUBECONFIG` 环境变量中。

`KUBECONFIG` 环境变量并不是必须配置的，如果该环境变量不存在， kubectl 将使用默认位置的 kubeconfig 文件，即 `$HOME/.kube/config`。

## kubeconfig文件的合并

前面提到，kubectl会自动合并 `KUBECONFIG` 指定的多个文件，执行以下指令，可以查看最终生效的结果：

``` sh
kubectl config view
```

合并时的规则如下：
* 如果执行 kubectl 指令时，指定了 `--kubeconfig` 参数，则只使用该参数指定的 kubeconfig 文件，不会进行合并
* 否则，在指定了环境变量 `KUBECONFIG` 的情况下，该环境变量中的所有文件将被合并使用：
  * 对于不能正常解析的文件，提示错误信息
  * 当执行 `kubectl config use-context` 指令后，在第一个文件中保存 `current-context` 字段
  * 合并过程忽略冲突。例如：如果多个文件中都定义了 `red-user`，将只使用列表中第一个定义了 `red-user` 的内容，所有后面定义的 `red-user` 都将被忽略
* 如果既没指定 `--kubeconfig` 参数，又没指定 `KUBECONFIG` 环境变量，则使用默认的配置文件 `$HOME/.kube/config`，此时也无需合并

## 切换当前访问的集群

当您通过 `KUBECONFIG` 环境变量指定了多个集群的访问配置文件时，执行 `kubectl config view` 指令，输出结果如下所示：

* 其中 `contexts` 字段包含了多个访问集群的 `上下文`，每个上下文指定了一个 `name`，并指定了该 `上下文` 要访问的集群名称`cluster`，集群中的名称空间`namespace`，使用哪个用户去访问`user`。
* `current-context` 字段指定了当前生效的 `上下文`


``` yaml {6,11,21,22}
contexts: 
- context:
    cluster: development
    namespace: frontend
    user: developer
  name: dev-frontend
- context:
    cluster: development
    namespace: ramp
    user: developer
  name: dev-ramp-up
- context:
    cluster: development
    namespace: storage
    user: developer
  name: dev-storage
- context:
    cluster: scratch
    namespace: default
    user: experimenter
  name: exp-scratch
current-context: dev-frontend
kind: Config
users:
...
```

执行 `kubectl config get-contexts` 命令，可以查看可用的 `上下文` 列表，其中第一列带 `*` 的为当前使用的 `上下文`，输出如下所示：

``` {3}
CURRENT   NAME                 CLUSTER                      AUTHINFO             NAMESPACE
          dev-frontend         development                  developer            frontend
*         dev-ramp-up          development                  developer            ramp
          dev-storage          development                  developer            storage
          exp-scratch          scratch                      experimenter         default
```

执行 `kubectl config use-context dev-storage` 命令，可以切换到另外一个 `上下文`
