配置对多集群的访问
本文展示如何使用配置文件来配置对多个集群的访问。在将集群、用户和上下文定义在一个或多个配置文件中之后,用户可以使用kubectlconfiguse-context命令快速地在集群之间进行切换。
说明:
用于配置集群访问的文件有时被称为kubeconfig文件。这是一种引用配置文件的通用方式,并不意味着存在一个名为
kubeconfig的文件。
警告:只使用来源可靠的kubeconfig文件。使用特制的kubeconfig文件可能会导致恶意代码执行或文件暴露。如果必须使用不受信任的kubeconfig文件,请首先像检查shell脚本一样仔细检查它。
在开始之前
你必须拥有一个Kubernetes的集群,同时你的Kubernetes集群必须带有kubectl命令行工具。建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。如果你还没有集群,你可以通过Minikube构建一个你自己的集群,或者你可以使用下面任意一个Kubernetes工具构建:
要检查kubectl是否安装,执行kubectlversion--client命令。kubectl的版本应该与集群的API服务器使用同一次版本号。
定义集群、用户和上下文
假设用户有两个集群,一个用于正式开发工作,一个用于其它临时用途(scratch)。在development集群中,前端开发者在名为frontend的名字空间下工作,存储开发者在名为storage的名字空间下工作。在scratch集群中,开发人员可能在默认名字空间下工作,也可能视情况创建附加的名字空间。访问开发集群需要通过证书进行认证。访问其它临时用途的集群需要通过用户名和密码进行认证。
创建名为config-exercise的目录。在config-exercise目录中,创建名为config-demo的文件,其内容为:
apiVersion: v1
kind: Config
preferences: {}
clusters:
- cluster:
name: development
- cluster:
name: scratch
users:
- name: developer
- name: experimenter
contexts:
- context:
name: dev-frontend
- context:
name: dev-storage
- context:
name: exp-scratch
配置文件描述了集群、用户名和上下文。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 scratch --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--kubeconfig=config-democonfigunsetusers.
要删除集群,可以运行
kubectl--kubeconfig=config-democonfigunsetclusters.
要删除上下文,可以运行
kubectl--kubeconfig=config-democonfigunsetcontexts.
将上下文详细信息添加到配置文件中:
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-scratch --cluster=scratch --namespace=default --user=experimenter
打开config-demo文件查看添加的详细信息。也可以使用configview命令进行查看:
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: scratch
contexts:
- context:
cluster: development
namespace: frontend
user: developer
name: dev-frontend
- context:
cluster: development
namespace: storage
user: developer
name: dev-storage
- context:
cluster: scratch
namespace: default
user: experimenter
name: exp-scratch
current-context: ""
kind: Config
preferences: {}
users:
- name: developer
user:
client-certificate: fake-cert-file
client-key: fake-key-file
- name: experimenter
user:
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-scratch:
kubectl config --kubeconfig=config-demo use-context exp-scratch
现在你发出的所有kubectl命令都将应用于scratch集群的默认名字空间。同时,命令会使用exp-scratch上下文中所列用户的凭证。
查看更新后的当前上下文exp-scratch相关的配置:
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"
WindowsPowerShell
$Env:KUBECONFIG_SAVED=$ENV:KUBECONFIG
KUBECONFIG环境变量是配置文件路径的列表,该列表在Linux和Mac中以冒号分隔,在Windows中以分号分隔。如果有KUBECONFIG环境变量,请熟悉列表中的配置文件。
临时添加两条路径到KUBECONFIG环境变量中。例如:
Linux
export KUBECONFIG="${KUBECONFIG}:config-demo:config-demo-2"
WindowsPowerShell
$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: scratch
namespace: default
user: experimenter
name: exp-scratch
探索$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"
WindowsPowershell
$Env:KUBECONFIG="$Env:KUBECONFIG;$HOME\.kube\config"
在配置练习目录中输入以下命令,查看当前KUBECONFIG环境变量中列举的所有文件合并后的配置信息:
kubectl config view
清理
将KUBECONFIG环境变量还原为原始值。例如:
Linux
export KUBECONFIG="$KUBECONFIG_SAVED"
WindowsPowerShell
$Env:KUBECONFIG=$ENV:KUBECONFIG_SAVED