本文记录一次老集群(二进制部署集群)证书更换,以及通过 kubernetes 的认证方式来了解更换证书的步骤,以及一次模拟老集群的更换步骤。

本文使用证书生成工具为 “kubernetes-generator” [1] 专用于 k8s 二进制部署生成证书和安装包的工具。

Kubernetes认证方式

为了了解证书更换需要做那些步骤,所以必须了解 k8s 的认证方式,这样才能更好的在更换证书时对集群上部署的业务系统的影响降低到最低。

X509 证书

kube-apiserver 的启动参数 --client-ca-file,可以使用客户端办法机构,英文代号就是熟悉的 “CA” (Certificate authority),当这个证书传递后,可以验证 kube-apiserver 用于验证向 kube-apiserver 提供的客户端证书,这里包含 k8s 中提供的用户种类的两种:

  • 用户名:对应证书的 CN (Common Name)
  • 用户组:对应证书的O (organization),用于对一个用户组进行授权,例如 “system:masters” 表示一个组 [1],允许不受限制地访问 kube-apiserver

静态token

kube-apiserver 的启动参数 --token-auth-file,是以文件提供给 kube-apiserver,该 Token 会长期有效,并且如果不重启服务 Token 是不会更新。

令牌文件的定义必须符合 [a-z0-9]{6}\.[a-z0-9]{16} 的格式,以 “.” 分割,第一部分是 “Token ID”; 第二部分是“令牌秘密(Token Secret” ;其后是这个用户的 Group,Group 可以包含多个,如果包含多个,则对应的列必须用双引号括起来。

bash
1
2
token,user,uid,group
token,user,uid,"group1,group2,group3"

例如

bash
1
123456.1234567890abcdef,dev,1,system:masters
note
system:masters 除非有必要,否则,应避免向该组分发证书。该组用户无法通过 ClusterRole 和 clusterRoleBinding 来控制权限,即使删除了所有集群角色,或者从来就没有分配过集群角色。该组的用户,仍然可以直接请求 kube-apiserver 执行任何操作。

使用时可以这样传入

bash
1
2
curl -k -X GET https://<k8s-apiserver>:6443/api/v1/nodes \
-H "Authorization: Bearer 3c9984.b947d02c14fe0a7f"

Bootstrap Tokens

Bootstrap Tokens 和 “静态Token”是属于相同类型,并存在于kube-system 名称空间中 Secret

实验 - 证书更换

构建 kubernetes 1.16.10 实验环境

Reference