写点什么

使用 Docker 部署 etcd、启用身份验证

作者:向东是大海
  • 2023-08-16
    广东
  • 本文字数:2409 字

    阅读完需:约 8 分钟

一、etcd 介绍

  1. etcd 是一个高可用的键值存储系统,主要用于共享配置和服务发现。它使用 Go 语言开发,具有快速、可靠和简单等特点。

  2. etcd 在分布式系统中的应用非常广泛,主要用于共享配置和服务发现。它提供了一个可靠的键值存储,可用于存储应用程序配置、服务发现信息和其他重要的元数据。

  3. etcd 基于 Raft 协议,能够提供分布式一致性,并且可以在多个节点之间复制数据以确保数据的可靠性和可用性。etcd 还提供了易于使用的 HTTP API,使得客户端可以轻松地与它进行交互。它广泛应用于容器编排、微服务架构、分布式系统等领域。

  4. etcd 的 watch 功能是一种实时监听机制,用于监控 etcd 数据库中的数据变化。当 watch 指定的 key 或范围发生变化时,etcd 会通知 watch 的回调函数,以便执行相应的操作。

二、从 docker hub 查找 etcd 镜像

docker search etcd
复制代码

排在前面的是星数最多的,这里选择第一个,即 bitnami/etcd

二、拉取 etcd 镜像

docker pull bitnami/etcd:3.5.9
复制代码

拉取镜像后,可以使用 docker images 命令查看镜像

二、准备 etcd 数据保存文件夹和 etcd 配置文件

  • etcd 的配置文件保存在宿主机中,方便以后修改配置

  • Linux 的系统卷的空间一般都不大,所以 etcd 数据保存在宿主机的 /data 文件夹

1、创建 data 和 conf 文件夹
mkdir -p /data/etcd/etcd01/data /data/etcd/etcd01/conf
复制代码
  • -p 参数用于递归创建文件夹。

  • 不带选项 -p 参数时,所创建的文件夹的父文件夹必须已存在。

2、文件夹授权
chmod -R 777 /data/etcd/etcd01/datachmod -R 777 /data/etcd/etcd01/conf
复制代码

授权后,以便 docker 容器有权读写这 data 和 conf 文件夹

3、编辑 etcd 配置文件

etcd 的配置文件是 yaml 格式文件。

vim /data/etcd/etcd01/conf/etcd.yml

#成员名称name: etcd01# 数据保存路径data-dir: /data#对外提供服务的地址listen-client-urls: http://0.0.0.0:2379#成员之间通信地址listen-peer-urls: http://0.0.0.0:2380#此成员的客户端URL列表,用于通告群集的其余部分。这些URL可以包含域名advertise-client-urls: http://etcd01:2379
复制代码

etcd 示例配置文件参考:

https://github.com/etcd-io/etcd/blob/main/etcd.conf.yml.sample

三、创建容器并启动

1、启动容器
docker run -d --name etcd -p 2379:2379 -p 2380:2380 \-e ALLOW_NONE_AUTHENTICATION=yes \-e ETCD_CONFIG_FILE=/opt/bitnami/etcd/conf/etcd.yml \-v /data/etcd/etcd01/data:/data \-v /data/etcd/etcd01/conf:/opt/bitnami/etcd/conf \bitnami/etcd:3.5.9
复制代码
2、参数说明

--name 指定容器名称

-d 在后台允许容器

-p 容器端口号,格式:主机端口:容器端口

-e 给容器设置环境变量

-v 将宿主机的目录挂载到容器里,格式:主机目录:容器目录

环境变量 ALLOW_NONE_AUTHENTICATION etcd 不使用身份认证

环境变量 ETCD_CONFIG_FILE 指定 etcd 配置文件

3、容器启动失败时,可查看容器的日志
docker logs --tail 100 etcd
复制代码
4、设置容器开机自动启动
docker update --restart=always etcd
复制代码

三、进入 etcd 容器

进入容器命令需要添加 -u root 参数

docker exec -u root -it etcd /bin/bash
复制代码

未使用 -u root 参数时,会出现 I have no name!

四、验证安装

1、查看 etcd 版本
etcd --version
复制代码

etcd Version: 3.5.9

Git SHA: bdbbde9

Go Version: go1.19.10

Go OS/Arch: linux/amd64

2、查看 etcd 集群成员
etcdctl member list --write-out=table
复制代码

其中 name etc01 是配置文件 /data/etcd/etcd01/conf/etcd.yml 指定的。

四、etcd 基本操作

1、设置 key 的值
etcdctl put foo f1
复制代码

foo 是 key, f1 是值

2、获取 key 的值
etcdctl get foo
复制代码
3、获取指定前缀的所有 key 和值
etcdctl get foo --prefix
复制代码

获取 foo 开头的所有 key 的值。

如果要获取所有的 key 可以用空字符串代替 foo,即,单引号、双引号都可以:

etcdctl get '' --prefix 或 etcdctl get "" --prefix

4、获取 key 历史版本值
etcdctl get foo --rev=130
复制代码

rev 是服务端全局数据版本号

6、监控 key 的值的变化
etcdctl watch foo
复制代码
  • 执行上面的命令后,会阻塞等待

  • 在另外一个终端修改 foo 的值进行测试(如:etcdctl put foo f2)

7、查询数据版本号
etcdctl get foo -w=json
复制代码

{"header":{"cluster_id":7218864286076089875,"member_id":1942583214888227186,"revision":130,"raft_term":4},"kvs":[{"key":"Zm9v","create_revision":129,"mod_revision":130,"version":2,"value":"ZjE="}],"count":1}

说明:

  • cluster_id : 请求的 etcd 集群 ID

  • member_id : 请求的 etcd 节点 ID

  • revision : etcd 服务端当前全局数据版本号。对任一 key 的 put 或 delete 操作都会使 revision 加 1。revision=1 是 etcd 的保留版本号,因此用户的 key 版本号将从 2 开始

  • raft_term : etcd 当前 raft 主节点任期号

  • create_revision : 当前 key 创建时全局数据版本号 revision 的值

  • mod_revision : 当前 key 最后一次修改时全局数据版本号 revision 的值

  • version : 当前 key 的数据版本号。key 创建时 version 为 1,对当前 key 进行 put 操作会使 version 自增 1,将 key 删除后,重新创建,version 又会从 1 开始

8、删除 key
etcdctl del foo
复制代码

五、启用 etcd 身份验证

1、查看是否启用身份认证
etcdctl auth status
复制代码

Authentication Status: false

AuthRevision: 6

2、查看角色列表
etcdctl role list
复制代码
3、查看用户列表
etcdctl user list
复制代码
4、新增角色
etcdctl role add root
复制代码
5、新增用户
etcdctl user add root
复制代码
6、给用户分配角色
etcdctl user grant-role root root
复制代码
7、获取用户信息
etcdctl user get root
复制代码
8、获取角色信息
etcdctl role get root
复制代码
9、为角色设置某个 key 的权限
etcdctl role grant-permission root readwrite /
复制代码
10、启用身份验证
etcdctl auth enable
复制代码

Authentication Enabled

启用身份验证后,绝大部分的命令都需要添加用户和密码参数:--user=root --password=密码

11、禁用身份验证
etcdctl auth disable --user=root --password=123
复制代码

Authentication Disabled

13、修改密码
etcdctl user passwd root --user=root --password=123
复制代码


发布于: 23 小时前阅读数: 27
用户头像

先精之,再思之,五六分把握即做之。 2020-06-24 加入

还未添加个人简介

评论

发布
暂无评论
使用 Docker 部署 etcd、启用身份验证_etcd_向东是大海_InfoQ写作社区