1、系统架构

系统架构图如下:

二进制部署1.23.4版本k8s集群-3-部署架构及根证书签发-LMLPHP

本次部署使用了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、系统资源

系统资源如下图:

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所在目录添加到系统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"
    }
}

说明:

生成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根证书及其私钥文件已经生成,可以用它们来签发其它证书了。

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。

03-14 11:47