【ETCD】ETCD单节点二进制部署(TLS)
ETCD单节点二进制部署(TLS)
文章目录
- ETCD单节点二进制部署(TLS)
- 资源列表
- 基础环境
- 一、安装部署(单机)
- 1.1、二进制文件部署
- 1.2、添加system服务管理
- 1.3、验证
- 二、部署TLS加密
- 2.1、下载安装cfssl
- 2.2、创建默认配置文件
- 2.3、证书类型
- 2.4、创建CA证书
- 2.5、生成服务器端证书
- 2.6、生成客户端证书
- 2.7、生成对等证书
- 2.8、更新系统证书库
- 2.9、修改etcd配置并重启etcd
- 2.10、访问验证
资源列表
| 操作系统 | 配置 | 主机名 | IP |
|---|---|---|---|
| openEuler | 2C4G | etcd | 192.168.93.101 |
基础环境
- 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
- 关闭内核安全机制
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
- 修改主机名
hostnamectl set-hostname etcd
一、安装部署(单机)
- 如果是在测试或者开发环境,想要测试和使用etcd服务,只需要部署一个单节点的etcd服务即可。
1.1、二进制文件部署
- 下载安装软件
[root@etcd ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.4.23/etcd-v3.4.23-linux-amd64.tar.gz[root@etcd ~]# tar -zxvf etcd-v3.4.23-linux-amd64.tar.gz[root@etcd ~]# mv etcd-v3.4.23-linux-amd64 /usr/local/etcd
- 添加环境变量
[root@etcd ~]# vim /etc/profile
# 末尾添加即可
export PATH="$PATH:/usr/local/etcd"# 刷新环境变量
[root@etcd ~]# source /etc/profile
- 验证客户端工具是否可用
[root@etcd ~]# etcdctl version
etcdctl version: 3.4.23
API version: 3.4
1.2、添加system服务管理
# 创建配置文件目录
[root@etcd ~]# mkdir -p /etc/etcd# 创建数据目录里
[root@etcd ~]# mkdir -p /etc/etcd/data
- 创建system服务配置
[root@etcd ~]# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target[Service]
Type=notify
EnvironmentFile=/etc/etcd/etcd.conf
ExecStart=/usr/local/etcd/etcd --config-file=/etc/etcd/etcd.conf
Restart=on-failure
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
- 创建etcd配置文件
[root@etcd ~]# cat /etc/etcd/etcd.conf
# 节点名称
name: 'etcd-1'
# 指定节点的数据存储目录
data-dir: '/etc/etcd/data'
# 对外提供服务的地址,客户端会连接到这里和 etcd 交互
listen-client-urls: 'http://192.168.93.101:2379,http://127.0.0.1:2379'
- 启动etcd服务并添加开机自启动
[root@etcd ~]# systemctl start etcd
[root@etcd ~]# systemctl enable etcd
- 除了可以使用配置文件指定配置外,也可以直接通过命令行参数指定配置,常用的命令行参数如下(推荐使用配置文件),命令行参数参考文档:
https://etcd.io/docs/v3.5/op-guide/configuration/,配置文件参数文档:https://github.com/etcd-io/etcd/blob/main/etcd.conf.yml.sample。
| 参数 | 说明 |
|---|---|
| –name | etcd节点名字如果在集群环境中,name必须是唯一的,建议用主机名称或者机器ID |
| –data-dir | 数据存储目录 |
| –initial-cluster | etcd启动的时候,通过这个配置找到其他etcd节点的地址列表,格式:节点名字1=http://节点ip1:2380,节点名字2=http://节点ip1:2380,节点名字3=http://节点ip1:2380 |
| –initial-cluster-state | 初始化的时候,集群的状态“new”或者“existing”两种状态,new代表新建的集群,existing表示加入已经存在的集群。 |
| –advertise-client-urls | 如果–listen-client-urls配置了,多个监听客户端请求的地址,这个参数可以给出,建议客户端使用什么地址访问etcd。 |
| –initial-advertise-peer-urls | 服务端之间通讯使用的地址列表。 |
| –listen-client-urls | 监听客户端请求的地址列表,格式:http://localhost:2379,多个用逗号分隔。 |
| –listen-peer-urls | 服务端节点之间通讯的监听地址,格式http://localhost:2380 |
1.3、验证
- 查看集群状态
[root@etcd ~]# etcdctl endpoint status --cluster -w table
+-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| http://localhost:2379 | 8e9e05c52164694d | 3.4.23 | 20 kB | true | false | 2 | 4 | 4 | |
+-----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+### 回显字段含义
ENDPOINT: etcd节点的访问地址(客户端URL), 这里是 http://localhost:2379
ID: 节点的唯一成员ID(十六进制), 由etcd启动时自动生成。8e9e05c52164694d 是著名的etcd默认ID(常用于单节点测试)
DB SIZE: etcd后端数据库(boltdb)当前磁盘占用大小, 20kb表示数据量很小
IS LEADER: 是否是当前Raft协议的Leader (true=Leader(负责处理些请求) false=Follower)
IS LEARNER: 是否是学习者节点(learner) -false表示正式投票成员 -Learner是v3.4+引入的, 用于俺去那加入新节点(不参与投票)
P
PAFT TERM: 当前 Raft 任期号(Term)。每次选举 Leader 时递增。这里是 2,说明经历过一次 Leader 选举(初始为 1)
PAFT APPLIED INDEX: 已经被状态机(即 etcd KV存储)实际应用的日志索引
ERRORS: 节点状态错误信息, 为空表示监控
二、部署TLS加密
-
etcd支持通过TLS协议的加密通信,在实际企业生产环境中,出于安全规范要求,建议开启TLS加密。TLS通道可以用于加密内部的集群通讯,也可以用于加密客户端请求。
-
etcd的TLS有两队,一对是etcd和client端的TLS配置。一对是etcd之间的peer的TLS配置。有很多方式可以创建CA证书和私钥,其中比较流行的有两种
- openssl
- cfssl
-
官方文档推荐使用cfssl生成证书
2.1、下载安装cfssl
- 下载地址:
https://github.com/cloudflare/cfssl/releases
[root@etcd ~]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssl_1.6.3_linux_amd64
[root@etcd ~]# wget https://github.com/cloudflare/cfssl/releases/download/v1.6.3/cfssljson_1.6.3_linux_amd64
[root@etcd ~]# mv cfssl_1.6.3_linux_amd64 /usr/bin/cfssl
[root@etcd ~]# mv cfssljson_1.6.3_linux_amd64 /usr/bin/cfssljson
[root@etcd ~]# chmod +x /usr/bin/{cfssl,cfssljson}
[root@etcd ~]# cfssl version
Version: 1.6.3
Runtime: go1.18
2.2、创建默认配置文件
[root@etcd ~]# cfssl print-defaults config > ca-config.json
[root@etcd ~]# cfssl print-defaults csr > ca-csr.json
2.3、证书类型
- 客户端证书用于服务器验证客户端身份
- 服务器证书用于客户端验证服务器端身份
- 对等证书由etcd集群成员使用,同时使用客户端认证和服务器端认证
2.4、创建CA证书
- 由于各个组件都需要配置证书,并且依赖CA证书来签发证书,所以我们首先要生成号CA证书以及后续的签发配置文件
[root@etcd ~]# cd /etc/etcd/
[root@etcd etcd]# mkdir -p etcdca
[root@etcd etcd]# cd etcdca/
- 修改ca-config配置
[root@etcd etcdca]# cat ca-config.json
{"signing": {"default": {"expiry": "43800h"},"profiles": {"server": {"expiry": "43800h","usages": ["signing","key encipherment","server auth"]},"client": {"expiry": "43800h","usages": ["signing","key encipherment","client auth"]},"peer": {"expiry": "43800h","usages": ["signing","key encipherment","server auth","client auth"]}}}
}
- 配置证书请求
[root@etcd etcdca]# cat ca-csr.json
{"CN": "Etcd","key": {"algo": "rsa","size": 2048},"names": [{"C": "CN","ST": "BeiJing","L": "BeiJing","O": "Etcd","OU": "CA"}]
}
- 生成CA证书
[root@etcd etcdca]# cfssl gencert -initca ca-csr.json | cfssljson -bare ca -
[root@etcd etcdca]# ls
ca-config.json ca.csr ca-csr.json ca-key.pem ca.pem### 生成的文件中有下面三个后面会用到:
ca-key.pem: CA证书密钥
ca.pem: CA证书
ca-config.json: 证书签发配置, 用CA证书来签发其他证书时需要用csr文件字段解释CN: Common Name, apiserver从证书中提取该字段作为请求的用户名Organization, apiserver从证书中提取该字段作为请求用户所属的组(Group)
- 由于这里是CA证书, 是签发其他证书的根证书, 这个证书密钥不会分发出去作为client证书, 所有组件使用的client证书都是由CA证书签发而来, 所以CA证书的CN和O的名称才是有用的。
2.5、生成服务器端证书
- 注意hosts字段需要加上etcd全部节点的IP/主机名信息以及127.0.0.1
[root@etcd etcdca]# cat server-csr.json
{"CN": "server","hosts": ["127.0.0.1","192.168.93.101"],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "CN","L": "Shanghai","ST": "Shanghai"}]
}# 创建服务器端证书和私钥
[root@etcd etcdca]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=server server-csr.json | cfssljson -bare server# 生成以下文件
[root@etcd etcdca]# ls server*
server.csr server-csr.json server-key.pem server.pem
2.6、生成客户端证书
[root@etcd etcdca]# cat client-csr.json
{"CN": "client","hosts": [""],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "CN","L": "Shanghai","ST": "Shanghai"}]
}# 创建客户端证书和私钥
[root@etcd etcdca]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=client client-csr.json | cfssljson -bare client# 生成以下文件
[root@etcd etcdca]# ls client*
client.csr client-csr.json client-key.pem client.pem
2.7、生成对等证书
- peer证书可以统一,也可以分别生成,如果需要统一,则需要在hosts字段加上所有节点的IP/主机名信息,如果分开生成,则hosts字段只需要填写对应节点的IP/主机名信息即可
[root@etcd etcdca]# cat peer-csr.json
{"CN": "peer","hosts": ["192.168.93.101"],"key": {"algo": "ecdsa","size": 256},"names": [{"C": "CN","L": "Shanghai","ST": "Shanghai"}]
}# 创建对等证书和私钥
[root@etcd etcdca]# cfssl gencert -ca=ca.pem -ca-key=ca-key.pem -config=ca-config.json -profile=peer peer-csr.json | cfssljson -bare peer# 生成以下文件
[root@etcd etcdca]# ls peer*
peer.csr peer-csr.json peer-key.pem peer.pem
2.8、更新系统证书库
[root@etcd etcdca]# yum install ca-certificates -y
[root@etcd etcdca]# update-ca-trust
2.9、修改etcd配置并重启etcd
- 主要是将原本的http链接全部改为https,并指定证书密钥地址
[root@etcd etcdca]# cat /etc/etcd/etcd.conf
# 节点名称
name: 'etcd-1'# 指定节点的数据存储目录
data-dir: '/etc/etcd/data'# 对外提供服务的地址(客户端连接地址)—— 改为 https
listen-client-urls: 'https://192.168.93.101:2379,https://127.0.0.1:2379'# 广播给客户端的地址(其他组件如 kube-apiserver 会用这个地址连你)
advertise-client-urls: 'https://192.168.93.101:2379'# Peer 通信地址(集群内部通信,单节点也需配置)—— 改为 https
listen-peer-urls: 'https://192.168.93.101:2380'
initial-advertise-peer-urls: 'https://192.168.93.101:2380'# 集群初始化配置(单节点)
initial-cluster: 'etcd-1=https://192.168.93.101:2380'
initial-cluster-token: 'etcd-cluster-1'
initial-cluster-state: 'new'# 客户端加密
client-transport-security:cert-file: "/etc/etcd/etcdca/server.pem"key-file: "/etc/etcd/etcdca/server-key.pem"client-cert-auth: Truetrusted-ca-file: "/etc/etcd/etcdca/ca.pem"# 节点加密
peer-transport-security:cert-file: "/etc/etcd/etcdca/peer.pem"key-file: "/etc/etcd/etcdca/peer-key.pem"client-cert-auth: Truetrusted-ca-file: "/etc/etcd/etcdca/ca.pem"
[root@etcd etcdca]# systemctl restart etcd
2.10、访问验证
[root@etcd etcdca]# etcdctl --endpoints=https://192.168.93.101:2379 --cacert=ca.pem --cert=client.pem --key=client-key.pem endpoint status --cluster -w table
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| https://192.168.93.101:2379 | 8e9e05c52164694d | 3.4.23 | 20 kB | true | false | 3 | 6 | 6 | |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
