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

相关推荐
lichenyang45311 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang45311 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang45311 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
运维开发故事3 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
探索云原生5 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes
云恒要逆袭5 天前
运行你的第一个Docker容器
后端·docker·容器
Java之美6 天前
一次k8s升级引发的DevicePlugin注册失败
云原生·kubernetes
程序员老赵7 天前
10 分钟部署 OpenCode:Docker 一键安装,浏览器打开就能用 AI 写代码(附完整命令与排错)
docker·容器·ai编程