通常在开发过程中需要维护多个集群,例如研发、测试、生产等,为了方便管理可以通过 kubeconfig 维护集群、用户、命名空间、身份认证相关的信息,用来快速切换访问的集群。
简介
K8S 通过 kubeconfig 维护了与集群、用户、命名空间、身份认证相关的信息,然后 kubectl
命令行工具使用该配置文件来查找选择集群所需的信息,并与集群的 API 服务器进行通信。
默认会使用 $HOME/.kube/config
文件,也可以通过 KUBECONFIG
环境变量或者 --kubeconfig
参数指定。
首先明确几个概念:
- Cluster 单独部署的 K8S 集群,包括了各种相关进程,例如 APIServer、ETCD 等等,一般配置需要指定 APIServer 地址信息。
- User 需要以什么用户登录,与用户认证方式有关,例如用户名+密码、TLS Certificate、Token 等等。
- Namespace 也就是在 Cluster 中进一步的隔离。
通过上述方式基本就决定了某个资源的归属,例如 Pods、PV 等等,所以,也将上述的内容称为 Context 。
apiVersion: v1
kind: Config
clusters:
- name: scratch
cluster:
insecure-skip-tls-verify: true
server: http://192.168.56.107:8080
contexts:
- name: default
context:
user: kubelet
cluster: scratch
current-context: default
使用 kubectl
命令时,可以通过 --cluster
和 --context
参数指定,每个上下文包含了 cluster、namespace 和 user 三个参数。
可以方便在集群、命名空间中快速切换,配置的优先级为命令行参数、环境变量、默认配置文件。
证书配置
K8S 在各种地方使用了大量的证书,包括在安装、启动等过程中会大量使用,其中集群的各个组件之间进行网络通讯,为了防止三方恶意伪造身份、窃取信息或者对系统进行攻击,会对双方的身份进行验证,这样就需要数字证书进行验证。
除此之外,还可以用于 APIServer 的鉴权,如下是一个 Kind 集群的配置。
apiVersion: v1
kind: Config
preferences: {}
clusters: # 相关的集群信息
- cluster:
name: kind-kind
server: https://127.0.0.1:39945
certificate-authority-data: ... ... # 对应APIServer服务器CA根证书信息,对应client-ca-file参数指定文件
users:
- name: kind-kind
user:
client-certificate-data: ... ... # 访问APIServer的客户端证书信息,同样通过client-ca-file进行签发
client-key-data: ... ... # 客户端证书对应的私钥,用来解密APIServer返回的信息
contexts:
- context: # 会绑定上述的集群、用户信息
name: kind-kind
cluster: kind-kind
user: kind-kind
current-context: kind-kind
在 Config 文件中的证书信息都是通过 Base64 编码的,可以通过 echo 'xxx' | base64 --decode
或者 base64 --decode ca.crt
解码,其中鉴权的关键是 client-certificate-data
中的证书内容,可以通过如下命令验证和查看。
----- 客户端证书中包含了Subject信息,会作为上下文信息进行鉴权
$ openssl verify -CAfile ca.crt client.crt
client.crt: OK
$ openssl x509 -in client.crt -text -noout
Certificate:
Data:
Version: 3 (0x2)
Serial Number: 6929646968824590742 (0x602b0d340ba6f196)
Signature Algorithm: sha256WithRSAEncryption
Issuer: CN = kubernetes
Validity
Not Before: Aug 28 11:17:51 2023 GMT
Not After : Aug 27 11:17:53 2024 GMT
Subject: O = system:masters, CN = kubernetes-admin
Subject Public Key Info:
Public Key Algorithm: rsaEncryption
... ...
会先通过 Issuer
Not After
Subject
等参数验证证书的合法性,其中关键是 Subject.O
主体信息,对应了 group:user
信息,一般是 system:masters
主体,然后在 APIServer 中会根据关联的角色等信息判断是否有权限。
可以通过如下命令查看绑定的权限。
kubectl get clusterrolebinding cluster-admin -o yaml
常用命令
----- 创建、切换、查看上下文
kubectl config set-context prod --namespace=production --cluster=XXX --user=YYY
kubectl config use-context prod
kubectl config current-context
----- 查看配置信息
kubectl config view