|NO.Z.00069|——————————|^^ 部署 ^^|——|KuberNetes&二进制部署.V22|3台Server|——|TLS_Bootstrapping|自动颁发证书|
一、TLS Bootstrapping自动生成证书流程
### --- TLS Bootstrapping初始化流程:TLS初始化流程
~~~ # Kubelet启动
~~~ # Kubelet查看kubelet.kubeconfig文件,假设没有这个文件
~~~ # Kubelet会查看本地的bootstrap.kubeconfig
~~~ # Kubelet读取bootstrap.kubeconfig文件,检索apiserver的url和一个token
~~~ # Kubelet链接apiserver,使用这个token进行认证
~~~ Apiserver会识别tokenid,apiserver会查看该tokenid对于的bootstrap的一个secret
~~~ # 经过上面的认证,kubelet就有了一个创建和检索CSR的权限
~~~ # Kubelet为自己创建一个CSR,名称为kubernetes.io/kube-apiserver-client-kubelet
~~~ # CSR被允许有两种方式:
~~~ K8s管理员使用kubectl手动的颁发证书
~~~ 如果配置了相关权限,kube-controller-manager会自动同意。
~~~ Controller-manager有一个CSRApprovingController。他会校验kubelet发来的csr的username和group是否有创建csr的权限,而且还要验证签发着是否是kubernetes.io/kube-apiserver-client-kubelet
~~~ Controller-manager同意CSR请求
~~~ # CSR被同意后,controller-manager创建kubelet的证书文件
~~~ # Controller-manager将证书更新至csr的status字段
~~~ # Kubelet从apiserver获取证书
~~~ # Kubelet从获取到的key和证书文件创建kubelet.kubeconfig
~~~ # Kubelet启动完成并正常工作
~~~ # 可选:如果配置了自动续期,kubelet会在证书文件过期的时候利用之前的kubeconfig文件去申请一个新的证书,相当于续约。
~~~ # 新的证书被同意或签发,取决于我们的配置
~~~ Kubelet创建的CSR是属于一个O:system:nodes
~~~ CN:system:nodes:主机名
二、查找秘钥配置
### --- 查找秘钥
~~~ 注:c8ad9c:Token 2e4d610cf3e7426e:Token认证,相当于秘钥
[root@k8s-master01 kubernetes]# more /etc/kubernetes/bootstrap-kubelet.kubeconfig
token: c8ad9c.2e4d610cf3e7426e
### --- 秘钥针对的secret
~~~ 注:会找到这个secret
[root@k8s-master01 kubernetes]# kubectl get secret -n kube-system
bootstrap-token-c8ad9c bootstrap.kubernetes.io/token
### --- 查看加密的secret的token-id
~~~ 注:查看它的token-id也是bash64加密的
[root@k8s-master01 kubernetes]# kubectl get secret -n bootstrap-token-c8ad9c -n kube-system -oyaml |grep token-id
token-id: YzhhZDlj
### --- 查看加密的token-secret
[root@k8s-master01 kubernetes]# kubectl get secret -n bootstrap-token-c8ad9c -n kube-system -oyaml |grep token-secret
token-secret: MmU0ZDYxMGNmM2U3NDI2ZQ==
### --- 使用base64解密token-id
~~~ 注:使用base64解密加密的token-id
[root@k8s-master01 kubernetes]# echo "YzhhZDlj" | base64 -d
c8ad9c
### --- 使用base64解密token-secret
~~~ 注:使用base64解密加密的token-secret
[root@k8s-master01 kubernetes]# echo "MmU0ZDYxMGNmM2U3NDI2ZQ==" | base64 -d
2e4d610cf3e7426e
### --- 配置注释
~~~ 注:找个这个secret中的一个字段,apiserver把这个token识别成一个username,名称是system:bootstrap:<token-id>,属于system:bootstrappers这个组,这个组具有申请csr的权限,该组的权限绑定在一个叫system:node-bootstrapper的clusterrole
~~~ 注:clusterrole k8s集群级别的权限控制,它作用整个k8s集群
~~~ 注:clusterrolebinding 集群权限的绑定,它可以帮某个clusterrole绑定到一个用户、组或者seviceaccount
~~~ 注:CSR:相当于一个申请表,可以拿着这个申请表去申请我们的证书。
三、解密token-id
### --- 查看secret的token-id
~~~ 注:此刻可以理解为Token-id就相当于一个用户名,而这个用户就属于这个组名
[root@k8s-master01 kubernetes]# kubectl get secret -n kube-system bootstrap-token-c8ad9c -n kube-system -oyaml |grep auth-extra-groups
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6ZGVmYXVsdC1ub2RlLXRva2VuLHN5c3RlbTpib290c3RyYXBwZXJzOndvcmtlcixzeXN0ZW06Ym9vdHN0cmFwcGVyczppbmdyZXNz
### --- 通过base64解密token-id
[root@k8s-master01 kubernetes]# echo "c3lzdGVtOmJvb3RzdHJhcHBlcnM6ZGVmYXVsdC1ub2RlLXRva2VuLHN5c3RlbTpib290c3RyYXBwZXJzOndvcmtlcixzeXN0ZW06Ym9vdHN0cmFwcGVyczppbmdyZXNz" | base64 -d
system:bootstrappers:default-node-token,system:bootstrappers:worker,system:bootstrappers:ingress //system:bootstrappers:组,上面的token-id可以理解为属于这个组。具有csr的权限。
四、查看csr权限
### --- 查看创建的ClusterRole
[root@k8s-master01 ~]# kubectl get clusterrole
system:node-bootstrapper 2021-04-09T13:52:18Z
### --- 查看ClusterRole.yaml配置文件
~~~ 定义了一个csr的权限。
[root@k8s-master01 ~]# kubectl get clusterrole system:node-bootstrapper -oyaml
resources:
- certificatesigningrequests
verbs:
- create
- get
- list
- watch
[root@k8s-master01 ~]# kubectl get clusterrolebinding kubelet-bootstrap -oyaml
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:node-bootstrapper // 这个ClusterRoleBinding把这个 system:node-bootstrapper的ClusterRole//绑定到system:bootstrappers:default-node-toke组上面
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:bootstrappers:default-node-token // 这个ClusterRoleBinding把这个 system:node-bootstrapper的ClusterRole//绑定到system:bootstrappers:default-node-toke组上面
### --- 查看auth-extra-groups
[root@k8s-master01 ~]# kubectl get secret -n kube-system bootstrap-token-c8ad9c -n kube-system -oyaml
auth-extra-groups: c3lzdGVtOmJvb3RzdHJhcHBlcnM6ZGVmYXVsdC1ub2RlLXRva2VuLHN5c3RlbTpib290c3RyYXBwZXJzOndvcmtlcixzeXN0ZW06Ym9vdHN0cmFwcGVyczppbmdyZXNz
### --- 通过base64解密auth-extra-groups
~~~ 注:经过上面的认证,kubelet就有了一个创建和检索CSR的权限
~~~ 注:Kubelet为自己创建一个CSR,名称为kubernetes.io/kube-apiserver-client-kubelet
~~~ 注:CSR被允许有两种方式:
~~~ 注:K8s管理员使用kubectl手动的颁发证书
~~~ 注:如果配置了相关权限,kube-controller-manager会自动同意。
~~~ 注:Controller-manager有一个CSRApprovingController。他会校验kubelet发来的csr的username和group是否有创建csr的权限,而且还要验证签发着是否是kubernetes.io/kube-apiserver-client-kubelet
~~~ 注:Controller-manager同意CSR请求
[root@k8s-master01 ~]# echo "c3lzdGVtOmJvb3RzdHJhcHBlcnM6ZGVmYXVsdC1ub2RlLXRva2VuLHN5c3RlbTpib290c3RyYXBwZXJzOndvcmtlcixzeXN0ZW06Ym9vdHN0cmFwcGVyczppbmdyZXNz" | base64 -d //这个组正好和上述组对应上。
system:bootstrappers:default-node-token,system:bootstrappers:worker,system:bootstrappers:ingress
五、查看ClusterRoleBinding绑定过程
### --- 查看ClusterRoleBinding.yaml配置文件
[root@k8s-master01 ~]# kubectl get clusterrolebinding node-autoapprove-bootstrap -oyaml
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:nodeclient // ClusterRole绑定到system:bootstrappers:default-node-token组上面
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:bootstrappers:default-node-token // ClusterRole绑定到system:bootstrappers:default-node-token组上面
### --- 绑定到组上面
~~~ 注:CSR被同意后,controller-manager创建kubelet的证书文件
~~~ 注:Controller-manager将证书更新至csr的status字段
~~~ 注:Kubelet从apiserver获取证书
~~~ 注:Kubelet从获取到的key和证书文件创建kubelet.kubeconfig
~~~ 注:Kubelet启动完成并正常工作
~~~ 注:可选:如果配置了自动续期,kubelet会在证书文件过期的时候利用之前的kubeconfig文件去申请一个新的证书,相当于续约。
~~~ 注:新的证书被同意或签发,取决于我们的配置
~~~ 注:Kubelet创建的CSR是属于一个O:system:nodes
~~~ 注:CN:system:nodes:主机名
[root@k8s-master01 ~]# kubectl get clusterrole system:certificates.k8s.io:certificatesigningrequests:nodeclient -oyaml
resources:
- certificatesigningrequests/nodeclient
verbs:
- create // 有一个create权限。
六、查看绑定权限
### --- 查看clusterrolebinding.yaml配置参数
[root@k8s-master01 ~]# kubectl get clusterrolebinding node-autoapprove-certificate-rotation -oyaml
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:certificates.k8s.io:certificatesigningrequests:selfnodeclient // 它绑定的clusterro是system:certificates.k8s.io:certificatesigningrequests:selfnodeclient
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes
subjects:
- apiGroup: rbac.authorization.k8s.io
kind: Group
name: system:nodes // system:certificates.k8s.io:certificatesigningrequests:selfnodeclient绑定到这个system:nodes组上面
### --- 查看绑定权限
~~~ 注:CSR是看不到,因为是自动申请的。刚申请的时候是会有csr的,但是会自动删除。
~~~ 若是kubeadm会查看到的。
[root@k8s-master01 ~]# kubectl get clusterrole system:certificates.k8s.io:certificatesigningrequests:selfnodeclient -oyaml
rules:
- apiGroups:
- certificates.k8s.io
resources:
- certificatesigningrequests/selfnodeclient // 它绑定的权限是:selfnodeclient,可以自动帮我们续期的权限。
verbs:
- create
七、手动为kubelet颁发证书
### --- 手动为kubelet颁发证书的步骤
~~~ 注:显示都是和主机名相关的。所以说每台主机的csr是不一样的,所以手动颁发比较繁琐。所以使用TLS BootStrapping
[root@k8s-master01 ~]# cat k8s-ha-install/pki/kubelet-csr.json
{
"CN": "system:node:$NODE",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"L": "Beijing",
"ST": "Beijing",
"O": "system:nodes",
"OU": "Kubernetes-manual"
}
]
}
### --- controller-manager默认轮询开启证书颁发的参数是打开的
[root@k8s-master01 ~]# kube-controller-manager -h | grep RotateKubeletServerCertificate
RotateKubeletServerCertificate=true|false (BETA - default=true)
### --- 查看kubelet.conf配置文件
[root@k8s-master01 ~]# cat /etc/kubernetes/kubelet-conf.yml
rotateServerCertificates: true
Walter Savage Landor:strove with none,for none was worth my strife.Nature I loved and, next to Nature, Art:I warm'd both hands before the fire of life.It sinks, and I am ready to depart
——W.S.Landor
浙公网安备 33010602011771号