Kubernetes+Etcd----集群安装(etcd证书100年)

提示:文章实验安装etcd采用openssl安装

文章目录


前言

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

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安装

单节点安装k8s

单节点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安装

多节点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 集群,并定期备份快照、监控延迟、维护证书有效期。

相关推荐
陈陈CHENCHEN4 小时前
【Kubernetes】Ubuntu 24.04 安装 Kubernetes 1.30.14
云原生·kubernetes
雨中飘荡的记忆4 小时前
Docker与Java实战指南
java·docker·容器
Gold Steps.5 小时前
K8S云原生部署Harbor镜像仓库与镜像漏扫Trivy的使用
云原生·容器·kubernetes
峰顶听歌的鲸鱼5 小时前
14.docker:镜像
运维·笔记·docker·容器·学习方法
java_logo5 小时前
Apache RocketMQ Docker 容器化部署指南
运维·docker·容器·kafka·kubernetes·apache·rocketmq
by__csdn5 小时前
第二章 (.NET Core环境搭建)第三节( Visual Studio for Mac)
ide·kubernetes·c#·asp.net·.net·.netcore·visual studio
菜萝卜子17 小时前
Kubernetes metrics-server 部署与全场景使用指南
云原生·容器·kubernetes
Brandon汐1 天前
k8s-Pod详解-1
云原生·容器·kubernetes
基哥的奋斗历程1 天前
部署指南-1B-单体Docker-自建方案
运维·docker·容器