2

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

 2 years ago
source link: https://www.cnblogs.com/wgh2008/p/16003083.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK