Kubernetes实战指南:使用CFSSL创建PKI证书体系详解
前言
在构建Kubernetes集群时,安全是首要考虑因素。本文将详细介绍如何使用CFSSL工具为Kubernetes集群创建完整的PKI(公钥基础设施)证书体系。这是Kubernetes集群安全通信的基础,也是集群各组件相互认证的关键。
什么是PKI和CFSSL
PKI(Public Key Infrastructure)是一套创建、管理、分发、使用、存储和撤销数字证书的体系结构。在Kubernetes中,PKI用于确保集群各组件间的安全通信。
CFSSL是一款PKI/TLS工具,它提供了简单易用的命令行工具来生成和管理证书。相比OpenSSL,CFSSL更加现代化,配置更简单。
准备工作
在开始之前,请确保:
- 已安装CFSSL工具
- 了解基本的证书概念(CA、证书、私钥等)
- 规划好Kubernetes集群的节点IP和主机名
创建CA证书
CA(Certificate Authority)证书是整个PKI体系的根证书,所有其他证书都由它签发。
1. 创建CA配置文件
首先创建CA的配置文件ca-config.json
:
{
"signing": {
"default": {
"expiry": "8760h" // 证书有效期1年
},
"profiles": {
"kubernetes": {
"usages": ["signing", "key encipherment", "server auth", "client auth"],
"expiry": "8760h"
}
}
}
}
这个配置文件定义了:
- 默认证书有效期
- 专门为Kubernetes定制的证书profile
- 证书的用途(签名、密钥加密、服务器认证、客户端认证)
2. 创建CA证书签名请求(CSR)
接下来创建CA的CSR文件ca-csr.json
:
{
"CN": "Kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "CA",
"ST": "Oregon"
}
]
}
这个文件定义了:
- 通用名称(CN):Kubernetes
- 密钥算法:RSA 2048位
- 组织信息
3. 生成CA证书和私钥
执行以下命令生成CA证书和私钥:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
这将生成两个关键文件:
ca-key.pem
:CA的私钥,必须严格保密ca.pem
:CA的根证书,将分发给所有节点
创建各类组件证书
有了CA后,我们可以为Kubernetes各组件创建证书。
1. Admin管理员证书
管理员证书用于集群管理操作:
cat > admin-csr.json <<EOF
{
"CN": "admin",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:masters",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
admin-csr.json | cfssljson -bare admin
关键点:
O: system:masters
:赋予管理员最高权限- 生成
admin-key.pem
和admin.pem
2. Kubelet证书
Kubelet证书需要遵循Node Authorizer的要求:
for instance in worker-0 worker-1 worker-2; do
cat > ${instance}-csr.json <<EOF
{
"CN": "system:node:${instance}",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:nodes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=${instance},${EXTERNAL_IP},${INTERNAL_IP} \
-profile=kubernetes \
${instance}-csr.json | cfssljson -bare ${instance}
done
关键点:
CN: system:node:<nodeName>
:符合Node Authorizer要求O: system:nodes
:加入nodes组- 包含节点的主机名和IP地址
3. 控制平面组件证书
控制平面组件包括:
- kube-controller-manager
- kube-scheduler
- kube-proxy
它们的证书创建方式类似,以kube-controller-manager为例:
cat > kube-controller-manager-csr.json <<EOF
{
"CN": "system:kube-controller-manager",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "system:kube-controller-manager",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
kube-controller-manager-csr.json | cfssljson -bare kube-controller-manager
4. Kubernetes API Server证书
API Server证书是最复杂的,需要包含所有可能的访问地址:
cat > kubernetes-csr.json <<EOF
{
"CN": "kubernetes",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-hostname=10.32.0.1,10.240.0.10,10.240.0.11,10.240.0.12,${KUBERNETES_PUBLIC_ADDRESS},127.0.0.1,${KUBERNETES_HOSTNAMES} \
-profile=kubernetes \
kubernetes-csr.json | cfssljson -bare kubernetes
关键点:
- 包含Service Cluster IP(通常是10.32.0.1)
- 包含所有控制节点的IP
- 包含公共IP
- 包含本地回环地址
- 包含Kubernetes服务DNS名称
5. Service Account证书
Service Account用于Pod身份认证:
cat > service-account-csr.json <<EOF
{
"CN": "service-accounts",
"key": {
"algo": "rsa",
"size": 2048
},
"names": [
{
"C": "US",
"L": "Portland",
"O": "Kubernetes",
"OU": "Kubernetes The Hard Way",
"ST": "Oregon"
}
]
}
EOF
cfssl gencert \
-ca=ca.pem \
-ca-key=ca-key.pem \
-config=ca-config.json \
-profile=kubernetes \
service-account-csr.json | cfssljson -bare service-account
分发证书
创建完所有证书后,需要将它们分发到对应节点:
# 分发到工作节点
for instance in worker-0 worker-1 worker-2; do
scp ca.pem ${instance}-key.pem ${instance}.pem ${instance}:~/
done
# 分发到控制节点
for instance in controller-0 controller-1 controller-2; do
scp ca.pem ca-key.pem kubernetes-key.pem kubernetes.pem \
service-account-key.pem service-account.pem ${instance}:~/
done
安全建议
- CA私钥(
ca-key.pem
)必须严格保护,最好存储在离线环境中 - 定期轮换证书(虽然我们设置了1年有效期)
- 使用RBAC严格控制证书权限
- 考虑使用证书管理工具(如Vault)进行自动化管理
总结
通过本文,我们完成了Kubernetes集群PKI体系的建立,包括:
- 创建根CA证书
- 为各组件创建专用证书
- 为管理员创建管理证书
- 为Kubelet创建符合Node Authorizer要求的证书
- 为Service Account创建证书
- 将证书分发到各节点
这为Kubernetes集群建立了完整的安全通信基础,下一步将基于这些证书配置Kubernetes各组件。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考