深入了解kubectl之配置文件(kubeconfig)详解

- 云计算

2023-12-20T14:31:49.png

本文介绍 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 ~]$


示例配置文件

2023-12-20T14:43:06.png

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 ~]$