【ETCD】ETCD单节点二进制部署(TLS)

ETCD单节点二进制部署(TLS)

文章目录

资源列表

操作系统 配置 主机名 IP
openEuler 2C4G etcd 192.168.93.101

基础环境

  • 关闭防火墙
bash 复制代码
systemctl stop firewalld
systemctl disable firewalld
  • 关闭内核安全机制
bash 复制代码
setenforce 0
sed -i "s/^SELINUX=.*/SELINUX=disabled/g" /etc/selinux/config
  • 修改主机名
bash 复制代码
hostnamectl set-hostname etcd

一、安装部署(单机)

  • 如果是在测试或者开发环境,想要测试和使用etcd服务,只需要部署一个单节点的etcd服务即可。

1.1、二进制文件部署

  • 下载安装软件
bash 复制代码
[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
  • 添加环境变量
bash 复制代码
[root@etcd ~]# vim /etc/profile
# 末尾添加即可
export PATH="$PATH:/usr/local/etcd"


# 刷新环境变量
[root@etcd ~]# source /etc/profile
  • 验证客户端工具是否可用
bash 复制代码
[root@etcd ~]# etcdctl version
etcdctl version: 3.4.23
API version: 3.4

1.2、添加system服务管理

bash 复制代码
# 创建配置文件目录
[root@etcd ~]# mkdir -p /etc/etcd


# 创建数据目录里
[root@etcd ~]# mkdir -p /etc/etcd/data
  • 创建system服务配置
bash 复制代码
[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配置文件
bash 复制代码
[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服务并添加开机自启动
bash 复制代码
[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、验证

  • 查看集群状态
bash 复制代码
[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
bash 复制代码
[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
bash 复制代码
[root@etcd ~]# mv cfssl_1.6.3_linux_amd64 /usr/bin/cfssl
[root@etcd ~]# mv cfssljson_1.6.3_linux_amd64 /usr/bin/cfssljson
bash 复制代码
[root@etcd ~]# chmod +x /usr/bin/{cfssl,cfssljson}
[root@etcd ~]# cfssl version
Version: 1.6.3
Runtime: go1.18

2.2、创建默认配置文件

bash 复制代码
[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证书以及后续的签发配置文件
bash 复制代码
[root@etcd ~]# cd /etc/etcd/
[root@etcd etcd]# mkdir -p etcdca
[root@etcd etcd]# cd etcdca/
  • 修改ca-config配置
bash 复制代码
[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"
                ]
            }
        }
    }
}
  • 配置证书请求
bash 复制代码
[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证书
bash 复制代码
[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
bash 复制代码
[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、生成客户端证书

bash 复制代码
[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/主机名信息即可
bash 复制代码
[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、更新系统证书库

bash 复制代码
[root@etcd etcdca]# yum install ca-certificates -y
[root@etcd etcdca]# update-ca-trust

2.9、修改etcd配置并重启etcd

  • 主要是将原本的http链接全部改为https,并指定证书密钥地址
bash 复制代码
[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: True
  trusted-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: True
  trusted-ca-file: "/etc/etcd/etcdca/ca.pem"
bash 复制代码
[root@etcd etcdca]# systemctl restart etcd

2.10、访问验证

bash 复制代码
[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 |        |
+-----------------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
相关推荐
没有bug.的程序员2 小时前
Eureka 注册中心原理与服务注册发现机制
java·spring·云原生·eureka·架构·注册中心·服务注册发现
行者游学2 小时前
ETCD 压力测试脚本
数据库·压力测试·etcd
春生野草3 小时前
SpringBoot配置文件
java·数据库·spring boot
奇点 ♡3 小时前
MySQL基础题
数据库·sql·mysql
唐古乌梁海3 小时前
【mysql】MySQL 数据库迁移
数据库·mysql·adb
啊吧怪不啊吧3 小时前
SQL之表的时间类内置函数详解
大数据·服务器·数据库·sql
2503_928411563 小时前
11.5 包和包管理器
数据库·arcgis·node.js·编辑器
JanelSirry3 小时前
真实场景:防止缓存穿透 —— 使用 Redisson 布隆过滤器
数据库·mysql·缓存·redisson·布隆过滤器
mmm.c3 小时前
mysql启动提示1067:进程意外终止
数据库·mysql