etcd部署(基于v3.5.15)

etcd部署

单节点部署

下载etcd,解压etcd二进制包,并进入解压后目录

powershell 复制代码
wget https://github.com/etcd-io/etcd/releases/download/v3.5.15/etcd-v3.5.15-linux-amd64.tar.gz
tar -xvzf etcd-v3.5.15-linux-amd64.tar.gz
cd etcd-v3.5.15-linux-amd64/

创建数据目录

powershell 复制代码
mkdir -p /data/etcd/data

移动可执行文件到/usr/local/bin/目录

powershell 复制代码
mv etcd etcdctl etcdutl /usr/local/bin/

其余文件可以删除了

测试版本

powershell 复制代码
etcd --version

配置systemd管理

powershell 复制代码
vim /usr/lib/systemd/system/etcd.service
powershell 复制代码
[Unit]
Description=Etcd Service
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
  --name etcd1 \
  --data-dir /data/etcd/data \
  --listen-peer-urls http://127.0.0.1:2380 \
  --listen-client-urls http://127.0.0.1:2379,http://10.168.31.180:2379 \
  --advertise-client-urls http://192.168.110.12:2379 \
  --initial-advertise-peer-urls http://127.0.0.1:2380 \
  --initial-cluster etcd1=http://127.0.0.1:2380 \
  --initial-cluster-state new \
  --initial-cluster-token etcd-1

Restart=on-failure
RestartSec=5

LimitNOFILE=40000

[Install]
WantedBy=multi-user.target

配置解释:

ExecStart: 指定 etcd 二进制文件的路径和启动参数。

--name: 指定节点的名称。

--data-dir: 存储 etcd 数据的目录;上面创建的目录/data/etcd/data。

--listen-peer-urls: 设置 etcd 节点监听其他节点的 URL。

--listen-client-urls: 设置 etcd 节点监听客户端请求的 URL。可以同时监听 localhost 和实际的服务器 IP 地址。

--advertise-client-urls: 客户端会通过此地址与 etcd 通信。

--initial-advertise-peer-urls: 广播给集群中其他节点的 URL。

--initial-cluster: 指定集群中节点的配置。在单节点模式下,这里仅包括当前节点。

--initial-cluster-state: 指定集群的初始状态。在新建集群时使用 new。

Restart 和 RestartSec: 如果 etcd 进程崩溃或退出,服务会在 5 秒后自动重启。

LimitNOFILE: 增加文件描述符的限制,适应 etcd 的高并发需求。

启动etcd,设置开机启动

powershell 复制代码
systemctl start etcd
systemctl enable etcd

验证

powershell 复制代码
etcdctl put mytest "asd"

etcdctl get mytest

集群部署(3节点)

环境准备

三个节点都需要操作

准备3台服务器

操作系统 IP地址 主机名
alma linux9.3 10.168.31.181 al931181
alma linux9.3 10.168.31.182 al931182
alma linux9.3 10.168.31.183 al931183

配置3台服务器hosts

powershell 复制代码
vim /etc/hosts
powershell 复制代码
## 增加以下配置
10.168.31.181 al931181 
10.168.31.182 al931182 
10.168.31.183 al931183 

配置3台服务器时间同步

powershell 复制代码
dnf install -y ntp
vim /etc/ntp.conf
powershell 复制代码
#修改server的信息为时间服务器的信息,这里设置为阿里云的时间服务器
server ntp1.aliyun.com iburst
server ntp2.aliyun.com iburst
server ntp3.aliyun.com iburst

配置防火墙,放开时间ntpd服务端口

powershell 复制代码
firewall-cmd --permanent --add-port=123/udp
firewall-cmd --reload

启动ntpd服务,并检查ntp同步状态。

powershell 复制代码
systemctl start ntpd
systemctl enable ntpd
ntpq -p

生成etcd自签证书

只在al931181节点上面操作

下载CFSSL工具

powershell 复制代码
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl-certinfo_1.6.3_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64

将二进制包移动至/usr/local/bin/下,并赋予权限

powershell 复制代码
mv cfssl_1.6.3_linux_amd64 /usr/local/bin/cfssl
mv cfssl-certinfo_1.6.3_linux_amd64  /usr/local/bin/cfssl-certinfo
mv cfssljson_1.6.3_linux_amd64 /usr/local/bin/cfssljson
chmod u+x /usr/local/bin/cfssl
chmod u+x /usr/local/bin/cfssl-certinfo
chmod u+x /usr/local/bin/cfssljson

创建数据目录和证书目录

3个节点相同操作

powershell 复制代码
mkdir -p /data/etcd/{ssl,data}

进入证书目录,创建CA配置文件

powershell 复制代码
cd /data/etcd/ssl
cat > ca-config.json <<EOF
{
    "signing": {
        "default": {
            "expiry": "262800h"
        },
        "profiles": {
            "etcd": {
                "expiry": "262800h",
                "usages": [
                    "signing",
                    "key encipherment",
                    "server auth",
                    "client auth"
                ]
            }
        }
    }
}
EOF

创建CA证书信息文件

powershell 复制代码
cat > ca-csr.json << EOF
{
    "CN": "Etcd CA",
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Beijing",
            "L": "Beijing",
            "O": "Etcd CA",
            "OU": "Etcd CA"
        }
    ]
}
EOF

生成CA秘钥和证书

powershell 复制代码
cfssl gencert -initca ca-csr.json | cfssljson -bare ca

生成三个文件:ca.csr(证书签名请求 )、ca.pem(CA 证书)和 ca-key.pem(CA 私钥)。

创建etcd证书信息文件

powershell 复制代码
cat > server-csr.json << EOF
{
    "CN": "etcd-server",
    "hosts": [
        "localhost",
        "127.0.0.1",
        "10.168.31.180",
        "10.168.31.181",
        "10.168.31.182",
        "10.168.31.183",
        "al931180",
        "al931181",
        "al931182",
        "al931183",
        "al931180.etcd.top",
        "al931181.etcd.top",
        "al931182.etcd.top",
        "al931183.etcd.top",
        "*.etcd.top"
    ],
    "key": {
        "algo": "rsa",
        "size": 2048
    },
    "names": [
        {
            "C": "CN",
            "ST": "Beijing",
            "L": "Beijing",
            "O": "Etcd Server",
            "OU": "Etcd Server"
        }
    ]
}
EOF  

host里面预留地址信息,以便后续扩容。可以使用通配符域名的进行地址的预留,后续使用dns解析的方式解决证书不匹配的问题。

生成etcd证书

powershell 复制代码
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd server-csr.json | cfssljson -bare server

这会生成三个文件:server.csr(证书签名请求 )、server.pem(etcd 证书)和 server-key.pem(etcd 证书私钥)。

传输证书和私钥到其它节点

powershell 复制代码
scp *.pem al931182:/data/etcd/ssl
scp *.pem al931183:/data/etcd/ssl

部署、启动etcd集群

三个节点相同操作

下载并移动二进制文件

下载和移动二进制文件同单机部署

创建systemd管理文件

al931181
powershell 复制代码
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Service
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=al931181 \
--cert-file=/data/etcd/ssl/server.pem \
--key-file=/data/etcd/ssl/server-key.pem \
--peer-cert-file=/data/etcd/ssl/server.pem \
--peer-key-file=/data/etcd/ssl/server-key.pem \
--trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--initial-advertise-peer-urls=https://10.168.31.181:2380 \
--listen-peer-urls=https://10.168.31.181:2380 \
--listen-client-urls=https://10.168.31.181:2379,https://127.0.0.1:2379 \
--advertise-client-urls=https://10.168.31.181:2379 \
--listen-metrics-urls=http://0.0.0.0:2381 \
--initial-cluster-token=etcd-cluster \
--initial-cluster=al931181=https://10.168.31.181:2380,al931182=https://10.168.31.182:2380,al931183=https://10.168.31.183:2380 \
--initial-cluster-state=new \
--data-dir=/data/etcd/data

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

EOF
al931182
powershell 复制代码
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Service
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=al931182 \
--cert-file=/data/etcd/ssl/server.pem \
--key-file=/data/etcd/ssl/server-key.pem \
--peer-cert-file=/data/etcd/ssl/server.pem \
--peer-key-file=/data/etcd/ssl/server-key.pem \
--trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--initial-advertise-peer-urls=https://10.168.31.182:2380 \
--listen-peer-urls=https://10.168.31.182:2380 \
--listen-client-urls=https://10.168.31.182:2379,https://127.0.0.1:2379 \
--advertise-client-urls=https://10.168.31.182:2379 \
--listen-metrics-urls=http://0.0.0.0:2381 \
--initial-cluster-token=etcd-cluster \
--initial-cluster=al931181=https://10.168.31.181:2380,al931182=https://10.168.31.182:2380,al931183=https://10.168.31.183:2380 \
--initial-cluster-state=new \
--data-dir=/data/etcd/data

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

EOF
al931183
powershell 复制代码
cat > /usr/lib/systemd/system/etcd.service << EOF
[Unit]
Description=Etcd Service
After=network.target

[Service]
Type=notify
ExecStart=/usr/local/bin/etcd \
--name=al931183 \
--cert-file=/data/etcd/ssl/server.pem \
--key-file=/data/etcd/ssl/server-key.pem \
--peer-cert-file=/data/etcd/ssl/server.pem \
--peer-key-file=/data/etcd/ssl/server-key.pem \
--trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-trusted-ca-file=/data/etcd/ssl/ca.pem \
--peer-client-cert-auth \
--client-cert-auth \
--initial-advertise-peer-urls=https://10.168.31.183:2380 \
--listen-peer-urls=https://10.168.31.183:2380 \
--listen-client-urls=https://10.168.31.183:2379,https://127.0.0.1:2379 \
--advertise-client-urls=https://10.168.31.183:2379 \
--listen-metrics-urls=http://0.0.0.0:2381 \
--initial-cluster-token=etcd-cluster \
--initial-cluster=al931181=https://10.168.31.181:2380,al931182=https://10.168.31.182:2380,al931183=https://10.168.31.183:2380 \
--initial-cluster-state=new \
--data-dir=/data/etcd/data

Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

EOF

参数详解:

--name:指定 Etcd 成员的唯一名称。此名称用于标识集群中的特定 Etcd 成员,并且必须在整个集群中是唯一的。

--cert-file:指定服务器证书文件的路径。此文件包含了服务器的公钥证书,用于加密客户端与 Etcd 之间的通信。

--key-file:指定服务器私钥文件的路径。此文件包含了服务器的私钥,用于解密客户端与 Etcd 之间的通信。

--peer-cert-file:指定对等节点证书文件的路径。此文件包含了 Etcd 成员之间通信时使用的证书。

--peer-key-file:指定对等节点私钥文件的路径。此文件包含了 Etcd 成员之间通信时使用的私钥。

--trusted-ca-file:指定受信任的证书颁发机构 (CA) 证书文件的路径。此文件包含了 CA 的证书,用于验证客户端证书的真实性。

--peer-trusted-ca-file:指定受信任的证书颁发机构 (CA) 证书文件的路径,用于验证对等节点证书。此文件包含了 CA 的证书,用于验证对等节点证书的真实性。

--peer-client-cert-auth:启用对等节点间的证书验证。如果设置为 true,则 Etcd 成员之间通信时会验证对方的证书。

--client-cert-auth:启用客户端证书验证。如果设置为 true,则 Etcd 会验证客户端提供的证书。

--initial-advertise-peer-urls:指定 Etcd 成员向集群其他成员广播的 URL。这是其他 Etcd 成员用来与当前成员通信的 URL。

--listen-peer-urls:指定 Etcd 成员监听来自其他成员的 URL。这是 Etcd 成员监听其他成员通信请求的 URL。

--listen-client-urls:指定 Etcd 成员监听来自客户端的 URL。这是 Etcd 成员监听客户端请求的 URL。

--advertise-client-urls:指定 Etcd 成员向客户端广播的 URL。这是客户端用来与当前 Etcd 成员通信的 URL。

--listen-metrics-urls:指定 metrics 接口运行在 2381 端口下面的,而且是 http 的协议。

--initial-cluster-token:指定集群的唯一标识符。这是一个唯一的字符串,用于标识集群。

--initial-cluster:指定集群中所有成员的初始信息。这是一个逗号分隔的列表,包含集群中所有成员的名称、URL 和投票权重。

--initial-cluster-state:指定集群的初始状态。可以设置为 new 或 existing。如果设置为 new,表示创建一个新的集群;如果设置为 existing,表示加入现有集群。

--data-dir:指定 Etcd 数据目录的路径。这是 Etcd 存储持久化数据的地方。

启动etcd服务,设置开机启动

powershell 复制代码
systemctl start etcd
systemctl enable etcd

查看集群状态

powershell 复制代码
etcdctl --endpoints=https://10.168.31.181:2379,https://10.168.31.182:2379,https://10.168.31.183:2379 \
  --cacert=/data/etcd/ssl/ca.pem \
  --cert=/data/etcd/ssl/server.pem \
  --key=/data/etcd/ssl/server-key.pem \
  endpoint health
相关推荐
建投数据11 分钟前
建投数据与腾讯云数据库TDSQL完成产品兼容性互认证
数据库·腾讯云
Hacker_LaoYi1 小时前
【渗透技术总结】SQL手工注入总结
数据库·sql
岁月变迁呀1 小时前
Redis梳理
数据库·redis·缓存
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍06-基于子查询的SQL注入(Subquery-Based SQL Injection)
数据库·sql·安全·web安全·漏洞挖掘·hw
你的微笑,乱了夏天2 小时前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺2 小时前
分布式系统架构:服务容错
数据库·架构
独行soc3 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain3 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship3 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站3 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle