当前位置: 首页 > news >正文

[Kubernetes] etcd 单机和集群部署

在这里插入图片描述

文章目录

      • 1.etcd基本概念
      • 2.etcd的基本知识
      • 3.etcd优势
      • 4.etcd单机部署
        • 4.1 linux部署
        • 4.2 windows部署
        • 4.3 docker安装etcd
      • 5.etcd集群部署

1.etcd基本概念

etcd是一个高可用的分布式键值存储系统,是CoreOS(现在隶属于Red Hat)公司开发的一个开源项目。它提供了一个简单的接口来存储和检索键值对数据,并使用Raft协议实现了分布式一致性。etcd广泛应用于Docker、Kubernetes等分布式系统中,用于存储配置信息、服务发现、领导者选举等方面。

2.etcd的基本知识

  • Etcd的定义:Etcd是一个分布式的、高可用的键值存储系统,具有快速响应、支持高并发等特点。
  • Etcd的优点:高可用、数据一致性、快速响应、支持分布式事务。
  • Etcd的应用场景:存储集群中各种配置信息、元数据以及服务发现等。
  • Etcd的数据结构:类似于键值对的数据结构,支持多种数据类型,如字符串、整数、布尔、数组等。
  • Etcd的API:提供丰富的API接口,通过HTTP协议进行访问和操作。
  • Etcd的数据同步:Etcd使用Raft协议来保证数据的一致性和高可用性,在多个节点之间同步数据。
  • Etcd的集群部署:Etcd可以部署为单节点或多节点集群,多节点集群可以提高系统的可用性和性能。
  • Etcd的安全性:Etcd提供了诸如SSL/TLS加密、授权、访问控制等安全机制,保障了数据的安全性。
  • Etcd的监控:Etcd提供了各种监控指标和工具,方便管理员对集群进行监控和管理。
  • Etcd的常用工具:包括etcdctl命令行工具、etcd browser浏览器、etcd dashboard仪表板、etcdwatch等。

3.etcd优势

etcd是一种分布式键值存储系统,具有以下特点和优势:

  1. 强一致性:etcd使用Raft协议实现强一致性,确保每个节点上的数据始终保持一致。
  2. 高可用性:etcd可以通过多副本和自动故障转移机制来实现高可用性,即使某个节点故障,也可以保证服务不中断。
  3. 高性能:etcd采用预写日志(WAL)技术,可以快速写入数据,同时还支持快速读取和查询。
  4. 分布式:etcd可以在多台服务器上运行,数据可以在多个节点之间分布,提高了系统的可伸缩性和性能。
  5. 安全性:etcd支持TLS加密和认证,确保数据传输的安全性。
  6. 简单易用:etcd提供简单易用的HTTP/JSON API,可以方便地进行数据读写和查询。
  7. 开源免费:etcd是一个完全开源的项目,具有Apache 2.0许可证。

4.etcd单机部署

4.1 linux部署

下载地址:https://github.com/etcd-io/etcd/releases/download/v3.5.13/etcd-v3.5.13-linux-amd64.tar.gz

上传服务器:

tar xf etcd-v3.5.13-linux-amd64.tar.gz
mkdir -p /opt/etcd/bin
cp -a etcd-v3.5.13-linux-amd64/etcd* /opt/etcd/bin/cd /opt/etcd/
mkdir -p data conf

创建配置文件

cat << 'EOF' > /opt/etcd/conf/etcd.conf
ETCD_NAME="apisix"
ETCD_DATA_DIR="/opt/etcd/data"
ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379"
ETCD_ADVERTISE_CLIENT_URLS="http://0.0.0.0:2379,http://127.0.0.1:2379"
ETCD_LISTEN_PEER_URLS="http://0.0.0.0:2380"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://0.0.0.0:2380,http://127.0.0.1:2380"
ETCD_ENABLE_V2="true"
EOF

注册成一个服务

cat << 'EOF' >  /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd
After=network.target
After=network-online.target
Wants=network-online.target[Service]
User=root
Type=notify
EnvironmentFile=/opt/etcd/conf/etcd.conf
WorkingDirectory=/opt/etcd
ExecStart=/opt/etcd/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
EOF

启动服务

systemctl daemon-reload
systemctl enable --now etcdnetstat -ntplu | egrep etcd
tcp6       0      0 :::2379                 :::*                    LISTEN      1228/etcd
tcp6       0      0 :::2380                 :::*                    LISTEN      1228/etcd

设置环境变量

echo 'export PATH=$PATH:/opt/etcd/bin' > /etc/profile.d/etcd.sh
source /etc/profile.d/etcd.sh

查看状态

etcdctl endpoint status --write-out=table
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|    ENDPOINT    |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 127.0.0.1:2379 | 17ac6c9b1b6e7f0c |  3.5.13 |   20 kB |      true |      false |         2 |          4 |                  4 |        |
+----------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+etcdctl endpoint health --write-out=table
+----------------+--------+------------+-------+
|    ENDPOINT    | HEALTH |    TOOK    | ERROR |
+----------------+--------+------------+-------+
| 127.0.0.1:2379 |   true | 3.571276ms |       |
+----------------+--------+------------+-------+etcdctl member list --write-out=table
+------------------+---------+--------+-------------------------------------------+-------------------------------------------+------------+
|        ID        | STATUS  |  NAME  |                PEER ADDRS                 |               CLIENT ADDRS                | IS LEARNER |
+------------------+---------+--------+-------------------------------------------+-------------------------------------------+------------+
| 17ac6c9b1b6e7f0c | started | apisix | http://0.0.0.0:2380,http://127.0.0.1:2380 | http://0.0.0.0:2379,http://127.0.0.1:2379 |      false |
+------------------+---------+--------+-------------------------------------------+-------------------------------------------+------------+

不变成服务, 直接启动etcd:

cd /opt/etcd/
./etcd
4.2 windows部署

安装地址:https://github.com/etcd-io/etcd/releases/tag/v3.5.14

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

4.3 docker安装etcd
mkdir -p /opt/soft/etcd/data# 拉取etcd镜像
docker pull quay.io/coreos/etcd:v3.5.13docker run -d \-p 2379:2379 \-p 2380:2380 \--restart=always \--mount type=bind,source=/opt/soft/etcd/data,destination=/etcd-data \--name etcd \quay.io/coreos/etcd:v3.5.13 \/usr/local/bin/etcd \--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 tkn \--initial-cluster-state new \--log-level info \--logger zap \--log-outputs stderr
# 查看Etcd服务器版本
docker exec etcd /usr/local/bin/etcd --version# 查看Etcd客户端版本
docker exec etcd /usr/local/bin/etcdctl version
docker exec etcd /usr/local/bin/etcdutl version# 查看Etcd健康状况
docker exec etcd /usr/local/bin/etcdctl endpoint health# Etcd添加数据
docker exec etcd /usr/local/bin/etcdctl put foo bar# Etcd查看数据
docker exec etcd /usr/local/bin/etcdctl get foo# Etcd查看所有数据
docker exec etcd /usr/local/bin/etcdctl get --prefix ""# Etcd删除数据
docker exec etcd /usr/local/bin/etcdctl del foo
[root@node1192 soft]# docker exec etcd /usr/local/bin/etcd --version
etcd Version: 3.5.13
Git SHA: c9063a0dc
Go Version: go1.21.8
Go OS/Arch: linux/amd64[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl version
etcdctl version: 3.5.13
API version: 3.5[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdutl version
etcdutl version: 3.5.13
API version: 3.5[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl endpoint health
127.0.0.1:2379 is healthy: successfully committed proposal: took = 5.561765ms[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl put foo bar
OK[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl get foo
foo
bar[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl get --prefix ""
foo
bar[root@node1192 soft]# docker exec etcd /usr/local/bin/etcdctl del foo
1

5.etcd集群部署

#每台主机分别执行
hostnamectl set-hostname etcd-node01
hostnamectl set-hostname etcd-node02
hostnamectl set-hostname etcd-node03#每台主机执行
cat << 'EOF' > /etc/hosts
192.168.66.101 etcd-node01
192.168.66.102 etcd-node02
192.168.66.103 etcd-node03
EOFyum install ntpdate -y
ntpdate -s ntp1.aliyun.comtar xf etcd-v3.5.13-linux-amd64.tar.gz
mkdir -pv /opt/etcd/{bin,data,conf}
cp -a etcd-v3.5.13-linux-amd64/etcd* /opt/etcd/bin/

编写配置文件

cat << 'EOF' > /opt/etcd/conf/etcd.conf
ETCD_NAME=etcd-node01
ETCD_DATA_DIR="/opt/etcd/data"
ETCD_LISTEN_PEER_URLS="http://192.168.66.101:2380,http://127.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.66.101:2379,http://127.0.0.1:2379"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.66.101:2380"
ETCD_INITIAL_CLUSTER="etcd-node01=http://192.168.66.101:2380,etcd-node02=http://192.168.66.102:2380,etcd-node03=http://192.168.66.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.66.101:2379"
EOF
cat << 'EOF' > /opt/etcd/conf/etcd.conf
ETCD_NAME=etcd-node02
ETCD_DATA_DIR="/opt/etcd/data"
ETCD_LISTEN_PEER_URLS="http://192.168.66.102:2380,http://127.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.66.102:2379,http://127.0.0.1:2379"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.66.102:2380"
ETCD_INITIAL_CLUSTER="etcd-node01=http://192.168.66.101:2380,etcd-node02=http://192.168.66.102:2380,etcd-node03=http://192.168.66.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.66.102:2379"
EOF
cat << 'EOF' > /opt/etcd/conf/etcd.conf
ETCD_NAME=etcd-node03
ETCD_DATA_DIR="/opt/etcd/data"
ETCD_LISTEN_PEER_URLS="http://192.168.66.103:2380,http://127.0.0.1:2380"
ETCD_LISTEN_CLIENT_URLS="http://192.168.66.103:2379,http://127.0.0.1:2379"ETCD_INITIAL_ADVERTISE_PEER_URLS="http://192.168.66.103:2380"
ETCD_INITIAL_CLUSTER="etcd-node01=http://192.168.66.101:2380,etcd-node02=http://192.168.66.102:2380,etcd-node03=http://192.168.66.103:2380"
ETCD_INITIAL_CLUSTER_TOKEN="etcd-cluster"
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.66.103:2379"
EOF

注册服务

cat << 'EOF' >  /usr/lib/systemd/system/etcd.service
[Unit]
Description=etcd service
Documentation=https://github.com/etcd-io/etcd
After=network.target
After=network-online.target
Wants=network-online.target[Service]
User=root
Type=notify
EnvironmentFile=/opt/etcd/conf/etcd.conf
WorkingDirectory=/opt/etcd
ExecStart=/opt/etcd/bin/etcd
Restart=always
RestartSec=10s
LimitNOFILE=65536[Install]
WantedBy=multi-user.target
EOF

开启服务和环境变量

systemctl enable --now etcdecho 'PATH=$PATH:/opt/etcd/bin' > /etc/profile.d/etcd.sh
source /etc/profile.d/etcd.sh

查看集群信息

etcdctl --endpoints=192.168.66.101:2379,192.168.66.102:2379,192.168.66.103:2379  endpoint status  --write-out=table
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|       ENDPOINT       |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 192.168.66.101:2379 | 8dc9f79502ff52fe |  3.5.13 |   20 kB |     false |      false |         2 |         13 |                 13 |        |
| 192.168.66.102:2379 | 8fdf9dd965ff87d5 |  3.5.13 |   20 kB |      true |      false |         2 |         13 |                 13 |        |
| 192.168.66.103:2379 | fc380e2e4f60630e |  3.5.13 |   20 kB |     false |      false |         2 |         13 |                 13 |        |
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

测试故障:将上面的 leader 节点关机,然后查看 leader 节点是否会在其他节点上启动。

etcdctl --endpoints=192.168.66.101:2379,192.168.66.102:2379,192.168.66.103:2379  endpoint status  --write-out=table
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|       ENDPOINT       |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 192.168.66.101:2379 | 8dc9f79502ff52fe |  3.5.13 |   20 kB |      true |      false |         3 |         14 |                 14 |        |
| 192.168.66.103:2379 | fc380e2e4f60630e |  3.5.13 |   20 kB |     false |      false |         3 |         14 |                 14 |        |
+----------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

leader节点已经漂移到 192.168.66.101 上面了。

数据写入测试

在 etcd-node01 写入数据
root@etcd-node01(192.168.66.101)~>etcdctl put greeting "hello etcd"
OK在 etcd-node03 读取数据
root@etcd-node03(192.168.66.103)~>etcdctl get greeting
greeting
hello etcd

相关文章:

  • es6基础语法
  • docker-ce 和 docker-ee介绍版本介绍
  • MySQL数据库管理(一)
  • 2024年6月13日随笔
  • 拥抱数字世界|AI在娱乐行业的应用,娱乐新纪元已到来
  • 浅谈Web开发的三大主流框架:Angular、React和Vue.js
  • 京准电钟|基于纳秒级的GPS北斗卫星授时服务器
  • SSM名城养老院管理系统-计算机毕业设计源码03948
  • c++_0基础_讲解1 认识c++
  • 判断当前设备为移动端自适应 平板和pc端为375移动端样式
  • 二进制中的相反数
  • 从零实现ChatGPT:第一章构建大规模语言模型的数据准备
  • AWS无服务器 应用程序开发—第十一章API Gateway
  • C++ 字符串处理5-手机号邮箱如何脱敏处理
  • How To: Localize Bar and Ribbon Skin Items
  • [笔记] php常见简单功能及函数
  • 【Leetcode】104. 二叉树的最大深度
  • 0基础学习移动端适配
  • 10个确保微服务与容器安全的最佳实践
  • Brief introduction of how to 'Call, Apply and Bind'
  • C++类中的特殊成员函数
  • eclipse(luna)创建web工程
  • Fundebug计费标准解释:事件数是如何定义的?
  • JavaScript对象详解
  • Laravel Telescope:优雅的应用调试工具
  • laravel 用artisan创建自己的模板
  • LeetCode29.两数相除 JavaScript
  • Octave 入门
  • October CMS - 快速入门 9 Images And Galleries
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里研究院入选中国企业智库系统影响力榜
  • 创建一种深思熟虑的文化
  • 对JS继承的一点思考
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端知识点整理(待续)
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用阿里云发布分布式网站,开发时候应该注意什么?
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • Java性能优化之JVM GC(垃圾回收机制)
  • Spring Batch JSON 支持
  • ​【数据结构与算法】冒泡排序:简单易懂的排序算法解析
  • ​【已解决】npm install​卡主不动的情况
  • ​ArcGIS Pro 如何批量删除字段
  • #周末课堂# 【Linux + JVM + Mysql高级性能优化班】(火热报名中~~~)
  • ( 10 )MySQL中的外键
  • (30)数组元素和与数字和的绝对差
  • (51单片机)第五章-A/D和D/A工作原理-A/D
  • (NSDate) 时间 (time )比较
  • (八)Spring源码解析:Spring MVC
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (九)信息融合方式简介
  • (蓝桥杯每日一题)love