2024 年云原生运维实战文档 99 篇原创计划 第 004 篇 |Docker 最佳实战「2024」系列 第 004 篇
你好,欢迎来到运维有术。
今天分享的内容是 Docker 最佳实战「2024」 系列文档中的 Docker 部署单节点 etcd 实战。
内容导图
实战服务器配置 (架构 1:1 复刻小规模生产环境,配置略有不同)
主机名 | IP | CPU(核) | 内存(GB) | 系统盘(GB) | 数据盘(GB) | 用途 |
---|---|---|---|---|---|---|
docker-node-1 | 192.168.9.81 | 4 | 16 | 40 | 100 | Docker 节点 1 |
docker-node-2 | 192.168.9.82 | 4 | 16 | 40 | 100 | Docker 节点 2 |
docker-node-3 | 192.168.9.83 | 4 | 16 | 40 | 100 | Docker 节点 3 |
合计 | 3 | 12 | 48 | 120 | 300 |
实战环境涉及软件版本信息
目前主流的 etcd 容器化部署方案可用的容器有以下两种:
quay.io/coreos/etcd:v3.5.12
bitnami/etcd:3.5.12
etcd 服务的配置有三种方式 :
采用系统环境变量配置 etcd 服务说明:
lower_case_with_underscores
。参考 wiki 百科本实战课程采用 coreos 官方提供的 etcd 镜像,部署单节点的 etcd 服务,并分别演示使用配置文件和环境变量的方式实现 etcd 服务配置。
为什么选择 coreos 镜像?
本节内容使用配置文件的方式实现 etcd 服务配置。
mkdir -p /data/containers/etcd/{data,config}
etcd 服务配置文件路径为:/data/containers/etcd/config/etcd.conf.yml
文件内容如下:
name: etcd-s1
data-dir: /var/etcd
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: etcd-s1=http://0.0.0.0:2380
initial-cluster-token: etcd-cluster
initial-cluster-state: new
logger: zap
log-level: info
#log-outputs: stderr
特殊参数说明:
name: etcd member 名称,可根据实际情况修改 data-dir: etcd 数据目录,可根据实际情况修改 listen-client-urls: client 流量监听地址,没特殊需求按文档填写即可 advertise-client-urls: 该 member 向外部通告的客户端 url 列表,单节点部署时不需要修改,集群部署模式需修改为容器所在节点对外提供服务的 IP listen-peer-urls: peer 流量监听地址,没特殊需求按文档填写即可 initial-advertise-peer-urls: 该 member 向同一集群内其他 member 通告的 peer url 列表,单节点部署时不需要修改,集群部署模式需修改为容器所在节点对外提供服务的 IP initial-cluster: 初始化集群节点信息,单节点部署时不需要修改,集群部署模式需要填写集群中所有 member 的信息 initial-cluster-token: 初始化集群时使用的 token,随便写 initial-cluster-state: 初始化集群状态,可选的值为 new 或者 existing,通常采用 new
version: '3'
services:
etcd:
container_name: etcd-s1
image: quay.io/coreos/etcd:v3.5.12
command: /usr/local/bin/etcd --config-file=/var/lib/etcd/conf/etcd.conf.yml
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data:/var/etcd
- ${DOCKER_VOLUME_DIRECTORY:-.}/config/etcd.conf.yml:/var/lib/etcd/conf/etcd.conf.yml
- "/etc/localtime:/etc/localtime:ro"
ports:
- 2379:2379
- 2380:2380
restart: always
networks:
default:
name: etcd-tier
driver: bridge
特殊参数说明:
networks.default: 创建一个新的使用 bridge 模式的网络 etcd-tier, 名称可以根据需求自定义。
cd /data/containers/etcd
docker compose up -d
命令成功执行的结果如下:
[root@docker-node-1 etcd]# docker compose up -d
[+] Running 1/2
? Network etcd-tier Created 0.4s
? Container etcd-s1 Started
[root@docker-node-1 etcd]# docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
etcd-s1 quay.io/coreos/etcd:v3.5.12 "/usr/local/bin/etcd…" etcd 53 seconds ago Up 53 seconds 0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp
本节内容使用环境变量的方式实现 etcd 服务配置。
mkdir -p /data/containers/etcd/data
version: '3'
services:
etcd:
container_name: etcd-s1
image: quay.io/coreos/etcd:v3.5.12
environment:
- ETCD_NAME=etcd-s1
- ETCD_DATA_DIR=/var/etcd
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://0.0.0.0:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd-s1=http://0.0.0.0:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_LOGGER=zap
- ETCD_LOG_LeveL=info
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data:/var/etcd
- "/etc/localtime:/etc/localtime:ro"
ports:
- 2379:2379
- 2380:2380
restart: always
networks:
default:
name: etcd-tier
driver: bridge
cd /data/containers/etcd
docker compose up -d
[root@docker-node-1 etcd]# docker compose ps -a
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
etcd-s1 quay.io/coreos/etcd:v3.5.12 "/usr/local/bin/etcd" etcd 17 seconds ago Up 16 seconds 0.0.0.0:2379-2380->2379-2380/tcp, :::2379-2380->2379-2380/tcp
为了测试 etcd 服务的可用性,额外再找一台机器安装 etcd 客户端工具用于验证测试。
cd /srv
wget https://github.com/etcd-io/etcd/releases/download/v3.5.12/etcd-v3.5.12-linux-amd64.tar.gz
tar xvf etcd-v3.5.12-linux-amd64.tar.gz
cd etcd-v3.5.12-linux-amd64
# ./etcdctl --endpoints=192.168.9.81:2379 --write-out=table endpoint health
+-------------------+--------+------------+-------+
| ENDPOINT | HEALTH | TOOK | ERROR |
+-------------------+--------+------------+-------+
| 192.168.9.81:2379 | true | 2.517794ms | |
+-------------------+--------+------------+-------+
# ./etcdctl --endpoints=192.168.9.81:2379 --write-out=table endpoint status
+-------------------+-----------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| ENDPOINT | ID | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+-------------------+-----------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 192.168.9.81:2379 | 1c70f9bbb41018f | 3.5.12 | 20 kB | true | false | 2 | 4 | 4 | |
+-------------------+-----------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
# ./etcdctl --endpoints=192.168.9.81:2379 --write-out=table member list
+-----------------+---------+---------+---------------------+---------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+-----------------+---------+---------+---------------------+---------------------+------------+
| 1c70f9bbb41018f | started | etcd-s1 | http://0.0.0.0:2380 | http://0.0.0.0:2379 | false |
+-----------------+---------+---------+---------------------+---------------------+------------+
# 写入数据
# ./etcdctl --endpoints=192.168.9.81:2379 put foo bar
OK
# 读取数据
# ./etcdctl --endpoints=192.168.9.81:2379 get foo
foo
bar
全文所有的操作,我都整理成了自动化脚本:
deploy-etcd-conf.sh
#!/bin/bash
set -e
etcd_name=${1:-"etcd-s1"}
docker_container_dir=${2:-"/data/containers"}
# 创建基础目录
mkdir -p ${docker_container_dir}/etcd/{data,config}
# 创建 etcd 配置文件
function deploy_etcd_config(){
cat > ${docker_container_dir}/etcd/config/etcd.conf.yml <<-EOF
name: ${etcd_name}
data-dir: /var/etcd
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: etcd-s1=http://0.0.0.0:2380
initial-cluster-token: etcd-cluster
initial-cluster-state: new
logger: zap
log-level: info
#log-outputs: stderr
EOF
}
# 创建 docker-compose 文件
function deploy_compose_config(){
cat > ${docker_container_dir}/etcd/docker-compose.yml <<-EOF
version: '3'
services:
etcd:
container_name: ${etcd_name}
image: quay.io/coreos/etcd:v3.5.12
command: /usr/local/bin/etcd --config-file=/var/lib/etcd/conf/etcd.conf.yml
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data:/var/etcd
- ${DOCKER_VOLUME_DIRECTORY:-.}/config/etcd.conf.yml:/var/lib/etcd/conf/etcd.conf.yml
- "/etc/localtime:/etc/localtime:ro"
ports:
- 2379:2379
- 2380:2380
restart: always
networks:
default:
name: etcd-tier
driver: bridge
EOF
}
# 创建 etcd 服务
function deploy_etcd(){
cd ${docker_container_dir}/etcd
docker compose up -d
}
# 验证 etcd 服务
function check_etcd(){
cd ${docker_container_dir}/etcd
docker compose ps
}
echo -e "\033[1;32m 1.Deploy etcd config.\n \033[0m"
deploy_etcd_config
echo -e "\033[1;32m 2.Deploy docker compose config.\n \033[0m"
deploy_compose_config
echo -e "\033[1;32m 3.Deploy etcd service.\n \033[0m"
deploy_etcd
echo -e "\033[1;32m 4.Check etcd service status. \033[0m"
check_etcd
deploy-etcd-env.sh
#!/bin/bash
set -e
etcd_name=${1:-"etcd-s1"}
docker_container_dir=${2:-"/data/containers"}
# 创建基础目录
mkdir -p ${docker_container_dir}/etcd/data
# 创建 docker-compose 文件
function deploy_compose_config(){
cat > ${docker_container_dir}/etcd/docker-compose.yml <<-EOF
version: '3'
services:
etcd:
container_name: ${etcd_name}
image: quay.io/coreos/etcd:v3.5.12
environment:
- ETCD_NAME=${etcd_name}
- ETCD_DATA_DIR=/var/etcd
- ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_ADVERTISE_CLIENT_URLS=http://0.0.0.0:2379
- ETCD_LISTEN_PEER_URLS=http://0.0.0.0:2380
- ETCD_INITIAL_ADVERTISE_PEER_URLS=http://0.0.0.0:2380
- ETCD_INITIAL_CLUSTER_TOKEN=etcd-cluster
- ETCD_INITIAL_CLUSTER=etcd-s1=http://0.0.0.0:2380
- ETCD_INITIAL_CLUSTER_STATE=new
- ETCD_LOGGER=zap
- ETCD_LOG_LeveL=info
volumes:
- ${DOCKER_VOLUME_DIRECTORY:-.}/data:/var/etcd
- "/etc/localtime:/etc/localtime:ro"
ports:
- 2379:2379
- 2380:2380
restart: always
networks:
default:
name: etcd-tier
driver: bridge
EOF
}
# 创建 etcd 服务
function deploy_etcd(){
cd ${docker_container_dir}/etcd
docker compose up -d
}
# 验证 etcd 服务
function check_etcd(){
cd ${docker_container_dir}/etcd
docker compose ps
}
echo -e "\033[1;32m 1.Deploy docker compose config.\n \033[0m"
deploy_compose_config
echo -e "\033[1;32m 2.Deploy etcd service.\n \033[0m"
deploy_etcd
echo -e "\033[1;32m 3.Check etcd service status. \033[0m"
check_etcd
说明: 由于调试过程中没有解决 EOF 报错的问题,function 里 cat 部分的内容没有缩进,看着不美观,但是不影响使用。
根据本文所学,请完成以下实战任务。
本文分享了基于 coreos 官方提供的 etcd 镜像部署 etcd 服务的详细流程及注意事项。主要内容概括如下:
Get 本文实战视频(请注意,文档视频异步发行,请先关注)
免责声明:
如果你喜欢本文,请分享、收藏、点赞、评论! 请持续关注 @ 运维有术,及时收看更多好文!
欢迎加入 「运维有术·云原生实战训练营」 ,获取更多的 KubeSphere、Kubernetes、云原生运维实战技能。
版权声明
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。