生产环境ETCD高可用集群

etcd 是分布式键值对数据库,应用于存储 k8s 集群的配置、运行数据等。 虽然 k8s 官方部署工具 kubeadm 可以快速地搭建起 etcd 集群,但是也造成一个不好的影响:etcd 的管理跟 k8s 集群耦合在一起。在生产环境中,我们更希望数据库是独立于其他系统。 先部署独立的外部 etcd 集群,再部署 k8s 集群,既有利于后续部署高可用集群,又方便运维管理,是更加稳健的生产方案。 外部 etcd 集群部署极其灵活:在节点数量上,既可以是单个节点,也可以是多个节点;在部署位置上,既可以部署在 k8s 集群节点上,也可以部署在独立的非 k8s 集群节点上。 除了二进制手动部署之外,还有自动化工具 etcdadm,但是目前还是开发版本,不建议用它部署生产环境。

节点名称
节点内网IP

etcd1

172.22.0.12

etcd2

172.22.0.14

etcd3

172.22.0.4

1. 在每台服务器中将三台服务器的内、外网 IP 和对应的 hostname 写入 hosts 文件

我们只走内网,所有不用加外网

cat >>  /etc/hosts << EOF
172.22.0.12  etcd1
172.22.0.14  etcd2
172.22.0.4   etcd3  
EOF

2. 创建存储目录(所有节点)

mkdir  /data/etcd
mkdir  /data/etcd/data
mkdir  /data/etcd/bin
mkdir  /data/etcd/ssl

3. 制作安全证书(主节点)

etcd 通过证书来实现安全验证。可以通过 cfssl 或者 openssl 工具制作证书。本文采用 cfssl。 在主节点 etcd1 安装 cfssl 套件,制作证书后传输给其他节点。

4. 制作 CA 根证书(主节点)

    1. 生成 csr 文件

    1. 创建证书

填写 CA 的 csr 信息,json 格式 csr 全称 Certificate Signing Request,即“证书签名请求”,类似于申请表,填写申请人的基本信息

4.1 填写 CA 的 csr 信息,json 格式

4.2 创建 CA 根证书,以 ca 为前缀,保存在 /data/etcd/ssl/

ca.pem 是公钥,ca-key.pem 是私钥。 有了根证书,我们这台服务器就可以算一个 CA 机构了,能够给 etcd 颁发证书。

4.3 配置证书策略

profiles:为不同角色配置不同的证书参数,此处只设了 etcd 一个角色,有需要的话可以添加多个角色。 重要的参数包括有效期、用途(签名、密钥加密、服务端认证、客户端认证)

4.4 颁发 etcd 的安全证书

此处多了个 hosts 字段,需要包括所有 etcd 节点的内、外网 IP 地址(这里只使用内网)。 如果 etcd 的配置包含了本地回环地址,也需要加上去。 如果后面新增加 etcd 节点,需要先更新 etcd 的 csr 信息,重新制作证书。

4.5 创建 etcd 的安全证书,以 etcd 为前缀,保存在 /data/etcd/ssl/

4.6 分发 etcd 证书到其他 etcd 节点, 要提前在 etcd2 和 etcd3 创建 ssl 目录

5. 部署 etcd 集群(所有节点)

  • 成员标记的环境变量,其中的 url 是内部可见的 IP(内网 IP、本地回环 IP)

  • ETCD_NAME:节点的 hostname

  • ETCD_LISTEN_PEER_URLS:本地 etcd 端对端监听 url

  • ETCD_LISTEN_CLIENT_URLS:本地 etcd 客户端监听 url

  • 集群标记的环境变量,其中的 url 可用内网IP || (外网 IP)

  • ETCD_INITIAL_ADVERTISE_PEER_URLS:初始化对外端对端通讯 url

  • ETCD_INITIAL_CLUSTER:初始化集群的所有 etcd 节点 url 的集合

  • ETCD_ADVERTISE_CLIENT_URLS:对外客户端监听 url

  • 安全标记部分用到了刚刚创建的证书,所有 url 用 https 协议。

  • 此处列举的是 etcd1 的配置,其他 etcd 节点的配置类似,只需要修改 ETCD_NAME 和与 url 相关的所有环境变量。

6. 用 systemd 服务启动 etcd (所有节点)

7. 在任意的 etcd 节点检查 etcd 集群健康状况

8. 优化一下

9. 时间同步一下

10. 重启服务器,重新查看状态

11. ETCD集群备份

12. ETCD集群恢复

    1. 找到备份的 ETCD 数据文件

    1. 通过命令恢复

13. ETCD 节点扩容

例如新加节点IP: 172.22.0.8

    1. 所有同步 /etc/hosts 节点信息

    1. 添加节点到 /data/etcd/ssl/etcd-csr.json , 重新生成新的证书

    1. 同步证书到所有节点 scp /data/etcd/ssl/* 节点地址:/data/etcd/ssl/

    1. 新节点安装 etcd 二进制

    1. 修改配置文件 etcd.conf, 在 ETCD_INITIAL_CLUSTER 后添加 etcd4=https://172.22.0.8:2380, 并同步所有,重启服务

    1. 如下

    1. 启动新添加的节点

~... member list -w table 查看是信息

14. ETCD 节点扩容

  1. 先获取节点ID

  2. 删除节点ID

Last updated