k8s学习记录,bootstraping原理(三)
文章中资料参考来源2022 云原生Kubernetes全栈架构师
当工作节点启动时,kubelet会做以下这些事 :
1、在文件夹中寻找kubeconfig文件. 通常是在/etc/kubenetes/目录下
2、在文件中检索 api server的地址和认证信息
3、通过检索到的证书和url地址连接api server,通信
通信成功,master节点就会把node当作一个可用的节点,分配pods到工作节点上
1、kubelet启动
2、kubelet查找目录下没有kubelet.kubeconfig文件
3、kubelet查找目录下的bootstrap-kubelet.kubeconfig文件
4、kubelet读取bootstrap-kubelet.kubeconfig文件,检索出api server的url地址和token值
5、kubelet连接api server,使用token进行认证
master节点中存的secret,解析后的token yaml文件中有加密后的值,bootstrap就是根据这个来进行匹配认证
api server会把这个token识别成一个username,system:bootstrap:,属于system:bootstrappers这个组,这个组具有申请csr的权限,该组的权限绑定在一个叫system:node-bootstrapper的clusterrole上
clusterrole:k8s集群级别的权限控制,作用于整个k8s集群
cluserrolebinding: 集群权限的绑定,它可以把某个clusterrole绑定到一个用户、组或者servicecount上
kubelet有权限创建CSR,创建之后,拿着CSR去找API Server申请一个证书;controller-manager就会给颁发一个证书
6、经过上面的认证,kubelet就有了创建和检索CSR的权限
7、kubelet给它自己创建了一个CSR,名称为:kubernetes.io/kube-apiserver-client-kubelet
8、CSR允许有两种方式:
a、k8s管理员使用kubectl手动颁发证书
b、如果配置了相关权限,kube-controller-manager会自动同意CSR
1)kube-controller-manager有一个CSRApprovingController,会校验kubelet发来的CSR的 username和group是否有创建CSR的权限,而且还要验证签发者是否是:kubernetes.io/kube-apiserver-client-kubelet 】
2)controller-manager同意CSR请求
9、CSR被同意后,controller-manager创建kubelet的证书
10、controller-manager将证书更新至CSR的status字段
11、kubelet从apiserver获取证书
12、kubelet从获取到的key和证书文件创建kubelet.kubeconfig
13、kubelet启动完成并正常工作
14、可选项:如果配置了自动续期,kubelet会在证书文件过期的时候利用之前的kubeconfig文件去申请一个新的证书,续约。
15、新申请的证书被同意后签发,取决于配置文件,可手动或自动
a、kubelet创建的CSR是属于一个 O: system:nodes
b、CN:system:nodes:主机名
Kubelet配置自动创建证书
Kube-controller-manager配置
To enable the kubelet to request and receive a new certificate, create a ClusterRoleBinding that binds the group in which the bootstrapping node is a member system:bootstrappers to the ClusterRole that grants it permission, system:certificates.k8s.io:certificatesigningrequests:nodeclient:
允许kubelet请求和接收新的证书
To enable the kubelet to renew its own client certificate, create a ClusterRoleBinding that binds the group in which the fully functioning node is a member system:nodes to the ClusterRole that grants it permission, system:certificates.k8s.io:certificatesigningrequests:selfnodeclient:
允许kubelet新颁发自己的客户端证书
生成token的命令
head -c 16 /dev/urandom | od -An -t x | tr -d ' '