配置访问多个集群

本页面展示了如何使用配置文件来配置对多个集群的访问。在你的集群、用户和上下文定义在一个或多个配置文件中后,你可以使用 kubectl config use-context 命令快速切换集群。

准备工作

你需要有一个 Kubernetes 集群,并且 kubectl 命令行工具已配置为与你的集群通信。建议在本教程中,在一个至少有两个非控制平面主机的节点组成的集群上运行。如果你还没有集群,可以通过使用 minikube 来创建一个,或者使用这些 Kubernetes 操场之一

要检查 kubectl 是否已安装,请运行 kubectl version --client。kubectl 版本应与你的集群 API 服务器的次要版本相差一个版本之内

定义集群、用户和上下文

假设你有两个集群,一个用于开发工作,一个用于测试工作。在 development 集群中,你的前端开发人员在名为 frontend 的名字空间中工作,存储开发人员在名为 storage 的名字空间中工作。在你的 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

向你的配置文件添加用户详细信息:

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 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-filefake-cert-filefake-key-file 是证书文件路径的占位符。你需要将它们更改为环境中证书文件的实际路径。

有时你可能希望在此处嵌入 Base64 编码的数据而不是单独的证书文件;在这种情况下,你需要为键添加后缀 -data,例如 certificate-authority-dataclient-certificate-dataclient-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 访问以了解更多详细信息。

下一步

最后修改于 2023 年 7 月 12 日太平洋标准时间上午 1:25:修订文档主页 (9520b96a61)