使用docker运行etcd单实例/集群(代码片段)

NezhaYoung NezhaYoung     2023-04-25     664

关键词:

一. 介绍

本文描述了如何使用docker搭建etcd集群,github/etcd上有单实例etcd服务的搭建方法,包括linux,mac,docker。

在操作之前你需要安装docker
docker-compose 是可选的,如果你不想使用 docker-compose 就跳过他

二. etcd 单实例

1. 准备

a. 创建本机数据存储目录

创建本机目录,用于挂载到容器来保存etcd data
你可以更换目录位置

rm -rf /tmp/etcd/single/data 
mkdir -p /tmp/etcd/single/data
mkdir -p /tmp/etcd/single/conf

b. 关闭本机 etcd 服务

没有就跳过

ubuntu
systemctl stop etcd

mac
brew services stop etcd

c.编写 etcd config

打开etcd.yml
vim /tmp/etcd/single/conf/etcd.yml

name: s1
data-dir: /etcd-data
listen-client-urls: http://0.0.0.0:2379
advertise-client-urls: http://0.0.0.0:2379
listen-peer-urls: http://0.0.0.0:2380
initial-advertise-peer-urls: http://0.0.0.0:2380
initial-cluster: s1=http://0.0.0.0:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new
log-level: info
logger: zap
log-outputs: stderr

config 介绍

  1. name 节点的名字,在集群中必须唯一
  2. data-dir 存储数据的路径,注意这是容器内部路径
  3. listen-client-urls:这个参数用于指定 etcd 服务监听客户端请求的地址和端口。客户端(如 etcdctl 命令行工具、其他使用 etcd 客户端库的应用程序)将通过这些地址与 etcd 服务进行通信,以执行各种操作,如读取、写入和修改键值对.http://127.0.0.1:2379就只能内网访问,http://0.0.0.0:2379 则表示 etcd 服务将在所有可用的 IPv4 网络接口上监听客户端请求
  4. advertise-client-urls:这个参数用于告知客户端和其他 etcd 成员如何访问 etcd 服务器。这些 URL 通常是可以从集群外部访问的地址。客户端和其他 etcd 服务器将使用这些地址与 etcd 服务进行通信。
  5. listen-peer-urls:这个参数用于指定 etcd 服务监听其他 etcd 集群成员节点间通信请求的地址和端口。这个参数对于 etcd 集群的节点之间的数据同步、心跳检测和集群管理等操作至关重要。
  6. initial-advertise-peer-urls:这个参数用于指定 etcd 服务在初始化时向其他 etcd 集群成员宣告其可用于集群间通信的地址和端口。其他 etcd 成员节点将使用这些地址与当前 etcd 服务进行通信,进行数据同步、心跳检测和集群管理等操作。
  7. initial-cluster:这个参数用于在 etcd 集群初始化时定义集群内所有成员的列表。它是一个逗号分隔的键值对列表,键是成员的名称,值是对应的 initial-advertise-peer-urls。当一个新的 etcd 节点加入集群时,它需要知道集群内其他成员的信息,这个参数就是提供这些信息的途径。

2.下载 etcd image

docker pull gcr.io/etcd-development/etcd:v3.4.25

3. 使用 docker-compose 启动 etcd

a. 编写 docker-compose

vim ~/docker-compose.yml

version: \'3.8\'

services:
  etcd-single:
    image: gcr.io/etcd-development/etcd:v3.4.25
    restart: on-failure
    entrypoint: ["/usr/local/bin/etcd", "--config-file", "/tmp/etcd/conf/etcd.yml"]
    ports:
      - "2379:2379"
      - "2380:2380"
    environment:
      ETCDCTL_API: 3
    volumes:
      - type: bind
        source: /tmp/etcd/single/
        target: /tmp/etcd

b. 参数介绍

  • etcd-single: 容器名称
  • image: 容器使用的docker镜像
  • restart: 设置自动重启策略,这里是当容器退出时,只有当退出码非 0 时才重启容器。
  • entrypoint: 入口点(初学者很容易和 command 搞混)
  • ports: 将容器内端口映射到主机端口,以便从主机或外部网络访问容器中的服务
  • environment: 设置容器的环境变量
  • volumes: 在启动容器时挂载volume或绑定主机目录,这里使用bind绑定刚才创建的主机目录

c. 运行容器

# --detach 在后台运行容器
# up 启动或重启配置的所有容器
docker-compose up  --detach 

d. 管理容器

docker-compose的配置文件中可以定义多个容器,从而来一条命令启动/停止多个容器,通过命令最后添加容器名(刚才定义的etcd-single)可以只操作一个容器

# 查看容器状态
docker-compose ps -a

# 查看容器日志
docker-compose logs --detach

# 停止容器
docker-compose stop

# 启动停止的容器
docker-compose start

# 停止并删除容器
docker-compose down

e. 如何使用我们刚启动的 etcd

  1. 通过容器内部的 etcdctl 读写 etcd
# exec 命令需要指定容器名,也就是etcd-single
# 容器名后面参数是在容器内部执行的命令
docker-compose exec etcd-single etcdctl get foo
  1. 通过本机etcdctl
# 因为我们将容器端口映射到主机端口上,并且是 etcd 默认端口
# 所以我们可以像使用本地服务一样使用 etcd 容器
# 当然前提是你本机已经安装了 etcdctl

# 设置请求版本
export ETCDCTL_API=3

etcdctl put foo bar
etcdctl get foo
  1. 远程访问本机
    添加参数--endpoints=[127.0.0.1:2379],
    如果你没有外网 ip 就只能在局域网使用局域网 ip 访问,
    否则可以在任意位置通过 ip:port 访问

4. 使用 docker run 启动 etcd

a. 运行容器

这条命令与编写docker-compose.yml 没有区别

docker run \\
  -d \\
  -p 2379:2379 \\
  -p 2380:2380 \\
  -e ETCDCTL_API=3 \\
  --mount type=bind,source=/tmp/etcd/single,destination=/tmp/etcd \\
  --name etcd-single \\
  gcr.io/etcd-development/etcd:v3.4.25 \\
  /usr/local/bin/etcd \\
  --config-file /tmp/etcd/conf/etcd.yml

b. 参数介绍

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

  • -d 后台运行容器
  • -p--publish localhost-port:cantainer-port将容器内端口映射到主机端口,以便从主机或外部网络访问容器中的服务,
  • --mount 在启动容器时挂载volume或绑定主机目录,这里使用bind绑定刚才创建的主机目录,
  • --name 指定运行的容器的名称,方便管理,如果没有指定将会生成一个随机的容器名
  • gcr.io/etcd-development/etcd:v3.4.25 要运行的容器的镜像名称
  • 后续参数是容器内部执行的命令,在这里是使用配置文件启动 etcd

c. 管理 etcd

# docker ps -a
# 查看日志
docker logs etcd-single

# 停止容器
docker stop etcd-single

# 启动停止的容器
docker start etcd-single

# 删除容器
docker rm etcd-single

d. 使用 etcd

使用容器内部的 etcdctl

docker exec etcd-single etcdctl put foo bar
docker exec etcd-single etcdctl get foo

其他方法和 docker-compose上的相同

三. etcd 集群

因为 etcd 使用 raft 一致性协议, 所以最少需要 3 个节点
我们将使用 docker 创建 3 个 etcd 节点在本机搭建 etcd 集群

1. 准备

a. 创建数据目录与配置目录

与单节点相似

rm -rf /tmp/etcd/cluster

# node1
mkdir -p /tmp/etcd/cluster/edcd1/data  
mkdir -p /tmp/etcd/cluster/edcd1/conf  

# node2
mkdir -p /tmp/etcd/cluster/edcd2/data  
mkdir -p /tmp/etcd/cluster/edcd2/conf  

# node3
mkdir -p /tmp/etcd/cluster/edcd3/data  
mkdir -p /tmp/etcd/cluster/edcd3/conf  

b. 编写配置etcd config

每一个节点的 config 都类似,在这里我们之给出node1 的 config

vim /tmp/etcd/cluster/edcd1/conf/etcd.yml

# 其他node 分别将 `etcd1`改为 `etcd2`/ `etcd3`
name: etcd1
data-dir: /etcd/data
# 其他node 分别下面的将`172.25.0.101`改为`172.25.0.102`/ `172.25.0.103`
listen-client-urls: http://172.25.0.101:2379, http://127.0.0.1:2379
advertise-client-urls: http://172.25.0.101:2379
listen-peer-urls: http://172.25.0.101:2380
initial-advertise-peer-urls: http://172.25.0.101:2380
# 这里之后不需要改
initial-cluster: etcd1=http://172.25.0.101:2380,etcd2=http://172.25.0.102:2380,etcd3=http://172.25.0.103:2380
initial-cluster-token: etcd-cluster-token
initial-cluster-state: new

2. docker-compose

a. docker-compose 配置文件

version: \'3.8\'

services:
  etcd-1:
    image: gcr.io/etcd-development/etcd:v3.4.25
    entrypoint: [ "/usr/local/bin/etcd", "--config-file", "/tmp/etcd/conf/etcd.yml" ]
    ports:
      - "23791:2379"
    environment:
      ETCDCTL_API: 3
    volumes:
      - type: bind
        source: /tmp/etcd/cluster/etcd1
        target: /tmp/etcd
    networks:
      etcd-net:
        ipv4_address: 172.25.0.101

  etcd-2:
    image: gcr.io/etcd-development/etcd:v3.4.25
    entrypoint: [ "/usr/local/bin/etcd", "--config-file", "/tmp/etcd/conf/etcd.yml" ]
    ports:
      - "23792:2379"
    environment:
      ETCDCTL_API: 3
    volumes:
      - type: bind
        source: /tmp/etcd/cluster/etcd2
        target: /tmp/etcd
    networks:
      etcd-net:
        ipv4_address: 172.25.0.102

  etcd-3:
    image: gcr.io/etcd-development/etcd:v3.4.25
    entrypoint: [ "/usr/local/bin/etcd", "--config-file", "/tmp/etcd/conf/etcd.yml" ]
    ports:
      - "23793:2379"
    environment:
      ETCDCTL_API: 3
    volumes:
      - type: bind
        source: /tmp/etcd/cluster/etcd3
        target: /tmp/etcd
    networks:
      etcd-net:
        ipv4_address: 172.25.0.103

networks:
  etcd-net:
    driver: bridge
    ipam:
      config:
        - subnet: 172.25.0.0/16
          gateway: 172.25.0.1

b. 参数介绍

可以看到整体上每个容器和之前还是很相似的,只是做出了一点点修改

  • 最外层networks 等同于docker network create etcdnet --subnet 172.25.0.0/16
  • 容器内部networks然后我们在容器内使用该 network 并给每个容器分配一个 ipv4 地址
  • ports: 如果是使用其他Linux系统的用户则不必配置这个端口映射,Linxu系统会自动帮我们处理好ip之间的互通(宿主机和各个容器之间)。而Mac想要直接访问容器的ip,则需要曲线救国,通过搭建一个vpn服务,然后通过vpn再去和容器的网段互联。

c. 运行并使用etcd cluster

大致操作和单节点etcd 相同
只是在本机访问etcd容器时需要指定--endpoints=
ubuntu

etcdctl --endpoints="172.25.0.101:2379" put foo bar
etcdctl --endpoints="172.25.0.101:2379" get foo

mac(可以看其他,配置成功后就可以使用上面的命令直接访问 etcd cluster)

etcdctl --endpoints="127.0.0.1:23791" put foo bar
etcdctl --endpoints="127.0.0.1:23791" get foo

四. 其他

1. mac 下主机不能直接访问容器 ip

在 Mac 主机上,Docker 通过使用名为 "Docker Desktop" 的虚拟化技术实现。由于这种虚拟化方法的限制,主机到容器子网的网络访问与 Linux 主机上的 Docker 有所不同。

a. 解决方法1, 使用端口映射

在 docker-compose.yml 中使用ports 将容器内部端口映射到主机端口上,
注意,一个端口只能映射一个容器,所以我们使用23791,23792,23793
也就是我们目前使用的方法

b. 使用 vpn

mac 下主机和容器网络互通解决方案

参考

使用docker创建etcd集群
chat-gpt4

二进制部署k8s单节点(代码片段)

...器集群网络部署1.写入分配的子网段到etcd中,供flanel使用2.拷贝flannel包到node节点3.配置文件和启动脚本4.启动flannel5.配置docker连接flannel6.重启docker7.查看flannel网络四、部署Master组件1.生成k8s证书2.将证书复制到相应目录3.部署ap... 查看详情

dockeroverlay应用部署(代码片段)

DockerOverlay部署条件要想使用Docker原生Overlay网络,需要满足以下任意条件: 1、Docker运行在Swarm模式 2、使用键值存储的Docker主机集群本次部署使用键值存储的Docker主机集群,需要满足以下条件:1.集群中主机连接到键值存... 查看详情

kubernetes集群之二进制安装部署(单master节点)(代码片段)

...er01节点上操作验证etcd集群状态四、在所有Node节点上部署Docker引擎五、Flannel网络配置5.1不同Node上Pod之间的通信?5.2通信方式之:OverlayNetwork与VXLAN5.3Flannel介绍5.4Flannel的工作流程5.5ETCD之Flannel提供说明5.6Flannel配置配置步骤... 查看详情

k8s------kubernetes单master集群二进制搭建(代码片段)

...节点6.在其他节点修改etcd配置文件7.检查群集状态二.部署docker引擎三.Flannel网络配置1.添加flannel网络配置信息2.安装并启动Flannel服务3.配置Docker连接Flannel4.在两个Node节点内创建Docker容器,进行测试四.部署master组件1.上传安装... 查看详情

二进制部署k8s单节点(代码片段)

...修改配置文件3.5启动etcd,查看集群状态二、Node部署docker1.所有node部署docker2.镜像加速三、Flanne 查看详情

kubernetes单master节点集群二进制部署(代码片段)

目录前言Kubernetes单Master节点集群二进制部署一.Kubernetes单Master集群架构二.环境准备三.Etcd集群部署1.准备签发证书环境2.生成CA证书、etcd服务器证书以及私钥3.安装Etcd4.在Master01节点启动Etcd集群节点015.将证书,命令文件,... 查看详情

kubernetes集群之二进制安装部署(单master节点)(代码片段)

...见的K8S按照部署方式二、安装部署分析三、首先部署ETCD集群3.1ETCD介绍3.2准备CFSSL证书签发环境3.3环境部署3.3.1搭建ETCD步骤3.3.2下载准备CFSSL证书制作工具3.3.3上传etcd-cert.sh和etcd.sh到/opt/k8s/目录中3.3.4安装ETCD服务3.3.5配置ETCD集群3.3.... 查看详情

kubernets集群二进制单节点部署(代码片段)

...本2.2、定义证书两个脚本3.3、ETCD集群部署2、node节点部署docker3、flannel网络集群 查看详情

k8s------kubernetes单master集群二进制搭建(代码片段)

目录前言Kubernetes单Master节点集群二进制部署一.Kubernetes单Master集群架构二.环境准备三.Etcd集群部署1.准备签发证书环境2.生成CA证书、etcd服务器证书以及私钥3.安装Etcd4.在Master01节点启动Etcd集群节点015.将证书,命令文件,... 查看详情

k8s------kubernetes单master集群二进制搭建(代码片段)

目录前言Kubernetes单Master节点集群二进制部署一.Kubernetes单Master集群架构二.环境准备三.Etcd集群部署1.准备签发证书环境2.生成CA证书、etcd服务器证书以及私钥3.安装Etcd4.在Master01节点启动Etcd集群节点015.将证书,命令文件,... 查看详情

docker部署nginxtomcat集群(代码片段)

Tomcat集群由多个tomcat组成,使用Nginx的好处是可以实现负载均衡和动静分离。使用Docker的好处是~~~我们不需要复杂的配置,只需要执行简单的命令就能拉取已有的官方docker镜像,再通过一条命令就能运行我们的实例了。对于多个T... 查看详情

云原生k8s精选的分布式可靠的键值存储etcd原理和实践(代码片段)

...和介绍一些常见命令。@目录概述定义应用场景特性为何使用etcd术语架构原理读操作写操作日志复制部署单示例快速部署多实例集群部署静态etcd动态发现常见命令概述定义etcd官网地址https://etcd.io/最新版本3.5.7etcd官网文档地址http... 查看详情

2etcd单机部署和集群部署(代码片段)

...次部署是在centos7系统,cpu为amd64上面进行的。部署是直接使用官方编译好的二进制文件,大家也可以直接看ectd-releases界面选择需要的版本,进行部署。部署步骤如下:1、下载官方编译好的二进制文件。大家可以根据自己的系统... 查看详情

kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)(代码片段)

...部署etcd集群master01上操作部署在node节点上修改配置部署Docker引擎flannel网络配置常见的通信方式flannel的工作流程flannel的搭建部署总结常见的K8s按照部署方式MinikubeMinikube是一个工具,可以在本地快速运行一个单节点微型K8Sÿ... 查看详情

kubernetes节点服务搭建————二进制部署|单master节点配置(一)(etcd和flannel)(代码片段)

...部署etcd集群master01上操作部署在node节点上修改配置部署Docker引擎flannel网络配置常见的通信方式flannel的工作流程flannel的搭建部署总结常见的K8s按照部署方式MinikubeMinikube是一个工具,可以在本地快速运行一个单节点微型K8Sÿ... 查看详情

kubernetes二进制部署(单master节点)(理论部分,详细部署步骤在下一篇哦~)(代码片段)

...2、签发证书步骤3、etcd-cert.sh和etcd.sh脚本4、部署流程5、使用证书访问的工作流程:四、部署docker引擎五、flannel网络配置1、K8S中Pod网络通信:2、Flannel3、Flannel工作原理:4、搭建flannel5、flannel的操作流程一、部署master组件二、部署nod... 查看详情

docker容器之patroni篇(代码片段)

...PG高可用工具,越来越多的被各个厂商用于云环境下使用。patroni基本架构如图所示:etcd作为分布式注册中心、进行集群选主工作;vip-manager为主节点设置漂移IP;patroni负责引导集群的创建、运行和管理工作,... 查看详情

2二进制方式搭建k8s集群(代码片段)

... 生成ETCD证书2.3下载ETCD的二进制文件2.4部署ETCD集群3安装Docker4部署Master-Node4.1 生成kube-apiserver证书4.2下载并解压二进制文件4.3部署kube-a 查看详情