文章目录
一、环境准备
1.1、主机以及操作系统
etcd名称 | ip | 系统 |
---|---|---|
etcd1 | 192.168.56.105 | centos7 |
etcd2 | 192.168.56.106 | centos7 |
etcd3 | 192.168.56.107 | centos7 |
1.2、软件版本
etcd: etcd-v3.4.13
1.3、开放防火墙
可以选择关闭防火墙或者开放指定端口都行
1.3.1、关闭防火墙
$ systemctl status firewalld.service
$ systemctl stop firewalld.service
$ systemctl disable firewalld.service
1.3.2、开启指定端口
# 开启指定端口
$ firewall-cmd --add-port=2379-2380/tcp --permanent
# reload
$ firewall-cmd --reload
# 查询开启状态
$ firewall-cmd --query-port=2379/tcp
$ firewall-cmd --query-port=2380/tcp
# 关闭端口的命令(这个不需要执行,因为在 etcd 集群运行时网络要保持通)
$ firewall-cmd --permanent --remove-port=2379/tcp
$ firewall-cmd --permanent --remove-port=2380/tcp
二、搭建集群
2.1、 创建 CA 根证书
$ openssl genrsa -out ca.key 2048
# -subject: "/CN" 的值为 Master 主机名或 IP 地址
# -days: 设置证书的有效期
$ openssl req -x509 -new -nodes -key ca.key -subj "/CN=192.168.56.105" -days 36500 -out ca.crt
# 将生成的 ca.key、ca.crt 文件保存在 /etc/kubernetes/pki 目录下
$ mkdir -p /etc/kubernetes/pki
$ cp ca.key ca.crt /etc/kubernetes/pki/
2.2、部署安全的 etcd 高可用集群
2.2.1、下载 etcd 二进制文件,配置 systemd 服务
版本:3.4.13
地址:https://github.com/etcd-io/etcd/releases/tag/v3.4.13
# 解压
$ tar -xvf etcd-v3.4.13-linux-amd64.tar.gz
# 复制 etcd、etctctl 到 /usr/bin
$ cd etcd-v3.4.13-linux-amd64
$ mv etcd etcdctl /usr/bin/
2.2.2、etcd 部署为一个系统服务
部署为一个 systemd 服务,创建 systemd 服务配置文件 /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd key-value store Service
Documentation=https://github.com/etcd-io/etcd
After=network.target
[Service]
ExecStart=/usr/bin/etcd
Restart=always
EnvironmentFile=/etc/etcd/etcd.conf
[Install]
WantedBy=multi-user.target
2.2.3、创建 etcd 的 CA 证书
1、创建一个x509 v3 配置文件 etcd_ssl.cnf
[ req ]
req_extensions = v3_req
distinguished_name = req_distinguished_name
[ req_distinguished_name ]
[ v3_req ]
basicConstraints = CA:FALSE
keyUsage = nonRepudiation, digitalSignature, keyEncipherment
subjectAltName = @alt_names
[ alt_names ]
IP.1 = 192.168.56.105
IP.2 = 192.168.56.106
IP.3 = 192.168.56.107
2、使用 openssl 命令创建 etcd 的服务端 CA 证书
$ openssl genrsa -out etcd_server.key 2048
$ openssl req -new -key etcd_server.key -config etcd_ssl.cnf -subj "/CN=etcd-server" -out etcd_server.csr
$ openssl x509 -req -in etcd_server.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_server.crt
$ mkdir -p /etc/etcd/pki
$ cp etcd_server.crt etcd_server.csr etcd_server.key /etc/etcd/pki/
3、再创建客户端使用的 CA 证书
$ openssl genrsa -out etcd_client.key 2048
$ openssl req -new -key etcd_client.key -config etcd_ssl.cnf -subj "/CN=etcd-client" -out etcd_client.csr
$ openssl x509 -req -in etcd_client.csr -CA /etc/kubernetes/pki/ca.crt -CAkey /etc/kubernetes/pki/ca.key -CAcreateserial -days 36500 -extensions v3_req -extfile etcd_ssl.cnf -out etcd_client.crt
$ cp etcd_client.crt etcd_client.csr etcd_client.key /etc/etcd/pki/
4、复制配置文件
# 在 192.168.56.106 执行复制
$ scp 192.168.56.105:/etc/etcd/pki/* /etc/etcd/pki/
$ scp 192.168.56.105:/etc/kubernetes/pki/* /etc/kubernetes/pki/
# 在 192.168.56.107 执行复制
$ scp 192.168.56.105:/etc/etcd/pki/* /etc/etcd/pki/
$ scp 192.168.56.105:/etc/kubernetes/pki/* /etc/kubernetes/pki/
2.2.4、etcd配置文件
配置文件放置在 /etc/etcd/etcd.conf
# 节点 1 的配置
ETCD_NAME=etcd1
ETCD_DATA_DIR=/etc/etcd/data
ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.56.105:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.105:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.56.105:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.105:2380
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER_STATE=new
# 节点 2 的配置
ETCD_NAME=etcd2
ETCD_DATA_DIR=/etc/etcd/data
ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.56.106:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.106:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.56.106:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.106:2380
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER_STATE=new
# 节点 3 的配置
ETCD_NAME=etcd3
ETCD_DATA_DIR=/etc/etcd/data
ETCD_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_CLIENT_CERT_AUTH=true
ETCD_LISTEN_CLIENT_URLS=https://192.168.56.107:2379
ETCD_ADVERTISE_CLIENT_URLS=https://192.168.56.107:2379
ETCD_PEER_CERT_FILE=/etc/etcd/pki/etcd_server.crt
ETCD_PEER_KEY_FILE=/etc/etcd/pki/etcd_server.key
ETCD_PEER_TRUSTED_CA_FILE=/etc/kubernetes/pki/ca.crt
ETCD_LISTEN_PEER_URLS=https://192.168.56.107:2380
ETCD_INITIAL_ADVERTISE_PEER_URLS=https://192.168.56.107:2380
ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
ETCD_INITIAL_CLUSTER="etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380"
ETCD_INITIAL_CLUSTER_STATE=new
2.3、启动etcd
$ systemctl restart etcd && systemctl enable etcd
除了把 etcd 部署为一个 service 启动外,也可以直接启动 etcd
/usr/bin/etcd --name etcd1 \
--data-dir /etc/etcd/data \
--cert-file /etc/etcd/pki/etcd_server.crt \
--key-file /etc/etcd/pki/etcd_server.key \
--client-cert-auth \
--trusted-ca-file /etc/kubernetes/pki/ca.crt \
--listen-client-urls https://192.168.56.105:2379 \
--advertise-client-urls https://192.168.56.105:2379 \
--peer-cert-file /etc/etcd/pki/etcd_server.crt \
--peer-key-file /etc/etcd/pki/etcd_server.key \
--peer-trusted-ca-file /etc/kubernetes/pki/ca.crt \
--listen-peer-urls https://192.168.56.105:2380 \
--initial-advertise-peer-urls https://192.168.56.105:2380 \
--initial-cluster-token etcd-cluster \
--initial-cluster "etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380" \
--initial-cluster-state new \
--logger zap
/usr/bin/etcd --name etcd2 \
--data-dir /etc/etcd/data \
--cert-file /etc/etcd/pki/etcd_server.crt \
--key-file /etc/etcd/pki/etcd_server.key \
--client-cert-auth \
--trusted-ca-file /etc/kubernetes/pki/ca.crt \
--listen-client-urls https://192.168.56.106:2379 \
--advertise-client-urls https://192.168.56.106:2379 \
--peer-cert-file /etc/etcd/pki/etcd_server.crt \
--peer-key-file /etc/etcd/pki/etcd_server.key \
--peer-trusted-ca-file /etc/kubernetes/pki/ca.crt \
--listen-peer-urls https://192.168.56.106:2380 \
--initial-advertise-peer-urls https://192.168.56.106:2380 \
--initial-cluster-token etcd-cluster \
--initial-cluster "etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380" \
--initial-cluster-state new \
--logger zap
/usr/bin/etcd \
--name etcd3 \
--data-dir /etc/etcd/data \
--cert-file /etc/etcd/pki/etcd_server.crt \
--key-file /etc/etcd/pki/etcd_server.key \
--trusted-ca-file /etc/kubernetes/pki/ca.crt \
--client-cert-auth \
--listen-client-urls https://192.168.56.107:2379 \
--advertise-client-urls https://192.168.56.107:2379 \
--peer-cert-file /etc/etcd/pki/etcd_server.crt \
--peer-key-file /etc/etcd/pki/etcd_server.key \
--peer-trusted-ca-file /etc/kubernetes/pki/ca.crt \
--listen-peer-urls https://192.168.56.107:2380 \
--initial-advertise-peer-urls https://192.168.56.107:2380 \
--initial-cluster-token etcd-cluster \
--initial-cluster "etcd1=https://192.168.56.105:2380,etcd2=https://192.168.56.106:2380,etcd3=https://192.168.56.107:2380" \
--initial-cluster-state new \
--logger zap
2.4、测试etcd
$ etcdctl --cacert=/etc/kubernetes/pki/ca.crt --cert=/etc/etcd/pki/etcd_client.crt --key=/etc/etcd/pki/etcd_client.key --endpoints=https://192.168.56.106:2379,https://192.168.56.107:2379,https://192.168.56.105:2379 endpoint health
$ etcdctl -w table --cacert=/etc/kubernetes/pki/ca.crt --cert=/etc/etcd/pki/etcd_client.crt --key=/etc/etcd/pki/etcd_client.key --endpoints=https://192.168.56.106:2379,https://192.168.56.107:2379,https://192.168.56.105:2379 endpoint status
2.5、清理配置
如果哪一步执行错误可以通过以下脚本快速清理环境
$ rm -f /etc/etcd/pki/* && rm -f /etc/kubernetes/pki/* && rm -f /etc/etcd/etcd.conf
$ ls /etc/etcd/pki/
$ ls /etc/kubernetes/pki/