|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

 

 

posted on 2022-03-29 13:39  yanqi_vip  阅读(54)  评论(0)    收藏  举报

导航