二進位制部署1.23.4版本k8s叢集-3-部署架構及根證書籤發

itteer發表於2022-03-14

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。

相關文章