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
中kubernetes
profile 一致;
9. 分发证书
将生成的证书和秘钥文件(后缀名为.pem
)拷贝到所有机器的 /etc/kubernetes/ssl
目录下。
1 | mkdir -p /etc/kubernetes/ssl |
参考文章:
赞赏一下