TLS BootStrapping 官方文檔:
https://kubernetes.io/docs/reference/command-line-tools-reference/kubelet-tls-bootstrapping/#initialization-process
一、kubelet啟動過程
- 查找kubeconfig文件,文件一般位於/etc/kubernetes/kubelet.kubeconfig
- 從kubeconfig文件中檢索APIServer的URL和證書
- 然后去和APIServer進行交互
1、查看kubelet.kubeconfig證書有效期:
首先對kubelet.kubeconfi的certificate-authority-data字段進行解密:
#
echo "LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSUQ0akNDQXNxZ0F3SUJBZ0lVVXdzUHFhWGxWVUdWb3lvYkZyZFpIRmZIQk04d0RRWUpLb1pJaHZjTkFRRUwKQlFBd2R6RUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKb
GFXcHBibWN4RURBT0JnTlZCQWNUQjBKbAphV3BwYm1jeEV6QVJCZ05WQkFvVENrdDFZbVZ5Ym1WMFpYTXhHakFZQmdOVkJBc1RFVXQxWW1WeWJtVjBaWE10CmJXRnVkV0ZzTVJNd0VRWURWUVFERXdwcmRXSmxjbTVsZEdWek1CNFhEVEl3TURrd05UQXlNVFF3TUZvWERUSTEKTU
Rrd05EQXlNVFF3TUZvd2R6RUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBTwpCZ05WQkFjVEIwSmxhV3BwYm1jeEV6QVJCZ05WQkFvVENrdDFZbVZ5Ym1WMFpYTXhHakFZQmdOVkJBc1RFVXQxClltVnlibVYwWlhNdGJXRnVkV0ZzTVJNd0VRWUR
WUVFERXdwcmRXSmxjbTVsZEdWek1JSUJJakFOQmdrcWhraUcKOXcwQkFRRUZBQU9DQVE4QU1JSUJDZ0tDQVFFQXUrV291WmpLS1RmUnMwbkY1NTdCUk8wVTlkSUVvRVlydEFHawp5aWZET0s5MGdNeDBRTzlhMGpJOXd0OFlNM284cmpGcmVjdWJ5Q1RzK1JSMTFmd0EvdGIwc0kr
U1NlRVVYVGo3ClFlaklVK1pBTzdzNGRvM2hveGYrbzBsS2tPbVIvTVZTa2NYUFl2ZzJhc0tGTnI0NkZCSVFZRkh4NzJCcGIreFMKVmViMWhqNTFXTVBmSkdZcW4vRWZYS3hlb3dvNEE5WXJHdXoxVDVGWVNtcjJWa3VIOXEwajRsRE9TbkQ4WnF0eQpDZW1HZVI5M1IraklmTkxCN
DZHZC9vVm9veEJYb0dPemlvUURLZDM1QllXaExvZzVmT2cyMko4ZmNrTEI0bk9wCnBjb24xZ01vOGtlS0xZSlBxTmp6ZGFuL0hNN1dtaElMb2JIUVF3V0NjK1hjTkxnaUxRSURBUUFCbzJZd1pEQU8KQmdOVkhROEJBZjhFQkFNQ0FRWXdFZ1lEVlIwVEFRSC9CQWd3QmdFQi93SU
JBakFkQmdOVkhRNEVGZ1FVN3NuYQoweGhZUU5wNDJ0ZzhmdGxjVVdiSlE3b3dId1lEVlIwakJCZ3dGb0FVN3NuYTB4aFlRTnA0MnRnOGZ0bGNVV2JKClE3b3dEUVlKS29aSWh2Y05BUUVMQlFBRGdnRUJBTEFGdUdiTmNoTGk4aFdWbURRUGlIR2E0Z2JzdG1NWjZ1eC8KVnNqVnF
IcnkrMXdXcm8rWDc1SDJ6QXV3d3RIMHFYUGhKZjRid2hWMTREb1k0eGpVYW9aTjF0ejU3VEpQUXczNApuT3lRa1VmOFhZcDJpK1BBczZ6ZUgrVUZjQUJqeGIrdFRuYlU0MENqakx6L2ZaRjJURkxscWtTUzVnOSttQnkrCkx1bkVGY1E5Z1hLaHFvbWJ5TkpNcytsY0hacFJ6YmF4
NE9oeTRZTU1qNENaQjNKZG9TUDR5dkRQMnZWNXZvbmcKcU0rUHl3SVl2TjhUN3hFeTIrbTZxWGNla3gyRmlVeFJDeTMyWkRGbGQrTDhFamdrelN2YVNpQ2thWjF6TlczRwpZWTBFWkhGcGM2S1lrdlJDWWVvMGRDRkwyVSsxckpEMFVWbGRKS0dnUEcyMjh2aUY5cTA9Ci0tLS0tR
U5EIENFUlRJRklDQVRFLS0tLS0K" | base64 --decode >/tmp/1
2、然后使用OpenSSL即可查看證書過期時間:
openssl x509 -in /tmp/1 -noout -dates
二、TLS Bootstrapping初始化流程
1、Kubelet啟動
2、Kubelet查看kubelet.kubeconfig文件,假設沒有這個文件
3、Kubelet會查看本地的bootstrap.kubeconfig
4、Kubelet讀取bootstrap.kubeconfig文件,檢索apiserver的url和一個token
5、Kubelet鏈接apiserver,使用這個token進行認證
- Apiserver會識別tokenid,apiserver會查看該tokenid對於的bootstrap的一個secret
- 找個這個secret中的一個字段,apiserver把這個token識別成一個username,名稱是system:bootstrap:
,屬於system:bootstrappers這個組,這個組具有申請csr的權限,該組的權限綁定在一個叫system:node-bootstrapper的clusterrole - clusterrole k8s集群級別的權限控制,它作用整個k8s集群
- clusterrolebinding 集群權限的綁定,它可以幫某個clusterrole綁定到一個用戶、組或者seviceaccount
- CSR:相當於一個申請表,可以拿着這個申請表去申請我們的證書。
6、經過上面的認證,kubelet就有了一個創建和檢索CSR的權限
7、Kubelet為自己創建一個CSR,名稱為kubernetes.io/kube-apiserver-client-kubelet
8、CSR被允許有兩種方式:
- K8s管理員使用kubectl手動的頒發證書
- 如果配置了相關權限,kube-controller-manager會自動同意。
- Controller-manager有一個CSRApprovingController。他會校驗kubelet發來的csr的username和group是否有創建csr的權限,而且還要驗證簽發着是否是kubernetes.io/kube-apiserver-client-kubelet
- 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、新的證書被同意或簽發,取決於我們的配置
- Kubelet創建的CSR是屬於一個O:system:nodes
- CN:system:nodes:主機名