提示:文章实验安装etcd采用openssl安装
文章目录
- 前言
-
- etcd是什么?
- [🔧 etcd 的核心特点](#🔧 etcd 的核心特点)
-
- [✔ 1. 强一致性(Strong Consistency)](#✔ 1. 强一致性(Strong Consistency))
- [✔ 2. 高可用(High Availability)](#✔ 2. 高可用(High Availability))
- [✔ 3. Watch(实时监听机制)](#✔ 3. Watch(实时监听机制))
- [✔ 4. 版本化数据存储(MVCC)](#✔ 4. 版本化数据存储(MVCC))
- [一、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(单 master + 三节点 etcd)说明:](#一、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(单 master + 三节点 etcd)说明:)
-
- [🔹 好处(优点)](#🔹 好处(优点))
- [❗ 坏处(缺点 / 注意点)](#❗ 坏处(缺点 / 注意点))
- [🔹 Kubernetes:单 Master + 外接 etcd 适用场景(仅场景 + 建议)](#🔹 Kubernetes:单 Master + 外接 etcd 适用场景(仅场景 + 建议))
- [二、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(多 master + 三节点 etcd)说明:](#二、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(多 master + 三节点 etcd)说明:)
-
- [🔹 好处(优点)](#🔹 好处(优点))
-
- 2.1、控制平面高可用(HA)
- [2.2、etcd 三节点高可用存储](#2.2、etcd 三节点高可用存储)
- [2.3. Master 负载分摊](#2.3. Master 负载分摊)
- [2.4、etcd 与控制平面解耦](#2.4、etcd 与控制平面解耦)
- 2.5、方便扩展
- [❗ 坏处(缺点 / 注意点)](#❗ 坏处(缺点 / 注意点))
-
- 2.1、部署复杂度更高
- 2.2、证书更多,容易出问题
- 2.3、网络依赖更强
- 2.4、运维难度更高
- [2.5. 成本更高](#2.5. 成本更高)
- [🔹 Kubernetes:多 Master + 外接 etcd 适用场景(仅场景 + 建议)](#🔹 Kubernetes:多 Master + 外接 etcd 适用场景(仅场景 + 建议))
- [三、💡 总结](#三、💡 总结)
- 四、环境需求
- 五、安装ETCD(以下步骤etcd01、etcd02、etcd03三台机器同时安装)
- 六、以下在172.17.48.187执行安装
-
- [6.1、准备目录并生成 CA](#6.1、准备目录并生成 CA)
- [6.2、在172.17.48.187上为 etcd01 (172.17.48.187) 生成](#6.2、在172.17.48.187上为 etcd01 (172.17.48.187) 生成)
- [6.3、在172.17.48.187上为 etcd02 (172.17.48.175) 生成](#6.3、在172.17.48.187上为 etcd02 (172.17.48.175) 生成)
- [6.4、在172.17.48.187上为 etcd03 (172.17.48.65) 生成](#6.4、在172.17.48.187上为 etcd03 (172.17.48.65) 生成)
- [6.5、在 etcd01:把对应文件分发到各节点](#6.5、在 etcd01:把对应文件分发到各节点)
- 6.6、在每台节点上设置权限(在各自节点执行)
- 6.7、在每台节点上验证证书(在对应节点执行)
- [6.8、etcd设置systemd 启动单元](#6.8、etcd设置systemd 启动单元)
- [七、在每台节点启动 etcd(在各自节点执行)](#七、在每台节点启动 etcd(在各自节点执行))
- 八、查看集群状态
- 九、数据写入测试
-
- [9.1、数据写入(hello etcd),在172.17.48.187节点执行](#9.1、数据写入(hello etcd),在172.17.48.187节点执行)
- [9.2、数据输出(hello etcd),172.17.48.175节点执行](#9.2、数据输出(hello etcd),172.17.48.175节点执行)
- 十、模拟主节点宕机查看etcd会不会重新选举主节点(172.17.48.187上操作)
- 十一、apiserver-etcd-client-openssl证书
- 十二、安装k8s
- 十三、扩展知识
- 十四、总结
前言
etcd是什么?
etcd 是一个分布式、强一致性的键值数据库(Key-Value Store),由 CoreOS 开发,现属于 CNCF。它的设计目标是:可靠地存储集群的关键数据,并确保多节点之间数据强一致。在 Kubernetes 中,etcd 是整个集群的大脑。所有集群状态都存放在 etcd 里。
🔧 etcd 的核心特点
✔ 1. 强一致性(Strong Consistency)
通过 Raft 共识算法 保证写入必须获得多数节点确认。
即使部分节点宕机,数据依然不会乱。
✔ 2. 高可用(High Availability)
通过 多节点集群(通常 3 或 5 节点)保证:
任意一个节点挂了,集群仍然可读可写。
多数节点正常即可维持服务。
✔ 3. Watch(实时监听机制)
客户端可以订阅某个 key 的变化。
Kubernetes 大量依赖这个机制来实时同步资源变化。
✔ 4. 版本化数据存储(MVCC)
每次写都会生成新的版本(revision),可用来:
快照(snapshot)
回滚
Debug 数据变更记录
一、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(单 master + 三节点 etcd)说明:
🔹 好处(优点)
1.1、高可用性与独立性
- 外部 etcd 可以独立部署在多台节点上,即使 master 节点宕机,etcd 数据仍然可用。
- 可以对 etcd 集群做独立扩容或升级,不影响 Kubernetes 控制平面。
1.2、数据安全与隔离
- etcd 是 Kubernetes 的核心数据库,存储了集群状态。独立部署可以避免 master 进程异常导致数据库损坏。
- 对于大规模集群,etcd 独立部署便于做备份、快照和灾备。
1.3、灵活的备份与恢复
- 可以单独管理 etcd 的快照和恢复策略。
- 在大集群中,如果内置 etcd 出问题,恢复起来会更麻烦。
1.4、资源隔离
- etcd 会消耗大量内存和 I/O,独立部署可以避免与 kube-apiserver、controller-manager 等控制平面组件争用资源。
- 对于生产环境或大规模集群,性能更可控。
1.5、版本独立升级
- 外接 etcd 可以独立于 Kubernetes 升级或降级。
- 避免 master 升级时因为内置 etcd 导致数据库升级风险。
❗ 坏处(缺点 / 注意点)
1.1、部署复杂
- 外部 etcd 需要额外部署三台或更多节点,并且保证网络互通。
- 每个 master 都需要访问外部 etcd,证书、权限、网络都要配置正确。
1.2、运维成本增加
- 需要单独维护 etcd 集群:备份、监控、证书更新、节点扩容、灾备等。
- 对于小型集群或测试环境,可能显得麻烦。
1.3、网络依赖
- master 与 etcd 节点必须网络畅通,延迟过高可能影响控制平面响应。
- 如果网络不稳定,可能导致 kube-apiserver 访问 etcd 超时。
1.4、证书管理复杂
- 每台 master 都需要外接 etcd 的 CA、客户端证书和私钥。
- 证书到期或丢失需要手动更新,否则 kube-apiserver 无法访问 etcd。
1.5、额外单点
- 虽然 etcd 集群本身可以高可用,但如果配置错误或节点不足,外接 etcd 仍可能成为集群的单点故障。
🔹 Kubernetes:单 Master + 外接 etcd 适用场景(仅场景 + 建议)
| 场景 | 建议 |
|---|---|
| 小型生产环境,控制平面需要更高稳定性 | 单 Master + 外接 etcd,3 节点 etcd 集群,保证数据安全和稳定性 |
| 节点规模不大(10~30 Nodes),对 etcd 性能有要求 | 单 Master + 外接 etcd,提高 etcd 性能,避免写入瓶颈 |
| 控制平面偶尔需要单独维护或备份 etcd | 外接 etcd 独立运维,便于证书管理和备份 |
| 关键业务或敏感数据环境 | 单 Master + 外接 etcd,可单独管理 etcd 生命周期,增强安全性 |
| 单 Master 环境下需要保证 etcd 高可用 | 外接 3~5 节点 etcd 集群,保证 etcd 节点故障时仍可服务 |
| 测试或开发环境,但希望模拟生产场景 | 单 Master + 外接 etcd,可练习独立 etcd 管理和备份策略 |
二、下面详细分析一下 Kubernetes 外接(External)etcd 集群的优缺点,并结合你的场景(多 master + 三节点 etcd)说明:
🔹 好处(优点)
2.1、控制平面高可用(HA)
- 至少 2 个 master 存活,集群仍能正常工作。
- 单 master 宕机不会影响 APIServer 的访问。
👉 比单 master 安全得多,不会因为一台机器宕机导致集群瘫痪。
2.2、etcd 三节点高可用存储
etcd 使用 Raft 协议,3 节点可容忍 1 个节点挂掉。
保证集群数据(Pod 状态、节点信息、配置)可靠一致。
👉 高可用存储是 K8s 正常运行的核心价值。
2.3. Master 负载分摊
多个 kube-apiserver 节点可以分摊请求量,更稳定。
特别适合:
- 大规模节点
- 大规模控制器创建资源
- 高频 API 调用的自动化平台
2.4、etcd 与控制平面解耦
- etcd 单独部署 → 性能更稳定。
- 升级、备份、恢复更灵活。
- etcd 不与 apiserver 抢 CPU / IOPS。
👉 对"生产稳定性"有非常大帮助。
2.5、方便扩展
轻松新增 master,提高冗余。
可以扩展 etcd 到 5 节点保证更强的容灾能力。
对运维团队更友好。
❗ 坏处(缺点 / 注意点)
2.1、部署复杂度更高
需要同时管理:
- 多 master 组件(apiserver、scheduler、controller-manager)
- 外部 etcd 证书
- etcd 集群网络
- kube-vip/keepalived 或 LB 负载均衡
👉相比单 master 复杂不少。
2.2、证书更多,容易出问题
每个 kube-apiserver 访问 etcd 都需要:
- ca.pem
- apiserver-etcd-client.pem
- apiserver-etcd-client-key.pem
👉证书到期或路径错误 → API Server 直接起不来,控制平面瘫痪。
2.3、网络依赖更强
- APIServer → etcd 必须低延迟 & 稳定
- etcd 节点之间也需要低延迟
网络质量差可能导致: - etcd 选举频繁
- kube-apiserver 慢或无法处理请求
2.4、运维难度更高
你必须考虑:
- etcd 备份策略(快照、备份 S3/OSS)
- etcd 恢复流程
- master 节点健康检查
- LB 高可用设计(如 keepalived / HAProxy)
👉比单 master 明显更重。
2.5. 成本更高
需要:
- ≥2 台 master
- ≥3 台 etcd
至少要 5 台高性能机器。
👉对资源成本比单 master 高很多。
🔹 Kubernetes:多 Master + 外接 etcd 适用场景(仅场景 + 建议)
| 场景 | 建议 |
|---|---|
| 小型测试集群(1 Master, 2~3 Nodes) | 无需多 Master,使用单 Master + 内置 etcd 即可 |
| 中小型生产环境(1 Master 可接受短暂不可用) | 建议多 Master,至少 3 个 Master 提升可用性 |
| 控制平面不允许单点故障 | 使用多 Master,提高 API Server、Scheduler、Controller 的高可用性 |
| 集群节点规模较大(30+ Nodes) | 建议部署多 Master,避免调度与 API Server 压力偏高 |
| 大规模集群(100+ Nodes) | 必须部署多 Master,防止控制平面性能瓶颈 |
| 关键业务(金融、电商、政务) | 强烈建议多 Master,确保 SLA 与系统稳定性 |
| 跨机房 / 多可用区部署 | 必需多 Master,避免单机房故障导致集群不可用 |
| 需要确保升级期间保持可用 | 多 Master 支持滚动升级控制平面 |
| 能容忍短暂不可用的开发测试环境 | 不需要多 Master,单 Master 成本低、维护简单 |
三、💡 总结
- 外接 etcd = 高可用、高安全、独立管理,但部署和运维复杂。
- 内置 etcd = 简单、快速,但不适合大规模或生产环境。
| 类型 | 适用场景 | 优点 | 缺点 / 注意事项 | 运维建议 |
|---|---|---|---|---|
| 单 Master + 外接 etcd | 小型生产环境、节点规模较小(<30 Nodes)、控制平面偶尔需要备份或维护 | - 单 Master 架构简单,运维成本低 - 外接 etcd 可保证数据安全和独立管理 - 可单独备份和扩展 etcd 集群 | - 单 Master 整体控制平面不可用时,集群 API 不可访问 - 对控制平面负载和高可用性有限 | - 建议 etcd 集群至少 3 节点 - 定期备份 etcd - 配置证书管理和访问控制 |
| 多 Master + 外接 etcd | 大规模集群(>30 Nodes)、生产环境、关键业务、跨机房部署、需要高可用控制平面 | - 控制平面高可用,支持单 Master 故障 - 外接 etcd 提升数据安全和性能 - 支持滚动升级控制平面 | - 架构复杂,运维成本高 - 需要负载均衡器或 DNS 配置 - 证书和访问控制管理更复杂 | - 建议 Master 节点 3~5 个 - 外接 etcd 节点 3~5 个 - 配置负载均衡和高可用网络 - 制定升级和备份策略 |
提示:以下是本篇文章正文内容,下面案例可供参考
注意:一定要注意etcd版本和k8s版本的对应
四、环境需求
| 公网IP | 内网IP | 服务 | 名称 |
|---|---|---|---|
| 81.69.231.164 | 172.17.48.187 | etcd-v3.5.16-linux-amd64 | etcd01 |
| 124.222.178.231 | 172.17.48.175 | etcd-v3.5.16-linux-amd64 | etcd02 |
| 101.43.28.196 | 172.17.48.65 | etcd-v3.5.16-linux-amd64 | etcd03 |
| 110.40.190.220 | 172.17.48.119 | kubelet-1.27.3、kubeadm-1.27.3、kubectl-1.27.3 | master |
| 150.158.135.99 | 172.17.48.70 | kubelet-1.27.3、kubeadm-1.27.3、kubectl-1.27.3 | node1 |
| 150.158.187.170 | 172.17.48.214 | kubelet-1.27.3、kubeadm-1.27.3、kubectl-1.27.3 | node2 |
五、安装ETCD(以下步骤etcd01、etcd02、etcd03三台机器同时安装)
5.1、使用二进制方式部署etcd
- 参考官方文档:https://github.com/etcd-io/etcd/releases
- etcd 软件包下载地址:https://github.com/etcd-io/etcd/releases/download/v3.5.16/etcd-v3.5.16-linux-amd64.tar.gz
5.2、修改服务器名称
bash
hostnamectl set-hostname etcd01
hostnamectl set-hostname etcd02
hostnamectl set-hostname etcd03
5.3、上传压缩包至服务器解压并安装()
bash
mkdir -p /etc/etcd/ssl
tar zxvf etcd-v3.5.16-linux-amd64.tar.gz
cd etcd-v3.5.16-linux-amd64/
mv etcd etcdctl /usr/local/bin/
5.4、添加hosts
bash
cat >> /etc/hosts << EOF
172.17.48.187 etcd01
172.17.48.175 etcd02
172.17.48.65 etcd03
EOF
六、以下在172.17.48.187执行安装
6.1、准备目录并生成 CA
bash
# 在 etcd01 执行
cd /etc/etcd/ssl
# 生成 CA 私钥(***仅在 etcd01 ***)
openssl genrsa -out ca-key.pem 4096
# 生成 CA 根证书(仅在 etcd01 )
# 如果想换成100年将3650换成36500即可
openssl req -x509 -new -nodes -key ca-key.pem \
-days 3650 -out ca.pem -subj "/CN=etcd-CA"
6.2、在172.17.48.187上为 etcd01 (172.17.48.187) 生成
为每个节点生成私钥 + CSR,然后在 172.17.48.187用 CA 签名
bash
## 1、生成 openssl 配置(包含 SAN)
cat > etcd01-openssl.cnf <<EOF
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = etcd01
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = etcd01
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 172.17.48.187
EOF
## 2、生成私钥(在 etcd01)
openssl genrsa -out etcd01-key.pem 4096
## 3、生成 CSR(在 etcd01)
openssl req -new -key etcd01-key.pem -out etcd01.csr -config etcd01-openssl.cnf
## 4、使用 CA 在 NODE1 上签发证书(在 etcd01)
## 注意如果想使用100年证书,将下面365改成36500即可
openssl x509 -req -in etcd01.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out etcd01.pem -days 365 \
-extensions req_ext -extfile etcd01-openssl.cnf
6.3、在172.17.48.187上为 etcd02 (172.17.48.175) 生成
bash
cat > etcd02-openssl.cnf <<EOF
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = etcd02
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = etcd02
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 172.17.48.175
EOF
openssl genrsa -out etcd02-key.pem 4096
openssl req -new -key etcd02-key.pem -out etcd02.csr -config etcd02-openssl.cnf
# 在 etcd01 使用 CA 签发(必须在 etcd01 执行)
## 注意如果想使用100年证书,将下面365改成36500即可
openssl x509 -req -in etcd02.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out etcd02.pem -days 365 \
-extensions req_ext -extfile etcd02-openssl.cnf
6.4、在172.17.48.187上为 etcd03 (172.17.48.65) 生成
bash
cat > etcd03-openssl.cnf <<EOF
[ req ]
default_bits = 4096
prompt = no
default_md = sha256
req_extensions = req_ext
distinguished_name = dn
[ dn ]
CN = etcd03
[ req_ext ]
subjectAltName = @alt_names
[ alt_names ]
DNS.1 = etcd03
DNS.2 = localhost
IP.1 = 127.0.0.1
IP.2 = 172.17.48.65
EOF
openssl genrsa -out etcd03-key.pem 4096
openssl req -new -key etcd03-key.pem -out etcd03.csr -config etcd03-openssl.cnf
# 在 etcd01使用 CA 签发(必须在 etcd01执行)
## 注意如果想使用100年证书,将下面365改成36500即可
openssl x509 -req -in etcd03.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out etcd03.pem -days 365 \
-extensions req_ext -extfile etcd03-openssl.cnf
6.5、在 etcd01:把对应文件分发到各节点
注意:不要分发 ca-key.pem
注意:在 etcd01 执行以下 scp(如果用 root 以外的用户,把 root@ 换掉)
bash
# 把 etcd01 的证书放到 NODE1(其实本地已就位,无需复制,但为了保证权限,可以再次写出)
chmod 700 /etc/etcd/ssl
# etcd01 的文件已在 NODE1 /etc/etcd/ssl: ca.pem etcd01.pem etcd01-key.pem
# 把 etcd02 的证书复制到 NODE2
scp /etc/etcd/ssl/ca.pem /etc/etcd/ssl/etcd02.pem /etc/etcd/ssl/etcd02-key.pem root@172.17.48.175:/etc/etcd/ssl/
# 把 etcd03 的证书复制到 NODE3
scp /etc/etcd/ssl/ca.pem /etc/etcd/ssl/etcd03.pem /etc/etcd/ssl/etcd03-key.pem root@172.17.48.65:/etc/etcd/ssl/
6.6、在每台节点上设置权限(在各自节点执行)
bash
# 在各自节点执行(etcd01、etcd02、etcd03 都要)
chmod 600 /etc/etcd/ssl/*-key.pem
chmod 644 /etc/etcd/ssl/*.pem
chown root:root /etc/etcd/ssl/*.pem /etc/etcd/ssl/*-key.pem
6.7、在每台节点上验证证书(在对应节点执行)
bash
# 在 etcd01 执行
openssl x509 -in /etc/etcd/ssl/etcd01.pem -noout -text | grep -A5 "Subject Alternative Name"
# 在 etcd02 执行
openssl x509 -in /etc/etcd/ssl/etcd02.pem -noout -text | grep -A5 "Subject Alternative Name"
# 在 etcd03 执行
openssl x509 -in /etc/etcd/ssl/etcd03.pem -noout -text | grep -A5 "Subject Alternative Name"
6.8、etcd设置systemd 启动单元
源码安装假设 /usr/local/bin/etcd)
下面我给出 3 个节点的 etcd.service 示例文件,把对应 --name、--listen-client-urls、--listen-peer-urls、证书路径改为你环境即可。把每个文件放在对应节点的 /etc/systemd/system/etcd.service。
bash
## 三台节点同时安装
mkdir -p /var/lib/etcd
6.8.1、在172.17.48.187上设置
etcd01 (/etc/systemd/system/etcd.service) --- 在 etcd01 上写入(把 name、IP、证书换成 etcd01)
bash
[Unit]
Description=etcd
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name etcd01 \
--data-dir /var/lib/etcd \
--listen-client-urls https://172.17.48.187:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://172.17.48.187:2379 \
--listen-peer-urls https://172.17.48.187:2380 \
--initial-advertise-peer-urls https://172.17.48.187:2380 \
--initial-cluster "etcd01=https://172.17.48.187:2380,etcd02=https://172.17.48.175:2380,etcd03=https://172.17.48.65:2380" \
--initial-cluster-state new \
--initial-cluster-token etcd-cluster-1 \
--cert-file=/etc/etcd/ssl/etcd01.pem \
--key-file=/etc/etcd/ssl/etcd01-key.pem \
--trusted-ca-file=/etc/etcd/ssl/ca.pem \
--client-cert-auth=true \
--peer-cert-file=/etc/etcd/ssl/etcd01.pem \
--peer-key-file=/etc/etcd/ssl/etcd01-key.pem \
--peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
--peer-client-cert-auth=true
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
6.8.2、在172.17.48.175上设置
etcd02 (/etc/systemd/system/etcd.service) --- 在 etcd02 上写入(把 name、IP、证书换成 etcd02)
bash
[Unit]
Description=etcd
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name etcd02 \
--data-dir /var/lib/etcd \
--listen-client-urls https://172.17.48.175:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://172.17.48.175:2379 \
--listen-peer-urls https://172.17.48.175:2380 \
--initial-advertise-peer-urls https://172.17.48.175:2380 \
--initial-cluster "etcd01=https://172.17.48.187:2380,etcd02=https://172.17.48.175:2380,etcd03=https://172.17.48.65:2380" \
--initial-cluster-state new \
--initial-cluster-token etcd-cluster-1 \
--cert-file=/etc/etcd/ssl/etcd02.pem \
--key-file=/etc/etcd/ssl/etcd02-key.pem \
--trusted-ca-file=/etc/etcd/ssl/ca.pem \
--client-cert-auth=true \
--peer-cert-file=/etc/etcd/ssl/etcd02.pem \
--peer-key-file=/etc/etcd/ssl/etcd02-key.pem \
--peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
--peer-client-cert-auth=true
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
6.8.3、在172.17.48.65上设置
etcd03 (/etc/systemd/system/etcd.service) --- 在 etcd03 上写入(把 name、IP、证书换成 etcd03)
bash
[Unit]
Description=etcd
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name etcd03 \
--data-dir /var/lib/etcd \
--listen-client-urls https://172.17.48.65:2379,https://127.0.0.1:2379 \
--advertise-client-urls https://172.17.48.65:2379 \
--listen-peer-urls https://172.17.48.65:2380 \
--initial-advertise-peer-urls https://172.17.48.65:2380 \
--initial-cluster "etcd01=https://172.17.48.187:2380,etcd02=https://172.17.48.175:2380,etcd03=https://172.17.48.65:2380" \
--initial-cluster-state new \
--initial-cluster-token etcd-cluster-1 \
--cert-file=/etc/etcd/ssl/etcd03.pem \
--key-file=/etc/etcd/ssl/etcd03-key.pem \
--trusted-ca-file=/etc/etcd/ssl/ca.pem \
--client-cert-auth=true \
--peer-cert-file=/etc/etcd/ssl/etcd03.pem \
--peer-key-file=/etc/etcd/ssl/etcd03-key.pem \
--peer-trusted-ca-file=/etc/etcd/ssl/ca.pem \
--peer-client-cert-auth=true
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
七、在每台节点启动 etcd(在各自节点执行)
bash
systemctl daemon-reload
systemctl enable etcd
systemctl start etcd
systemctl status etcd -l
八、查看集群状态
8.1、Leader、版本、DB大小
bash
[root@etcd01 ssl]# ETCDCTL_API=3 etcdctl --endpoints=https://172.17.48.187:2379,https://172.17.48.175:2379,https://172.17.48.65:2379 \
--cacert=/etc/etcd/ssl/ca.pem \
--cert=/etc/etcd/ssl/etcd01.pem \
--key=/etc/etcd/ssl/etcd01-key.pem \
endpoint status --write-out=table

九、数据写入测试
9.1、数据写入(hello etcd),在172.17.48.187节点执行
bash
ETCDCTL_API=3 etcdctl --endpoints=https://172.17.48.72:2379 \
--cacert=/etc/etcd/ssl/ca.pem \
--cert=/etc/etcd/ssl/etcd01.pem \
--key=/etc/etcd/ssl/etcd01-key.pem \
put mykey "hello etcd"

9.2、数据输出(hello etcd),172.17.48.175节点执行
bash
ETCDCTL_API=3 etcdctl --endpoints=https://172.17.48.175:2379 \
--cacert=/etc/etcd/ssl/ca.pem \
--cert=/etc/etcd/ssl/etcd02.pem \
--key=/etc/etcd/ssl/etcd02-key.pem \
get mykey

十、模拟主节点宕机查看etcd会不会重新选举主节点(172.17.48.187上操作)
bash
[root@etcd01 ssl]# systemctl stop etcd
[root@etcd01 ssl]# ETCDCTL_API=3 etcdctl --endpoints=https://172.17.48.187:2379,https://172.17.48.175:2379,https://172.17.48.65:2379 --cacert=/etc/etcd/ssl/ca.pem --cert=/etc/etcd/ssl/etcd01.pem --key=/etc/etcd/ssl/etcd01-key.pem endpoint status --write-out=table
以下可以看出主节点重新进行了选举了

十一、apiserver-etcd-client-openssl证书
10.1、在k8s的master节点创建
bash
mkdir -p /etc/kubernetes/pki/etcd
10.2、以下在172.17.48.187节点上执行
bash
cd /etc/etcd/ssl
⭐ 第1步:创建 CSR 文件
创建:apiserver-etcd-client-openssl.cnf
cat > apiserver-etcd-client-openssl.cnf <<EOF
[req]
req_extensions = v3_req
distinguished_name = req_distinguished_name
prompt = no
[req_distinguished_name]
CN = apiserver
O = system:masters
[v3_req]
keyUsage = critical, digitalSignature, keyEncipherment
extendedKeyUsage = clientAuth
EOF
作用:
1、定义了证书请求(CSR)的基本信息。
2、[req_distinguished_name] 指定证书的身份:
CN = apiserver → 公共名称,表示这个证书属于 kube-apiserver
O = system:masters → 组织,标识这是 Kubernetes 管理员组
3、[v3_req] 指定证书用途:
keyUsage → 数字签名和密钥加密
extendedKeyUsage = clientAuth → 这个证书是 客户端证书,用于向 etcd 进行身份验证
总结:这步是"写一张说明书",告诉 OpenSSL 后续生成的证书是谁用的和干什么用的。
⭐ 第2步:生成私钥
openssl genrsa -out apiserver-etcd-client-key.pem 2048
作用:
生成 RSA 私钥,长度 2048 位
私钥是安全的核心,后续生成证书和加密通信都要用它
文件 apiserver-etcd-client-key.pem 必须保密
总结:这是生成证书的"钥匙",所有加密操作都要用它。
⭐ 第3步:生成 CSR
openssl req -new -key apiserver-etcd-client-key.pem \
-out apiserver-etcd-client.csr \
-config apiserver-etcd-client-openssl.cnf
作用:
使用第 2 步生成的私钥和第 1 步配置文件,生成 CSR 文件
CSR 中包含:
公钥
用途信息(clientAuth)
身份信息(CN/O)
CSR 本身不是证书,只是申请证书的请求
总结:这步是"提交申请表",告诉 CA 我要一张证书,身份和用途是什么。
⭐ 第4步:使用你的 CA 签发证书
注意:下面的3650是十年的证书时间如果是一百年换成36500即可
openssl x509 -req -in apiserver-etcd-client.csr \
-CA ca.pem -CAkey ca-key.pem -CAcreateserial \
-out apiserver-etcd-client.pem \
-extensions v3_req -extfile apiserver-etcd-client-openssl.cnf \
-days 3650
作用:
1、用你的 CA 证书 (ca.pem) 和 CA 私钥 (ca-key.pem) 签发 CSR
2、生成 apiserver-etcd-client.pem,就是 kube-apiserver 用来访问 etcd 的客户端证书
3、-days 3650 → 证书有效期 10 年(如果你想 100 年就写 36500)
4、-extensions v3_req -extfile ... → 用 CSR 配置里指定的扩展信息(clientAuth)
总结:这步是"盖章",CA 认可你的申请,生成正式证书。
apiserver-etcd-client.pem + apiserver-etcd-client-key.pem 就可以让 kube-apiserver 安全地访问 etcd。
⭐ 第5步:etcd01 复制到master上
scp /etc/etcd/ssl/ca.pem root@172.17.48.119:/etc/kubernetes/pki/etcd/
scp /etc/etcd/ssl/apiserver-etcd-client.pem root@172.17.48.119:/etc/kubernetes/pki/etcd/
scp /etc/etcd/ssl/apiserver-etcd-client-key.pem root@172.17.48.119:/etc/kubernetes/pki/etcd/
作用:
1、把你在 etcd 集群上生成的证书复制到 Kubernetes master 节点
2、master 节点的 kube-apiserver 需要访问外部 etcd 集群
3、必须把以下文件放在 master 上指定目录:
ca.pem → 用来验证 etcd 的身份
apiserver-etcd-client.pem → kube-apiserver 的客户端证书
apiserver-etcd-client-key.pem → 私钥,和客户端证书配对使用
总结:把 "钥匙和认证文件" 从 etcd 节点发到 master,让 kube-apiserver 可以安全访问 etcd。
⭐ 第6步:到k8s的master上执行
chmod 600 /etc/kubernetes/pki/etcd/apiserver-etcd-client*.pem
chmod 644 /etc/kubernetes/pki/etcd/ca.pem
作用:
1、chmod 600 → 私钥文件只允许 root 用户读写,防止被其他用户偷用
适用于:apiserver-etcd-client-key.pem 和客户端证书(可选也限制证书)
2、chmod 644 → CA 证书可以被系统其他进程读取,但不能修改
适用于:ca.pem
总结:保证 安全性,防止 kube-apiserver 私钥被泄露,同时 CA 证书可用。
十二、安装k8s
注意:安装步骤看下面连接,只是在k8s初始化的时候init命令换成文件
12.1、单节点master安装
单节点master初始化文件--kubeadm-init.yaml
bash
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.27.3
imageRepository: registry.aliyuncs.com/google_containers
apiServer:
extraArgs:
advertise-address: 172.17.48.119
etcd:
external:
endpoints:
- https://172.17.48.187:2379
- https://172.17.48.175:2379
- https://172.17.48.65:2379
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client.pem
keyFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client-key.pem
certificatesDir: /etc/kubernetes/pki
networking: {}
12.2、多master节点安装
多节点master初始化文件--kubeadm-init.yaml
bash
apiVersion: kubeadm.k8s.io/v1beta3
kind: ClusterConfiguration
kubernetesVersion: v1.27.3
imageRepository: registry.aliyuncs.com/google_containers
# 自动开启"可扩展多 master 模式",下面负载均衡器 VIP
controlPlaneEndpoint: "172.17.48.119:6443"
# external etcd 配置
etcd:
external:
endpoints:
- https://172.17.48.187:2379
- https://172.17.48.175:2379
- https://172.17.48.65:2379
caFile: /etc/kubernetes/pki/etcd/ca.pem
certFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client.pem
keyFile: /etc/kubernetes/pki/etcd/apiserver-etcd-client-key.pem
12.3、初始化k8s
bash
kubeadm init --config kubeadm-init.yaml --ignore-preflight-errors=all
12.4、后面接着按照k8s文档安装
-------------------略-------------------
十三、扩展知识
apiserver-etcd-client.pem 的确是 100 年证书(-days 36500),但是要注意关键区别:
下面kubeadm certs check-expiration命令展示的是控制面证书
kubeadm certs check-expiration 只显示 kubeadm 管理的 K8s 控制面证书
手动生成的 etcd 客户端证书不会被 kubeadm 管理,也不会显示
手动生成的 100 年证书是 APIServer → etcd 用的,不属于 kubeadm 管理
注意:核心:kubeadm 管理的证书和你手动生成的证书是两套完全独立的体系
bash
[root@master ~]# kubeadm certs check-expiration
[check-expiration] Reading configuration from the cluster...
[check-expiration] FYI: You can look at this config file with 'kubectl -n kube-system get cm kubeadm-config -o yaml'
CERTIFICATE EXPIRES RESIDUAL TIME CERTIFICATE AUTHORITY EXTERNALLY MANAGED
admin.conf Dec 10, 2026 05:29 UTC 364d ca no
apiserver Dec 10, 2026 05:29 UTC 364d ca no
apiserver-kubelet-client Dec 10, 2026 05:29 UTC 364d ca no
controller-manager.conf Dec 10, 2026 05:29 UTC 364d ca no
front-proxy-client Dec 10, 2026 05:29 UTC 364d front-proxy-ca no
scheduler.conf Dec 10, 2026 05:29 UTC 364d ca no
CERTIFICATE AUTHORITY EXPIRES RESIDUAL TIME EXTERNALLY MANAGED
ca Dec 08, 2035 05:29 UTC 9y no
front-proxy-ca Dec 08, 2035 05:29 UTC 9y no
十四、总结
Kubernetes 依赖 etcd 存储所有集群状态,etcd 是整个控制平面的核心。
etcd 集群必须保持多数节点可用,所有访问必须通过 TLS 证书。
kube-apiserver 是唯一直接访问 etcd 的组件,其他所有 Kubernetes 组件都通过 API Server 间接访问 etcd。
在生产环境中,推荐使用 3 节点或 5 节点的 etcd 集群,并定期备份快照、监控延迟、维护证书有效期。