K8S 配置上下文介绍

2021-12-22 container k8s

通常在开发过程中需要维护多个集群,例如研发、测试、生产等,为了方便管理可以通过 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