本文介绍 kubectl 使用配置文件时优先级、配置文件格式、如何管理多个集群配置文件等。
kubectl 配置文件优先级
Kubectl 客户端的配置是以配置文件的方式保存在用户本地的,并且提供了多种调用配置文件的方式,不同方式之间也存在优先级关系。
1、用户使用 kubectl 时通过 --kubeconfig 选项直接指定要使用的配置文件位置具有最高优先级,使用示例如下所示:
[me@imzcy ~]$ kubectl get pods --kubeconfig=./test.conf
2、其次是读取 KUBECONFIG 变量的值(如果有设置)
[me@imzcy ~]$ echo $KUBECONFIG
[me@imzcy ~]$
[me@imzcy ~]$ export KUBECONFIG=/home/me/test.conf
3、最后是固定读取 ${HOME}/.kube/config 目录下配置文件
[me@imzcy ~]$ ls .kube/config
.kube/config
[me@imzcy ~]$
kubectl 配置文件格式
我们可以通过 kubectl config view 命令查看当前使用的配置文件内容,如果还未有过任何配置,则会输出如下内容:
[me@imzcy ~]$ kubectl config view
apiVersion: v1
clusters: null
contexts: null
current-context: ""
kind: Config
preferences: {}
users: null
[me@imzcy ~]$
示例配置文件
- apiVersion:由于 kubectl 是直接与 apiserver 进行通讯的,所以这里要明确指定使用的 api 版本,确保kubectl与API服务器之间的通信能够顺利进行。
- clusters:定义集群连接信息的列表。
- contexts:定义上下文信息的列表,每个上下文关联一个集群和一个用户,并可以设置默认使用的命名空间。
- current-context:当前使用的上下文(kubectl默认使用此上下文信息中指定的用户身份登入关联的k8s集群)。
- kind:当前资源类型。
- preferences:指定当前可选(和未使用)的 kubectl 首选项。
- users:定义用户认证信息的列表(包括用户名、密码或token,证书等)。
kubeconfig 用户认证信息
如下分别为使用证书、token、密码认证时的示例:
users:
- name: "100000888888"
user:
client-certificate-data: REDACTED
client-key-data: REDACTED
- name: test-user
user:
token: your-token
- name: cluster-admin
user:
password: your-password
username: admin
管理多个配置文件
只有一个用户管理单个 k8s 集群的时候,可以根据上面讲的 kubectl 读取配置文件优先级部分内容所述的最后一种方式,直接将拿到的配置文件移动到 ${HOME}/.kube/config 即可。
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
[me@imzcy ~]$
[me@imzcy ~]$ mkdir .kube
[me@imzcy ~]$ mv test.conf .kube/config
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
[me@imzcy ~]$
但是当我们需要管理多个k8s集群,就会拿到多个集群的配置文件,如果连接不同集群时怎么指定?通过 --kubeconfig 选项执行每个 kubectl 指令时调用不同配置文件肯定是太麻烦了。
此时最简单的方法是通过设置 KUBECONFIG 变量的方式(通过冒号分隔追加不同集群的配置文件):
[me@imzcy ~]$ export KUBECONFIG=/home/me/test.yaml:/home/me/config/local.yaml
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
test-user@test-cluster test-cluster test-user
[me@imzcy ~]$
也考虑将多个集群的配置文件合并到一个文件中:
[me@imzcy ~]$ export KUBECONFIG=/home/me/test.yaml:/home/me/config/local.yaml
[me@imzcy ~]$ kubectl config view --merge --flatten > merged-config
[me@imzcy ~]$ kubectl config get-contexts --kubeconfig=./merged-config
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
test-user@test-cluster test-cluster test-user
[me@imzcy ~]$
[me@imzcy ~]$ mv ./merged-config .kube/config
[me@imzcy ~]$ unset KUBECONFIG
需要注意的是,合并多个配置文件时,配置文件的用户认证信息中显示名(-name: 后面的值,具体可以查看上面认证信息示例)不能重复,否则合并时会只保留一个。如果显示名一样但是认证信息不一样相当于个别集群的认证信息就会被抹除了,切换到对应集群时因为认证信息匹配不上就会认证失败。所以合并前需要检查下配置文件,如果有显示名相同的,需要手动修改下为其他值。
常用命令
安装 kubectl
cat <<EOF > /etc/yum.repos.d/kubernetes.repo
[kubernetes]
name=Kubernetes
baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/
enabled=1
gpgcheck=1
repo_gpgcheck=1
gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg
EOF
[root@imzcy ~]# yum install kubectl -y
查看 kubectl 版本
[me@imzcy ~]$ kubectl version --client
Client Version: version.Info{Major:"1", Minor:"22", GitVersion:"v1.22.5", GitCommit:"5c99e2ac2ff9a3c549d9ca665e7bc05a3e18f07e", GitTreeState:"clean", BuildDate:"2021-12-16T08:38:33Z", GoVersion:"go1.16.12", Compiler:"gc", Platform:"linux/amd64"}
[me@imzcy ~]$
查看当前使用的配置文件中上下文信息
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
* cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
test-user@test-cluster test-cluster test-user
[me@imzcy ~]$
切换默认使用的上下文
[me@imzcy ~]$ kubectl config use-context test-user@test-cluster
Switched to context "test-user@test-cluster".
[me@imzcy ~]$
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
* test-user@test-cluster test-cluster test-user
[me@imzcy ~]$
修改当前上下文默认命名空间
[me@imzcy ~]$ kubectl config set-context --current --namespace=test
Context "test-user@test-cluster" modified.
[me@imzcy ~]$
[me@imzcy ~]$ kubectl config get-contexts
CURRENT NAME CLUSTER AUTHINFO NAMESPACE
cls-xxxxxx88-100000888888-context-default cls-xxxxxx88 100000888888 default
* test-user@test-cluster test-cluster test-user test
[me@imzcy ~]$
本文采用 知识共享署名4.0 国际许可协议进行许可。
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。
如果您的问题未解决,欢迎微信扫描右侧二维码与我联系。