二进制部署k8s集群v1.23.9版本-3-集群架构及根证书签发
3.1、集群架构
系统架构图如下:
本次部署使用了7台虚拟机,各主机功能分配如下:
- 192.168.1.197是DNS服务器,用作域名解析。
- 192.168.1.198/199两台是代理,分别是4层和7层代理。L7反代Ingress,L4反代Apiserver。2个节点上面跑一个VIP,其ip地址是192.168.1.196。
- 192.168.1.201/202/203三台部署K8S核心服务,Master节点和Node节点部署在一起,这三台主机即充当主控节点,又充当运算节点,还用来安装etcd集群,如果资源充分,主控节点和运算节点可以分开部署;
- 192.168.1.200作运维主机,主要功能上Docker资源仓库,K8S资源清单仓库,提供了K8S共享存储服务(NFS),还用来签发证书。etcd部署在201、202、203三台主机上。
3.2、集群网络规划
集群网络规划如下:
- 节点网络:192.168.1.0/24
- Pod网络:172.1.0.0/16
- Service网络:虚网络,地址为192.168.0.0/16
- 三台宿主机IP分别是:192.168.1.201、192.168.1.202和192.168.1.203
- 宿主机上Pod网络分别是:172.1.201.0/24、172.1.202.0/24和172.1.203.0/24
- Pod网络和宿主机网络对应关系:Pod网络的第三位和宿主机网络的最后一位对应。这样可以很方便的定位Pod在哪台宿主机上。
3.3、服务器部署信息
主机名 | IP | 用途 | 部署组件 |
---|---|---|---|
无 | 192.168.1.196 | VIP | 无 |
hfqg1-197 | 192.168.1.197 | DNS | Bind9 |
hfqg1-198 | 192.168.1.198 | 负责均衡(主) | nginx、keepalived |
hfqg1-199 | 192.168.1.199 | 负责均衡(从) | nginx、keepalived |
hfqg1-200 | 192.168.1.200 | 运维主机 | cfssl、harbor、NFS |
hfqg1-201 | 192.168.1.201 | master+node | Ingress、kubelet、kube-proxy、pod、etcd、apiserver、controller-manager、scheduler |
hfqg1-202 | 192.168.1.202 | master+node | Ingress、kubelet、kube-proxy、pod、etcd、apiserver、controller-manager、scheduler |
hfqg1-203 | 192.168.1.203 | master+node | Ingress、kubelet、kube-proxy、pod、etcd、apiserver、controller-manager、scheduler |
3.4、证书签发
- 证书签发环境部署在运维主机200上。
- 证书保存路径:/opt/certs
3.4.1、cfssl工具安装
- cfssl版本:1.6.1
- 安装路径:/usr/bin/
下载工具
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl_1.6.1_linux_amd64 -O /usr/bin/cfssl
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssljson_1.6.1_linux_amd64 -O /usr/bin/cfssl-json
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.1/cfssl-certinfo_1.6.1_linux_amd64 -O /usr/bin/cfssl-certinfo
chmod u+x /usr/bin/cfssl*
解释下:
- cfssl: 用于签发证书,输出json格式文本;
- cfssl-json: 将cfssl签发生成的证书(json格式)变成文件承载式文件;
- cfssl-certinfo: 验证查看证书信息。
3.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段来生成证书的相关信息
3.4.3、生成根证书
自签证书时,首先需要一个根证书,也叫CA证书。
创建生成CA证书签名请求(CSR)的JSON配置文件,文件路径及内容:
/opt/certs/cd-csr.json
[root@hfqg1-200 certs]# cat ca-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证书和私钥命令
cd /opt/certs
cfssl gencert -initca ca-csr.json | cfssl-json -bare ca
如下图所示:
生成的文件说明:
- ca.pem :CA根证书
- ca-key.pem:CA 根证书的私钥
至此,CA根证书及其私钥文件已经生成,可以用它们来签发其它证书了。
3.4.4、创建CA根证书策略文件
CA根证书策略文件,一般命名为ca-config.json,用于配置根证书的使用场景(profile)和具体参数(usage、过期时间、服务端认证、客户端认证、加密等),后续签名其它证书时需要指定特定场景(profile)。
[root@hfqg1-200 certs]# cat 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。
本文来自博客园,作者:霸都运维,转载请注明原文链接:https://www.cnblogs.com/wangjie20200529/p/16552298.html