配置对多个集群的访问
此页面展示了如何使用配置文件配置对多个集群的访问。在您的集群、用户和上下文在一个或多个配置文件中定义后,您可以使用 `kubectl config use-context` 命令快速切换集群。
注意
用于配置对集群访问的文件有时被称为kubeconfig 文件。这是一种通用的配置文件引用方式。并不意味着存在一个名为 `kubeconfig` 的文件。警告
只使用来自可信来源的 kubeconfig 文件。使用特制 kubeconfig 文件可能导致恶意代码执行或文件泄露。如果您必须使用不可信的 kubeconfig 文件,请先仔细检查它,就像检查 shell 脚本一样。开始之前
您需要有一个 Kubernetes 集群,并且 kubectl 命令行工具必须配置为与您的集群通信。建议在至少有两个节点的集群上运行本教程,这些节点不充当控制平面主机。如果您还没有集群,可以使用 minikube 创建一个,或者您可以使用以下 Kubernetes 游乐场之一
要检查 kubectl 是否已安装,请运行 `kubectl version --client`。kubectl 版本应与您的集群 API 服务器的版本 相差一个小版本。
定义集群、用户和上下文
假设您有两个集群,一个用于开发工作,一个用于测试工作。在 `development` 集群中,您的前端开发人员在名为 `frontend` 的命名空间中工作,而您的存储开发人员在名为 `storage` 的命名空间中工作。在您的 `test` 集群中,开发人员在默认命名空间中工作,或者根据需要创建辅助命名空间。访问 development 集群需要通过证书进行身份验证。访问 test 集群需要通过用户名和密码进行身份验证。
创建一个名为 `config-exercise` 的目录。在您的 `config-exercise` 目录中,创建一个名为 `config-demo` 的文件,内容如下
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: development
- cluster:
name: test
users:
- name: developer
- name: experimenter
contexts:
- context:
name: dev-frontend
- context:
name: dev-storage
- context:
name: exp-test
配置文件描述集群、用户和上下文。您的 `config-demo` 文件具有描述两个集群、两个用户和三个上下文的框架。
进入您的 `config-exercise` 目录。输入以下命令将集群详细信息添加到您的配置文件
kubectl config --kubeconfig=config-demo set-cluster development --server=https://1.2.3.4 --certificate-authority=fake-ca-file
kubectl config --kubeconfig=config-demo set-cluster test --server=https://5.6.7.8 --insecure-skip-tls-verify
将用户详细信息添加到您的配置文件
小心
在 Kubernetes 客户端配置中存储密码是有风险的。更好的选择是使用凭证插件并将它们单独存储。请参阅:client-go 凭证插件kubectl config --kubeconfig=config-demo set-credentials developer --client-certificate=fake-cert-file --client-key=fake-key-seefile
kubectl config --kubeconfig=config-demo set-credentials experimenter --username=exp --password=some-password
注意
- 要删除用户,您可以运行 `kubectl --kubeconfig=config-demo config unset users.<name>`
- 要删除集群,您可以运行 `kubectl --kubeconfig=config-demo config unset clusters.<name>`
- 要删除上下文,您可以运行 `kubectl --kubeconfig=config-demo config unset contexts.<name>`
将上下文详细信息添加到您的配置文件
kubectl config --kubeconfig=config-demo set-context dev-frontend --cluster=development --namespace=frontend --user=developer
kubectl config --kubeconfig=config-demo set-context dev-storage --cluster=development --namespace=storage --user=developer
kubectl config --kubeconfig=config-demo set-context exp-test --cluster=test --namespace=default --user=experimenter
打开您的 `config-demo` 文件以查看添加的详细信息。作为打开 `config-demo` 文件的替代方法,您可以使用 `config view` 命令。
kubectl config --kubeconfig=config-demo view
输出显示了两个集群、两个用户和三个上下文
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
- cluster:
insecure-skip-tls-verify: true
server: https://5.6.7.8
name: test
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: test
namespace: default
user: experimenter
name: exp-test
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
# Documentation note (this comment is NOT part of the command output).
# Storing passwords in Kubernetes client config is risky.
# A better alternative would be to use a credential plugin
# and store the credentials separately.
# See https://kubernetes.ac.cn/docs/reference/access-authn-authz/authentication/#client-go-credential-plugins
password: some-password
username: exp
上面的 `fake-ca-file`、`fake-cert-file` 和 `fake-key-file` 是证书文件路径名的占位符。您需要将它们更改为您的环境中证书文件的实际路径名。
有时您可能希望使用这里嵌入的 Base64 编码数据,而不是单独的证书文件;在这种情况下,您需要在键中添加后缀 `-data`,例如,`certificate-authority-data`、`client-certificate-data`、`client-key-data`。
每个上下文都是一个三元组(集群、用户、命名空间)。例如,`dev-frontend` 上下文表示,“使用 `developer` 用户的凭据访问 `development` 集群的 `frontend` 命名空间”。
设置当前上下文
kubectl config --kubeconfig=config-demo use-context dev-frontend
现在,无论何时输入 `kubectl` 命令,操作都将应用于 `dev-frontend` 上下文列出的集群和命名空间。该命令将使用 `dev-frontend` 上下文列出的用户的凭据。
要仅查看与当前上下文关联的配置信息,请使用 `--minify` 标志。
kubectl config --kubeconfig=config-demo view --minify
输出显示了与 `dev-frontend` 上下文关联的配置信息
apiVersion: v1
clusters:
- cluster:
certificate-authority: fake-ca-file
server: https://1.2.3.4
name: development
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
current-context: dev-frontend
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
现在假设您想在测试集群中工作一段时间。
将当前上下文更改为 `exp-test`
kubectl config --kubeconfig=config-demo use-context exp-test
现在,您提供的任何 `kubectl` 命令都将应用于 `test` 集群的默认命名空间。该命令将使用 `exp-test` 上下文列出的用户的凭据。
查看与新当前上下文 `exp-test` 关联的配置。
kubectl config --kubeconfig=config-demo view --minify
最后,假设您想在 `development` 集群的 `storage` 命名空间中工作一段时间。
将当前上下文更改为 `dev-storage`
kubectl config --kubeconfig=config-demo use-context dev-storage
查看与新当前上下文 `dev-storage` 关联的配置。
kubectl config --kubeconfig=config-demo view --minify
创建第二个配置文件
在您的 `config-exercise` 目录中,创建一个名为 `config-demo-2` 的文件,内容如下
apiVersion: v1
kind: Config
preferences: {}
contexts:
- context:
cluster: development
namespace: ramp
user: developer
name: dev-ramp-up
前面的配置文件定义了一个名为 `dev-ramp-up` 的新上下文。
设置 KUBECONFIG 环境变量
查看您是否有一个名为 `KUBECONFIG` 的环境变量。如果是,请保存您 `KUBECONFIG` 环境变量的当前值,以便您稍后恢复它。例如
Linux
export KUBECONFIG_SAVED="$KUBECONFIG"
Windows PowerShell
$Env:KUBECONFIG_SAVED=$ENV:KUBECONFIG
`KUBECONFIG` 环境变量是配置文件路径的列表。对于 Linux 和 Mac,列表是用冒号分隔的,而对于 Windows,列表是用分号分隔的。如果您有 `KUBECONFIG` 环境变量,请熟悉列表中的配置文件。
暂时将两个路径追加到您的 `KUBECONFIG` 环境变量。例如
Linux
export KUBECONFIG="${KUBECONFIG}:config-demo:config-demo-2"
Windows PowerShell
$Env:KUBECONFIG=("config-demo;config-demo-2")
在您的 `config-exercise` 目录中,输入以下命令
kubectl config view
输出显示了从您 `KUBECONFIG` 环境变量中列出的所有文件合并的信息。特别要注意,合并的信息包含来自 `config-demo-2` 文件的 `dev-ramp-up` 上下文以及来自 `config-demo` 文件的三个上下文
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: test
namespace: default
user: experimenter
name: exp-test
有关如何合并 kubeconfig 文件的更多信息,请参阅 使用 kubeconfig 文件组织集群访问
探索 $HOME/.kube 目录
如果您已经有一个集群,并且可以使用 `kubectl` 与集群交互,那么您可能在 `$HOME/.kube` 目录中有一个名为 `config` 的文件。
转到 `$HOME/.kube`,查看那里有哪些文件。通常,会有一个名为 `config` 的文件。该目录中也可能存在其他配置文件。请简要熟悉这些文件的内容。
将 $HOME/.kube/config 追加到您的 KUBECONFIG 环境变量
如果您有一个 `$HOME/.kube/config` 文件,并且它还没有列在您的 `KUBECONFIG` 环境变量中,请立即将其追加到您的 `KUBECONFIG` 环境变量。例如
Linux
export KUBECONFIG="${KUBECONFIG}:${HOME}/.kube/config"
Windows Powershell
$Env:KUBECONFIG="$Env:KUBECONFIG;$HOME\.kube\config"
查看从您 `KUBECONFIG` 环境变量中现在列出的所有文件合并的配置信息。在您的 config-exercise 目录中,输入
kubectl config view
清理
将您的 `KUBECONFIG` 环境变量恢复为其原始值。例如
Linux
export KUBECONFIG="$KUBECONFIG_SAVED"
Windows PowerShell
$Env:KUBECONFIG=$ENV:KUBECONFIG_SAVED
检查 kubeconfig 所代表的主题
您在身份验证到集群后将获得哪些属性(用户名、组)并不总是很明显。如果您同时管理多个集群,这可能会更具挑战性。
有一个 `kubectl` 子命令用于检查选定的 Kubernetes 客户端上下文的主题属性,如用户名:`kubectl auth whoami`。
阅读 客户端对身份验证信息的 API 访问 以了解有关此方面的更多信息。