CKA [Installation] – Ubuntu 从0架设,生成Certificate Authority
为什么 Kubernetes 集群需要 CA / PKI(证书体系)
通信安全 + 身份验证需求
Kubernetes 是一种高度分布式系统:控制面组件(如 kube-apiserver、controller-manager、scheduler)、节点上的 kubelet、各类客户端(kubectl、controller、scheduler 等)彼此之间要互相通信。这些通信如果没有加密/认证,很容易被中间人攻击、被伪装、被窃听、被篡改。
因此几乎所有关键路径都用 TLS 加密,并通过证书来做身份验证。常见场景包括:
- kube-apiserver 作为服务器端,需要向客户端提供 TLS 证书,客户端(如 kubectl、controller)通过这个证书验证 apiserver 身份。
- 各个组件(controller、scheduler、kubelet 等)作为客户端,用证书作为客户端证书向 apiserver 认证自己身份。
- etcd 之间、etcd 客户端与 etcd 服务器之间也可能需要相互认证 + 加密。
- Aggregation API / extension servers / front-proxy 等也涉及证书链、信任边界。
为了让这些组件互相信任,就要有一个“根”信任来源 —— 即 CA。只要组件都信任这个 CA,那它签的证书就被认为是可靠的。
什么是 CA / PKI
CA(证书颁发机构)在 PKI(Public Key Infrastructure,公钥基础设施)体系中,是负责“签发证书”的机构。它拥有一对密钥(私钥 + 公钥/证书)。私钥用来对下级证书签名;公钥(或 CA 证书)被分发给信任它的各方。信任链就是:
组件 A(持有 CA 公钥)相信 “凡是由 CA 用私钥签名的证书” 就具备可信性,组件 A 可验证 B 给出的证书是由 CA 签发的,从而信任 B。
在 Kubernetes 中,这个 CA 通常被称为 root CA(根 CA)或 cluster CA。Kubernetes 的内置许多证书都是由这个 CA 来签发。
如果没有 CA,证书就必须全部自己签名(每个组件都自己签署自己的证书),那样缺乏集中信任点,也难以管理、更新、撤销。
CA 的职责 + 好处
- 签发证书:为 apiserver、kubelet、组件、客户端等生成证书。
- 验证 / 信任根:所有组件信任这个 CA,则信任它签发的证书。
- 证书生命周期管理:包括证书更新、撤销、续期等。
- 一旦某个证书或密钥被泄露,可以作撤销或更新处理。
- 分隔信任边界:有时 Kubernetes 会采用多个 CA(例如一个 CA 专门签发 etcd 证书,一个 CA 为 apiserver 和组件签发)以降低风险传播。
举个比喻:如果没有 CA,就像系统中每个人互相签名自己的“身份证明”,你要信任某个人的身份证就得自己判断;而有 CA 的话,大家只要信任那一家“发证机关”,就信那个机关签发的身份证就可以。这提供了统一的、可管理的信任基础。
Layman的解释方式
CA 是整个 Kubernetes 集群的「中央信任机构」,我们用 openssl
创建 CA 的 private key 和 public certificate。
每个组件(如 kubelet、apiserver 等)各自生成自己的 private key,然后生成 CSR,请 CA 用私钥给它签名,得到组件的证书。
各组件之间通信时,会互相查看对方的证书,并用 CA 的 public key 来验证是否是被 CA 签发的。
如果验证成功,就信任对方的身份,允许通信。
💡 打个比方:
- 每个组件就像是公司员工
- 它们去「HR 部门」(CA)领工卡
- 只要工卡上有 HR 的印章(签名),其他人就知道这是自己人
OpenSSL手动创建 Kubernetes 集群 CA(证书颁发机构) 的完整过程
✅ 第 1 步:创建用于存储证书的目录
mkdir /root/certificates
cd /root/certificates
🔍解释:
- 你需要一个专门的目录来保存你的 CA 私钥(
ca.key
)、CA 证书(ca.crt
),以及后续为其他组件签发的证书。 - 把所有证书操作放在一个目录里更容易管理,也更安全。
✅ 第 2 步:生成 CA 的私钥
openssl genrsa -out ca.key 2048
🔍解释:
genrsa
:生成一个 RSA 私钥-out ca.key
:输出保存为ca.key
2048
:密钥长度为 2048 位(安全性足够,常见)
🧠目的:
你现在拥有了 CA 的私钥(这是最高权限的密钥!)
谁掌握了这个私钥,就能签发你 Kubernetes 集群中所有的证书。必须严格保密!
✅ 第 3 步:用私钥生成 CSR(证书签名请求)
openssl req -new -key ca.key -subj "/CN=KUBERNETES-CA" -out ca.csr
🔍解释:
req -new
:创建新的 CSR(证书签名请求)-key ca.key
:用前面生成的私钥来签这个 CSR-subj "/CN=KUBERNETES-CA"
:这个证书的主题(Subject),CN = Common Name,写成 KUBERNETES-CA-out ca.csr
:生成的 CSR 文件
🧠目的:
你告诉 openssl:“我要申请一个 CA 的证书,这是我的身份信息(CN),这是我的私钥。
✅ 第 4 步:用 CA 自己签自己(自签证书)
openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt -days 1000
🔍解释:
x509
:生成一个证书-req -in ca.csr
:以 CSR 为输入(即刚刚生成的证书申请)-signkey ca.key
:用刚才生成的私钥来给这个证书签名(即“自签”)-out ca.crt
:输出的证书文件-days 1000
:证书有效期 1000 天
🧠目的:
你使用自己的私钥(ca.key
)签署自己的 CSR(ca.csr
),得到一个「自签名 CA 证书」:ca.crt
这是整个 Kubernetes TLS 信任系统的 根证书。
📌 通常只有根 CA 才会自签,其他组件都会找 CA 签名。
✅ 第 5 步:查看 CA 证书内容
openssl x509 -in ca.crt -text -noout
🔍解释:
-in ca.crt
:查看这个证书文件-text
:以可读形式展示证书内容-noout
:不输出 base64 编码内容,只输出解析内容
🧠目的:
检查 ca.crt
是否生成成功,以及它的内容(CN 是不是 KUBERNETES-CA
,有效期、使用目的等)。
✅ 第 6 步:删除中间文件 CSR
rm -f ca.csr
🔍解释:
- CSR 在这时已经没有用了(你已经签完了)
- 删除它是一种安全操作,也减少文件杂乱

Layman解释流程
一开始使用openssl生产了ca.key ( private key) , 然后使用ca.key 生产了ca.csr , 然后根据ca.csr 和 ca.key 自我签名生成了ca.crt 。 最后需要删除掉ca.csr , 就剩下了ca.key 和 ca.crt 。
ca.key 可以为其他的component (apiserver 等等)生成 apiserver.crt

如何验证apiserver.crt 是否是root ca签发的? 所以就使用来了ca.crt 和 apiserver.crt 做验证。
openssl verify -CAfile ca.crt apiserver.crt
如果验证通过就放行。