使用 kubeconfig 文件组织集群访问
使用 kubeconfig 文件来组织关于集群、用户、命名空间和身份验证机制的信息。kubectl
命令行工具使用 kubeconfig 文件来查找选择集群和与集群的 API 服务器通信所需的信息。
注意
用于配置对集群的访问的文件称为 kubeconfig 文件。 这是一种引用配置文件的通用方式。 这并不意味着有一个名为kubeconfig
的文件。警告
仅使用来自可信来源的 kubeconfig 文件。 使用精心制作的 kubeconfig 文件可能会导致恶意代码执行或文件暴露。 如果你必须使用不受信任的 kubeconfig 文件,请先仔细检查它,就像检查 shell 脚本一样。默认情况下,kubectl
在 $HOME/.kube
目录中查找名为 config
的文件。 你可以通过设置 KUBECONFIG
环境变量或设置 --kubeconfig
标志来指定其他 kubeconfig 文件。
有关创建和指定 kubeconfig 文件的逐步说明,请参阅 配置对多个集群的访问。
支持多个集群、用户和身份验证机制
假设你有多个集群,并且你的用户和组件以多种方式进行身份验证。 例如
- 运行的 kubelet 可能会使用证书进行身份验证。
- 用户可能会使用令牌进行身份验证。
- 管理员可能有一组证书,他们将其提供给各个用户。
使用 kubeconfig 文件,你可以组织你的集群、用户和命名空间。 你还可以定义上下文以便在集群和命名空间之间快速轻松地切换。
上下文
kubeconfig 文件中的上下文元素用于将访问参数分组到一个方便的名称下。 每个上下文都有三个参数:集群、命名空间和用户。 默认情况下,kubectl
命令行工具使用来自当前上下文的参数来与集群通信。
选择当前上下文
kubectl config use-context
KUBECONFIG 环境变量
KUBECONFIG
环境变量保存 kubeconfig 文件列表。 对于 Linux 和 Mac,该列表是以冒号分隔的。 对于 Windows,该列表是以分号分隔的。 KUBECONFIG
环境变量不是必需的。 如果 KUBECONFIG
环境变量不存在,则 kubectl
使用默认的 kubeconfig 文件 $HOME/.kube/config
。
如果 KUBECONFIG
环境变量存在,则 kubectl
使用一个有效的配置,该配置是合并 KUBECONFIG
环境变量中列出的文件的结果。
合并 kubeconfig 文件
要查看你的配置,请输入此命令
kubectl config view
如前所述,输出可能来自单个 kubeconfig 文件,也可能是合并多个 kubeconfig 文件的结果。
以下是 kubectl
在合并 kubeconfig 文件时使用的规则
如果设置了
--kubeconfig
标志,则仅使用指定的文件。 不要合并。 只允许此标志的一个实例。否则,如果设置了
KUBECONFIG
环境变量,则将其用作应合并的文件列表。 根据以下规则合并KUBECONFIG
环境变量中列出的文件- 忽略空文件名。
- 对于内容无法反序列化的文件,产生错误。
- 第一个设置特定值或映射键的文件获胜。
- 永远不要更改值或映射键。 示例:保留第一个设置
current-context
文件的上下文。 示例:如果两个文件指定了red-user
,则仅使用第一个文件的red-user
中的值。 即使第二个文件在red-user
下有不冲突的条目,也将其丢弃。
有关设置
KUBECONFIG
环境变量的示例,请参阅 设置 KUBECONFIG 环境变量。否则,使用默认的 kubeconfig 文件
$HOME/.kube/config
,不进行合并。根据此链中的第一个命中确定要使用的上下文
- 如果存在,则使用
--context
命令行标志。 - 使用合并后的 kubeconfig 文件中的
current-context
。
此时允许空上下文。
- 如果存在,则使用
确定集群和用户。此时,可能存在也可能不存在上下文。根据此链中的第一个命中确定集群和用户,该链运行两次:一次用于用户,一次用于集群
- 如果存在,则使用命令行标志:
--user
或--cluster
。 - 如果上下文为非空,则从上下文中获取用户或集群。
此时用户和集群可以为空。
- 如果存在,则使用命令行标志:
确定要使用的实际集群信息。此时,可能存在也可能不存在集群信息。基于此链构建集群信息的每一部分;第一个命中获胜
- 如果存在,则使用命令行标志:
--server
、--certificate-authority
、--insecure-skip-tls-verify
。 - 如果合并的 kubeconfig 文件中存在任何集群信息属性,则使用它们。
- 如果没有服务器位置,则失败。
- 如果存在,则使用命令行标志:
确定要使用的实际用户信息。使用与集群信息相同的规则构建用户信息,但每个用户只允许一种身份验证技术
- 如果存在,则使用命令行标志:
--client-certificate
、--client-key
、--username
、--password
、--token
。 - 使用合并后的 kubeconfig 文件中的
user
字段。 - 如果有两种冲突的技术,则失败。
- 如果存在,则使用命令行标志:
对于仍然缺失的任何信息,请使用默认值,并可能提示输入身份验证信息。
文件引用
kubeconfig 文件中的文件和路径引用相对于 kubeconfig 文件的位置。 命令行上的文件引用相对于当前工作目录。 在 $HOME/.kube/config
中,相对路径以相对方式存储,绝对路径以绝对方式存储。
代理
你可以使用 kubeconfig 文件中的 proxy-url
来配置 kubectl
以使用每个集群的代理,如下所示
apiVersion: v1
kind: Config
clusters:
- cluster:
proxy-url: http://proxy.example.org:3128
server: https://k8s.example.org/k8s/clusters/c-xxyyzz
name: development
users:
- name: developer
contexts:
- context:
name: development