1、系統架構
系統架構圖如下:
本次部署使用了5臺虛擬機器,各主機功能分配如下:
2臺是代理,分別是4層和7層代理。L7反代Ingress,L4反代Apiserver。還用來安裝DNS服務以及etcd。2個節點上面跑一個VIP,其ip地址是10.211.55.10。
2臺部署K8S核心服務,Master節點和Node節點部署在一起,這兩臺主機即充當主控節點,又充當運算節點,如果資源充分,主控節點和運算節點可以分開部署;
1臺作運維主機,主要功能上Docker資源倉庫,K8S資源清單倉庫,提供了K8S共享儲存服務(NFS),還用來簽發證書。etcd部署在12、21、22三臺主機上
2、叢集網路規劃
叢集三條網路規劃如下:
節點網路:10.211.55.0/24
Pod網路:172.7.0.0/16
Service網路:虛網路,地址為192.168.0.0/16
兩臺宿主機IP分別是:10.211.55.21和10.211.55.22
宿主機上Pod網路分別是:172.7.21.0/24和172.7.22.0/24
Pod網路和宿主機網路對應關係:Pod網路的第三位和宿主機網路的最後一位對應。這樣可以很方便的定位Pod在哪臺宿主機上。
3、系統資源
系統資源如下圖:
主機名 | IP | 伺服器型別 | 環境配置 |
---|---|---|---|
10.211.55.10 | VIP | 無 | |
CFZX55-11 | 10.211.55.11 | 負載均衡(主) | Bind、Nginx、Keepalived |
CFZX55-12 | 10.211.55.12 | 負載均衡(從) | etcd、Nginx、Keepalived |
CFZX55-21 | 10.211.55.21 | Master+Node | Ingress、kubelet、kube-proxy、pod、etcd、apiserver、controller-manager、scheduler |
CFZX55-22 | 10.211.55.22 | Master+Node | Ingress、kubelet、kube-proxy、pod、etcd、apiserver、controller-manager、scheduler |
CFZX55-200 | 10.211.55.200 | 運維主機 | cfssl、harbor、NFS |
4、證書籤發環境
證書籤發環境部署在運維主機200上。
證書儲存路徑:/opt/certs
4.1 安裝cfssl工具
cfssl版本:1.6.1
安裝路徑:/opt/cfssl
[root@cfzx55-200 cfssl]# pwd
/opt/cfssl
[root@cfzx55-200 cfssl]# ll
-rwxr-xr-x 1 root root 16659824 Mar 12 15:52 cfssl
-rwxr-xr-x 1 root root 13502544 Mar 12 15:52 cfssl-certinfo
-rwxr-xr-x 1 root root 11029744 Mar 12 15:52 cfssl-json
[root@cfzx55-200 cfssl]# cfssl version
Version: 1.6.1
Runtime: go1.12.12
[root@cfzx55-200 cfssl]#
- cfssl: 用於簽發證書,輸出json格式文字;
- cfssl-json: 將cfssl簽發生成的證書(json格式)變成檔案承載式檔案;
- cfssl-certinfo: 驗證檢視證書資訊。
cfssl所在目錄新增到系統PATH環境變數
[root@hdss7-200 ~]# vim /etc/profile
export PATH=$PATH:/opt/cfssl
[root@hdss7-200 ~]# source /etc/profile
[root@hdss7-200 ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/opt/cfssl
4.2 cfssl工具使用說明
cfssl工具的子命令包括:
- genkey: 生成一個key(私鑰)和CSR(證書籤名請求)
- certinfo: 輸出給定證書的證書資訊
- gencert: 生成新的key(金鑰)和簽名證書,該命令的引數如下:
- -initca:初始化一個新ca,生成根CA時需要。
- -ca:指明ca的證書(ca.pem)
- -ca-key:指明ca的私鑰檔案(ca-key.pem)
- -config:指明證書請求csr的json檔案(ca-config.json)
- -profile:與-config中的profile對應,是指根據config中的profile段來生成證書的相關資訊
4.3 生成根證書
自簽證書時,首先需要一個根證書,也叫CA證書。
建立生成CA證書籤名請求(CSR)的JSON配置檔案,檔案路徑及內容:
/opt/certs/cd-csr.json
{
"CN": "kubernetes",
"hosts": [
],
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "CN",
"ST": "beijing",
"L": "beijing",
"O": "k8s",
"OU": "system"
}
],
"ca": {
"expiry": "175200h"
}
}
說明:
CN:Common Name,一般寫域名。kube-apiserver從證書中提取該欄位作為請求的使用者名稱(User Name)。瀏覽器使用該欄位驗證網站是否合法。
hosts:網路請求url中合法的主機名或域名。
key:金鑰資訊,其內容一般也比較固定就是:{"algo":"rsa”,"size":2048},表示使用的加密演算法rsa,密文長度2048。
names:證書對外公開顯示的資訊,常見的有:
C:Country,所在國家簡稱
ST:State,所在州/省份簡稱
L:Locality,所在地區/城市簡稱
O:Organization Name,組織名稱或公司名稱,kube-apiserver從證書中提取該欄位作為請求使用者所屬的組(Group)
OU:Organization Unit Name,組織單位名稱或公司部門
expiry:過期時間,175200h表示有效期20年。
生成CA證書和私鑰命令
[root@cfzx55-200 certs]# cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
2022/03/12 16:21:32 [INFO] generating a new CA key and certificate from CSR
2022/03/12 16:21:32 [INFO] generate received request
2022/03/12 16:21:32 [INFO] received CSR
2022/03/12 16:21:32 [INFO] generating key: rsa-2048
2022/03/12 16:21:32 [INFO] encoded CSR
2022/03/12 16:21:32 [INFO] signed certificate with serial number 122333134122661078506271870600245516429626531350
[root@cfzx55-200 certs]# ll
total 16
-rw-r--r-- 1 root root 333 Mar 12 16:20 ca-csr.json
-rw------- 1 root root 1679 Mar 12 16:21 ca-key.pem
-rw-r--r-- 1 root root 1045 Mar 12 16:21 ca.csr
-rw-r--r-- 1 root root 1310 Mar 12 16:21 ca.pem
[root@cfzx55-200 certs]#
生成的檔案:
ca.pem :CA根證書
ca-key.pem:CA 根證書的私鑰
至此,CA根證書及其私鑰檔案已經生成,可以用它們來簽發其它證書了。
4.4 建立CA根證書策略檔案
CA根證書策略檔案,一般命名為ca-config.json,用於配置根證書的使用場景(profile)和具體引數(usage、過期時間、服務端認證、客戶端認證、加密等),後續簽名其它證書時需要指定特定場景(profile)
/opt/certs/ca-config.json
{
"signing": {
"default": {
"expiry": "175200h"
},
"profiles": {
"server": {
"expiry": "175200h",
"usages": [
"signing",
"key encipherment",
"server auth"
]
},
"client": {
"expiry":"175200h",
"usages": [
"signing",
"key enchiperment",
"client auth"
]
},
"kubernetes": {
"expiry":"175200h",
"usages": [
"signing",
"key enchiperment",
"server auth",
"client auth"
]
},
"peer": {
"expiry": "175200h",
"usages": [
"signing",
"key enchiperment",
"server auth",
"client auth"
]
}
}
}
}
-
profile:指定證書使用場景,後續簽名生成證書及其私鑰時需要指定場景名稱
- server auth:表示 client 可以用該該證書對 server 提供的證書進行驗證。
- client auth:表示 server 可以用該該證書對 client 提供的證書進行驗證。
-
signing:表示該證書可用於簽名其它證書,生成的ca.pem證書中CA=TRUE
檔案中定義了多個profile,可以根據情況使用。
- server:服務端使用,客戶端以此驗證服務端身份。
- client:客戶端使用,用於服務端認證客戶端。
- peer/kubernetes:雙向證書,通訊雙方都需要證書,用於叢集成員間通訊。
後續簽發證書時,需要指定檔名(ca-config.json)以及使用的profile,本例中,為了簡化操作,全部使用kubernetes。