1. 证书分类
-
服务器证书:server cert,用于客户端验证服务端的身份。
-
客户端证书:client cert,用于服务端验证客户端的身份。
-
对等证书:peer cert(既是
server cert又是client cert),用户成员之间的身份验证,例如 etcd。
1.1. k8s集群的证书分类
etcd节点:需要标识自己服务的server cert,也需要client cert与etcd集群其他节点交互,因此需要一个对等证书。master节点:需要标识 apiserver服务的server cert,也需要client cert连接etcd集群,也需要一个对等证书。kubelet:需要标识自己服务的server cert,也需要client cert请求apiserver,也使用一个对等证书。kubectl、kube-proxy、calico:需要client证书。
2. CA证书及秘钥
目录:/etc/kubernetes/ssl
| 分类 | 证书/秘钥 | 说明 | 组件 |
|---|---|---|---|
| ca | ca-key.pem | ||
| ca.pem | |||
| ca.csr | |||
| Kubernetes | kubernetes-key.pem | ||
| kubernetes.pem | |||
| kubernetes.csr | |||
| Admin | admin-key.pem | ||
| admin.pem | |||
| admin.csr | |||
| Kubelet | kubelet.crt | ||
| kubelet.key |
配置文件
| 分类 | 证书/秘钥 | 说明 |
|---|---|---|
| ca | ca-config.json | |
| ca-csr.json | ||
| Kubernetes | kubernetes-csr.json | |
| Admin | admin-csr.json | |
| Kube-proxy | kube-proxy-csr.json |
3. cfssl工具
安装cfssl:
1 | # 下载cfssl |
4. 创建 CA (Certificate Authority)
4.1. 配置源文件
创建 CA 配置文件
ca-config.json
1 | cat << EOF > ca-config.json |
参数说明
ca-config.json:可以定义多个 profiles,分别指定不同的过期时间、使用场景等参数;后续在签名证书时使用某个 profile;signing:表示该证书可用于签名其它证书;生成的 ca.pem 证书中CA=TRUE;server auth:表示client可以用该 CA 对server提供的证书进行验证;client auth:表示server可以用该CA对client提供的证书进行验证;
创建 CA 证书签名请求
ca-csr.json
1 | cat << EOF > ca-csr.json |
参数说明
ca-csr.json的参数
- CN:
Common Name,kube-apiserver 从证书中提取该字段作为请求的用户名 (User Name);浏览器使用该字段验证网站是否合法;
names中的字段:
- C : country,国家
- ST: state,州或省份
- L:location,城市
- O:organization,组织,kube-apiserver 从证书中提取该字段作为请求用户所属的组 (Group)
- OU:organization unit
4.2. 执行命令
1 | cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
输出如下:
1 | # cfssl gencert -initca ca-csr.json | cfssljson -bare ca |
生成以下文件:
1 | # 生成文件 |
5. 创建 kubernetes 证书
5.1. 配置源文件
创建 kubernetes 证书签名请求文件kubernetes-csr.json。
1 | cat << EOF > kubernetes-csr.json |
参数说明:
MASTER_IP:master节点的IP或域名MASTER_CLUSTER_IP:kube-apiserver指定的service-cluster-ip-range网段的第一个IP,例如(10.254.0.1)。
5.2. 执行命令
1 | $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes |
输出如下:
1 | # cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kubernetes-csr.json | cfssljson -bare kubernetes |
生成以下文件:
1 | # 生成文件 |
6. 创建 admin 证书
6.1. 配置源文件
创建 admin 证书签名请求文件 admin-csr.json:
1 | cat << EOF > admin-csr.json |
6.2. 执行命令
1 | $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin |
输出如下:
1 | # cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes admin-csr.json | cfssljson -bare admin |
生成文件
1 | # 生成文件 |
7. 创建 kube-proxy 证书
7.1. 配置源文件
创建 kube-proxy 证书签名请求文件 kube-proxy-csr.json:
1 | cat << EOF > kube-proxy-csr.json |
7.2. 执行命令
1 | $ cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy |
输出如下:
1 | # cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=kubernetes kube-proxy-csr.json | cfssljson -bare kube-proxy |
生成文件:
1 | # 生成文件 |
8. 校验证书
1 | openssl x509 -noout -text -in kubernetes.pem |
输出如下:
1 | # openssl x509 -noout -text -in kubernetes.pem |
字段说明:
- 确认
Issuer字段的内容和ca-csr.json一致; - 确认
Subject字段的内容和kubernetes-csr.json一致; - 确认
X509v3 Subject Alternative Name字段的内容和kubernetes-csr.json一致; - 确认
X509v3 Key Usage、Extended Key Usage字段的内容和ca-config.json中kubernetesprofile 一致;
9. 分发证书
将生成的证书和秘钥文件(后缀名为.pem)拷贝到所有机器的 /etc/kubernetes/ssl 目录下。
1 | mkdir -p /etc/kubernetes/ssl |
参考文章:
赞赏一下
支付宝打赏
微信打赏