ETCD
etcd 是一个分布式键值存储系统,专为分布式系统提供一致性和高可用性的数据存储。它使用 Raft 一致性算法,确保多个节点间的数据一致性,适合在容器编排和微服务环境中管理配置数据、服务发现等任务。etcd 是 Kubernetes 的核心组件之一,为其提供数据存储和分布式协调服务。
前置条件
- 参考:基础配置
服务器节点信息
| IP地址 | 主机名 | 说明 |
|---|---|---|
| 192.168.1.112 | etcd01.ateng.local | |
| 192.168.1.113 | etcd02.ateng.local | |
| 192.168.1.114 | etcd03.ateng.local |
安装HTTPS模式集群
SSL证书生成指南
本指南介绍如何使用 Cloudflare CFSSL 生成和管理SSL证书。CFSSL(Cloudflare's PKI and TLS toolkit)是一个开源的公钥基础设施(PKI)工具包,支持证书颁发、签名、验证等功能,方便集成到自动化流程中,尤其适用于需要大规模自动化管理TLS/SSL证书的场景。更多信息请参考:CFSSL GitHub 仓库
1. 安装 CFSSL
1.1 下载CFSSL软件包
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl_1.6.5_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssljson_1.6.5_linux_amd64
wget https://github.com/cloudflare/cfssl/releases/download/v1.6.5/cfssl-certinfo_1.6.5_linux_amd642
3
以上命令用于下载 CFSSL 工具包的可执行文件,包括
cfssl、cfssljson和cfssl-certinfo。它们分别负责证书生成、JSON处理、和证书信息查看。
1.2 安装CFSSL到系统路径
sudo cp cfssl_1.6.5_linux_amd64 /usr/bin/cfssl
sudo cp cfssljson_1.6.5_linux_amd64 /usr/bin/cfssljson
sudo cp cfssl-certinfo_1.6.5_linux_amd64 /usr/bin/cfssl-certinfo
sudo chmod +x /usr/bin/cfssl*2
3
4
将下载的文件移动到系统可执行路径,并赋予执行权限,方便在命令行中直接调用。
1.3 验证安装
cfssl version执行以上命令后,如果安装成功,应输出版本信息,如:
Version: 1.6.5
Runtime: go1.22.02
2. 创建证书目录
为证书和密钥创建存储目录:
sudo mkdir -p /etc/ssl/etcd/
sudo chown admin:ateng /etc/ssl/etcd/
cd /etc/ssl/etcd/2
3
此步骤在
/etc/ssl/下创建了etcd子目录,用于存储接下来生成的证书和密钥。
3. 生成 CA 证书
CA(Certificate Authority)证书用于签署其他证书。该步骤包括创建配置文件 ca-config.json 和 ca-csr.json,以指定 CA 证书的有效期和用途。
3.1 创建 CA 配置文件
生成
ca-config.json配置文件bashtee ca-config.json <<EOF { "signing": { "default": { "expiry": "876000h" }, "profiles": { "etcd": { "expiry": "876000h", "usages": [ "signing", "key encipherment", "server auth", "client auth" ] } } } } EOF1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20配置说明:
signing:指定证书的签名用途。expiry:设置证书有效期为876000h(约100年),便于长期使用。profiles:定义了名为etcd的证书配置文件,其用途包括签名、密钥加密、服务器认证和客户端认证。
生成
ca-csr.json文件bashtee ca-csr.json <<EOF { "CA": { "expiry": "876000h" }, "CN": "ateng.local", "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Chongqing", "ST": "Chongqing", "O": "Ateng", "OU": "Etcd" } ] } EOF1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21配置说明:
CN:证书的通用名称(Common Name)为ateng.local。key:使用 RSA 算法和 2048 位的密钥长度。names:包含证书的地理信息,如国家(C)、城市(L)、组织(O)等。
3.2 生成 CA 证书
使用 cfssl 生成CA证书和私钥:
cfssl gencert -initca ca-csr.json | cfssljson -bare ca
cfssl certinfo -cert ca.pem | grep not2
以上命令生成了 CA 证书和密钥文件,
ca.pem文件包含 CA 公钥,ca-key.pem文件包含 CA 私钥。cfssl certinfo用于查看证书详细信息,grep not用于过滤“有效期”相关信息。
4. 生成 ETCD 服务端证书
此步骤生成用于 ETCD 集群之间通信的服务端证书。需指定集群节点的 IP 地址。
4.1 创建 ETCD 服务端配置文件
生成
etcd-server-csr.json文件bashtee etcd-server-csr.json <<EOF { "CN": "etcd.ateng.local", "hosts": [ "apiserver.k8s.local", "*.svc.cluster.local", "*.ateng.local", "localhost", "192.168.1.111", "192.168.1.112", "192.168.1.113", "192.168.1.114", "192.168.1.115", "192.168.2.10", "127.0.0.1" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Chongqing", "ST": "Chongqing", "O": "Ateng", "OU": "Etcd Server" } ] } EOF1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31配置说明:
CN:证书的通用名称为etcd.ateng.local。hosts:定义服务端的 IP 地址和域名,允许多个地址,便于集群节点扩展。key:指定 RSA 算法和 2048 位密钥长度。names:证书的地理信息,具体信息与 CA 配置相同。
4.2 生成服务端证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-server-csr.json | cfssljson -bare etcd-server
cfssl certinfo -cert etcd-server.pem | grep not2
使用指定的 CA 证书和密钥生成服务端证书。输出文件
etcd-server.pem和etcd-server-key.pem分别是服务端的公钥和私钥。
5. 生成 ETCD 客户端证书
客户端证书用于ETCD客户端连接ETCD服务器时的身份验证。
5.1 创建 ETCD 客户端配置文件
生成
etcd-client-csr.json文件bashtee etcd-client-csr.json <<EOF { "CN": "etcd.kongyu.local", "hosts": [ "" ], "key": { "algo": "rsa", "size": 2048 }, "names": [ { "C": "CN", "L": "Chongqing", "ST": "Chongqing", "O": "Ateng", "OU": "Etcd Client" } ] } EOF1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21配置说明:
hosts:由于客户端证书不需要绑定到特定 IP 地址,因此为空。- 其他字段与服务端配置相同。
5.2 生成客户端证书
cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=etcd etcd-client-csr.json | cfssljson -bare etcd-client
cfssl certinfo -cert etcd-client.pem | grep not2
生成的
etcd-client.pem是客户端的公钥文件,
etcd-client-key.pem 是私钥文件。
6. 分发证书到其他 ETCD 节点
在其他节点创建证书目录
sudo mkdir -p /etc/ssl/etcd/
sudo chown admin:ateng /etc/ssl/etcd/2
将生成的证书分发到其他ETCD节点上,以便这些节点可以进行加密通信:
scp -r /etc/ssl/etcd/* etcd02.ateng.local:/etc/ssl/etcd/
scp -r /etc/ssl/etcd/* etcd03.ateng.local:/etc/ssl/etcd/2
安装ETCD集群
1. 安装ETCD
1.1 下载和解压ETCD软件包
wget https://github.com/etcd-io/etcd/releases/download/v3.5.17/etcd-v3.5.17-linux-amd64.tar.gz
tar -zxvf etcd-v3.5.17-linux-amd64.tar.gz2
1.2 将ETCD安装到系统路径
sudo cp etcd-v3.5.17-linux-amd64/etcd* /usr/bin以上命令将
etcd的二进制文件复制到系统可执行路径中。
1.3 查看安装的ETCD版本
etcdctl version命令输出应类似以下内容,表示安装成功:
etcdctl version: 3.5.17
API version: 3.52
2. 配置ETCD
2.1 创建配置和数据目录
数据目录最好放在SSD硬盘上
sudo mkdir -p /quickdata/service/etcd/ /etc/etcd/
sudo chmod 700 /quickdata/service/etcd/ /etc/etcd/
sudo chown admin:ateng /quickdata/service/etcd/ /etc/etcd/2
3
创建存储
etcd配置文件和数据的目录。
2.2 编辑配置文件
编辑 /etc/etcd/etcd.conf,文件内容如下:
其他节点注意修改以下配置
- ETCD_LISTEN_PEER_URLS
- ETCD_LISTEN_CLIENT_URLS
- ETCD_ADVERTISE_CLIENT_URLS
- ETCD_INITIAL_ADVERTISE_PEER_URLS
- ETCD_NAME
tee /etc/etcd/etcd.conf <<"EOF"
ETCD_DATA_DIR="/quickdata/service/etcd/"
ETCD_LISTEN_PEER_URLS="https://192.168.1.112:2380"
ETCD_LISTEN_CLIENT_URLS="https://192.168.1.112:2379,https://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="https://192.168.1.112:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="https://192.168.1.112:2380"
ETCD_NAME="etcd01"
ETCD_INITIAL_CLUSTER="etcd01=https://192.168.1.112:2380,etcd02=https://192.168.1.113:2380,etcd03=https://192.168.1.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="2385569970"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_TRUSTED_CA_FILE="/etc/ssl/etcd/ca.pem"
ETCD_CERT_FILE="/etc/ssl/etcd/etcd-server.pem"
ETCD_KEY_FILE="/etc/ssl/etcd/etcd-server-key.pem"
ETCD_CLIENT_CERT_AUTH=true
ETCD_PEER_TRUSTED_CA_FILE="/etc/ssl/etcd/ca.pem"
ETCD_PEER_CERT_FILE="/etc/ssl/etcd/etcd-server.pem"
ETCD_PEER_KEY_FILE="/etc/ssl/etcd/etcd-server-key.pem"
ETCD_PEER_CLIENT_CERT_AUTH=true
ETCD_QUOTA_BACKEND_BYTES=8589934592
ETCD_MAX_REQUEST_BYTES=10485760
ETCD_SNAPSHOT_COUNT=2000
ETCD_LOG_LEVEL="warn"
ETCD_AUTO_COMPACTION_MODE="periodic"
ETCD_AUTO_COMPACTION_RETENTION="1h"
ETCD_MAX_TXN_OPS=1280
EOF2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
参数说明:
ETCD_DATA_DIR:数据存储目录。ETCD_LISTEN_PEER_URLS:ETCD节点间的通信监听URL。ETCD_LISTEN_CLIENT_URLS:客户端连接的监听URL。ETCD_ADVERTISE_CLIENT_URLS:通告给集群中其他成员的客户端URL。ETCD_INITIAL_ADVERTISE_PEER_URLS:通告给集群中其他成员的ETCD节点通信URL。ETCD_NAME:本节点的唯一名称。ETCD_INITIAL_CLUSTER:集群成员列表,格式为节点名称=节点通信URL。ETCD_INITIAL_CLUSTER_TOKEN:集群标识符,用于防止多个集群混淆。ETCD_INITIAL_CLUSTER_STATE:集群状态,new表示创建新集群。ETCD_TRUSTED_CA_FILE:TLS认证的CA证书路径。ETCD_CERT_FILE:TLS证书文件路径。ETCD_KEY_FILE:TLS私钥文件路径。ETCD_CLIENT_CERT_AUTH:启用客户端证书认证。ETCD_PEER_TRUSTED_CA_FILE:节点间通信的CA证书路径。ETCD_PEER_CERT_FILE:节点间通信的TLS证书文件路径。ETCD_PEER_KEY_FILE:节点间通信的TLS私钥文件路径。ETCD_PEER_CLIENT_CERT_AUTH:启用节点间的客户端证书验证。ETCD_QUOTA_BACKEND_BYTES:ETCD数据存储的大小限制(字节)。ETCD_MAX_REQUEST_BYTES:允许的最大客户端请求大小。ETCD_SNAPSHOT_COUNT:每隔多少事务触发快照。ETCD_LOG_LEVEL:日志级别,可选debug, info, warn, error, panic, fatal。ETCD_AUTO_COMPACTION_MODE:自动压缩模式,periodic表示按周期压缩。ETCD_AUTO_COMPACTION_RETENTION:自动压缩的保留时间。ETCD_MAX_TXN_OPS:允许的最大事务操作数。
3. 配置systemd启动服务
3.1 创建systemd服务文件
编辑 /etc/systemd/system/etcd.service 文件,内容如下:
sudo tee /etc/systemd/system/etcd.service <<"EOF"
[Unit]
Description=Etcd Server
Documentation=https://etcd.io/docs/v3.5/
After=network.target
[Service]
User=admin
Group=ateng
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
ExecStop=/bin/kill -SIGTERM $MAINPID
KillSignal=SIGTERM
TimeoutStopSec=30
Restart=on-failure
RestartSec=10s
[Install]
WantedBy=multi-user.target
EOF2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
配置说明:
[Unit]部分:Description用于描述服务,After确保服务在网络启动后启动。[Service]部分:
EnvironmentFile:指定加载的环境变量配置文件。ExecStart和ExecStop:分别为启动和停止服务的命令。KillSignal:指定的信号用于终止服务。Restart:设置服务失败时自动重启。StandardOutput和StandardError:将日志输出到syslog。[Install]部分:定义服务的目标。
4. 启动ETCD服务
4.1 重新加载并启动服务
sudo systemctl daemon-reload
sudo systemctl start etcd.service
sudo systemctl enable etcd.service2
3
systemctl daemon-reload重新加载systemd配置,systemctl start启动服务,systemctl enable设为开机自启。
5. 查看ETCD节点状态
5.1 配置ETCD客户端环境
创建客户端配置文件 /etc/profile.d/00-etcd.sh:
tee -a ~/.bash_profile <<EOF
## ETCD Config
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS="https://192.168.1.112:2379,https://192.168.1.113:2379,https://192.168.1.114:2379"
export ETCDCTL_CACERT="/etc/ssl/etcd/ca.pem"
export ETCDCTL_KEY="/etc/ssl/etcd/etcd-client-key.pem"
export ETCDCTL_CERT="/etc/ssl/etcd/etcd-client.pem"
EOF
source ~/.bash_profile2
3
4
5
6
7
8
9
该文件将ETCD客户端命令行工具
etcdctl的环境变量加载到系统环境中。
5.2 使用 etcdctl 查看节点状态
etcdctl endpoint status --write-out=table
etcdctl endpoint health --write-out=table
etcdctl member list --write-out=table2
3
etcdctl endpoint status:查看各个节点的状态。etcdctl endpoint health:检查各节点健康状况。etcdctl member list:列出集群成员。
安装HTTP+认证模式集群
安装ETCD集群
1. 安装ETCD
1.1 下载和解压ETCD软件包
wget http://github.com/etcd-io/etcd/releases/download/v3.5.17/etcd-v3.5.17-linux-amd64.tar.gz
tar -zxvf etcd-v3.5.17-linux-amd64.tar.gz2
1.2 将ETCD安装到系统路径
sudo cp etcd-v3.5.17-linux-amd64/etcd* /usr/bin以上命令将
etcd的二进制文件复制到系统可执行路径中。
1.3 查看安装的ETCD版本
etcdctl version命令输出应类似以下内容,表示安装成功:
etcdctl version: 3.5.17
API version: 3.52
2. 配置ETCD
2.1 创建配置和数据目录
数据目录最好放在SSD硬盘上
sudo mkdir -p /quickdata/service/etcd/ /etc/etcd/
sudo chmod 700 /quickdata/service/etcd/ /etc/etcd/
sudo chown admin:ateng /quickdata/service/etcd/ /etc/etcd/2
3
创建存储
etcd配置文件和数据的目录。
2.2 编辑配置文件
编辑 /etc/etcd/etcd.conf,文件内容如下:
其他节点注意修改以下配置
- ETCD_LISTEN_PEER_URLS
- ETCD_LISTEN_CLIENT_URLS
- ETCD_ADVERTISE_CLIENT_URLS
- ETCD_INITIAL_ADVERTISE_PEER_URLS
- ETCD_NAME
tee /etc/etcd/etcd.conf <<"EOF"
ETCD_DATA_DIR="/quickdata/service/etcd/"
ETCD_LISTEN_PEER_URLS="http://192.168.1.112:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.1.112:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.1.112:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.1.112:2380"
ETCD_NAME="etcd01"
ETCD_INITIAL_CLUSTER="etcd01=http://192.168.1.112:2380,etcd02=http://192.168.1.113:2380,etcd03=http://192.168.1.114:2380"
ETCD_INITIAL_CLUSTER_TOKEN="2385569970"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_QUOTA_BACKEND_BYTES=8589934592
ETCD_MAX_REQUEST_BYTES=10485760
ETCD_SNAPSHOT_COUNT=2000
ETCD_LOG_LEVEL="warn"
ETCD_AUTO_COMPACTION_MODE="periodic"
ETCD_AUTO_COMPACTION_RETENTION="1h"
ETCD_MAX_TXN_OPS=1280
EOF2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
参数说明:
ETCD_DATA_DIR:数据存储目录。ETCD_LISTEN_PEER_URLS:ETCD节点间的通信监听URL。ETCD_LISTEN_CLIENT_URLS:客户端连接的监听URL。ETCD_ADVERTISE_CLIENT_URLS:通告给集群中其他成员的客户端URL。ETCD_INITIAL_ADVERTISE_PEER_URLS:通告给集群中其他成员的ETCD节点通信URL。ETCD_NAME:本节点的唯一名称。ETCD_INITIAL_CLUSTER:集群成员列表,格式为节点名称=节点通信URL。ETCD_INITIAL_CLUSTER_TOKEN:集群标识符,用于防止多个集群混淆。ETCD_INITIAL_CLUSTER_STATE:集群状态,new表示创建新集群。ETCD_QUOTA_BACKEND_BYTES:ETCD数据存储的大小限制(字节)。ETCD_MAX_REQUEST_BYTES:允许的最大客户端请求大小。ETCD_SNAPSHOT_COUNT:每隔多少事务触发快照。ETCD_LOG_LEVEL:日志级别,可选debug, info, warn, error, panic, fatal。ETCD_AUTO_COMPACTION_MODE:自动压缩模式,periodic表示按周期压缩。ETCD_AUTO_COMPACTION_RETENTION:自动压缩的保留时间。ETCD_MAX_TXN_OPS:允许的最大事务操作数。
3. 配置systemd启动服务
3.1 创建systemd服务文件
编辑 /etc/systemd/system/etcd.service 文件,内容如下:
sudo tee /etc/systemd/system/etcd.service <<"EOF"
[Unit]
Description=Etcd Server
Documentation=http://etcd.io/docs/v3.5/
After=network.target
[Service]
User=admin
Group=ateng
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/bin/etcd
ExecStop=/bin/kill -SIGTERM $MAINPID
Restart=on-failure
RestartSec=30
TimeoutStartSec=120
TimeoutStopSec=180
StartLimitIntervalSec=600
StartLimitBurst=3
KillMode=control-group
KillSignal=SIGTERM
SuccessExitStatus=143
[Install]
WantedBy=multi-user.target
EOF2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
配置说明:
[Unit]部分:Description用于描述服务,After确保服务在网络启动后启动。[Service]部分:
EnvironmentFile:指定加载的环境变量配置文件。ExecStart和ExecStop:分别为启动和停止服务的命令。KillSignal:指定的信号用于终止服务。Restart:设置服务失败时自动重启。StandardOutput和StandardError:将日志输出到syslog。[Install]部分:定义服务的目标。
4. 启动ETCD服务
4.1 重新加载并启动服务
sudo systemctl daemon-reload
sudo systemctl start etcd.service
sudo systemctl enable etcd.service2
3
systemctl daemon-reload重新加载systemd配置,systemctl start启动服务,systemctl enable设为开机自启。
5. 查看ETCD节点状态
5.1 配置ETCD客户端环境
创建客户端配置文件 /etc/profile.d/00-etcd.sh:
tee -a ~/.bash_profile <<EOF
## ETCD Config
export ETCDCTL_API=3
export ETCDCTL_ENDPOINTS="http://192.168.1.112:2379,http://192.168.1.113:2379,http://192.168.1.114:2379"
EOF
source ~/.bash_profile2
3
4
5
6
该文件将ETCD客户端命令行工具
etcdctl的环境变量加载到系统环境中。
5.2 使用 etcdctl 查看节点状态
etcdctl endpoint status --write-out=table
etcdctl endpoint health --write-out=table
etcdctl member list --write-out=table2
3
etcdctl endpoint status:查看各个节点的状态。etcdctl endpoint health:检查各节点健康状况。etcdctl member list:列出集群成员。
6. 开启用户认证
添加用户
root并设置密码:bashetcdctl user add root --new-user-password="Admin@123"1授予
root用户root角色:bashetcdctl user grant-role root root1启用认证:
bashetcdctl auth enable1验证用户是否成功添加:
bashetcdctl --user=root:Admin@123 user list1
说明:
- 以上命令假设
etcdctl已正确配置并能够连接到etcd实例。 - 确保在启用认证后,后续的
etcdctl操作都使用授权用户进行访问,如--user=root:Admin@123。 - 在启用认证后,访问
etcd的客户端和服务需要使用认证用户进行访问。