Kubernetes 漫游:etcd
概述
etcd 是一个基于 Raft 协议实现。开源的、分布式的键值存储系统。主要用于在分布式系统中提供强一致性和高可用性的数据存储。
etcd 在 Kubernetes 中的作用如下:
- 集群状态数据存储:集群配置,集群状态信息等
- 保证集群一致性和高可用:多实例的数据同步
- 服务发现和配置共享
- 集群数据备份和恢复
作为 Kubernetes 的核心组件,etcd 为集群的稳定性、可靠性和一致性提供了支撑。
安装
命令行启动
安装参考官方文档 etcd install 指引即可,安装后验证:
$ etcd --version
输出:
etcd Version: 3.5.10
Git SHA: 0223ca52b
Go Version: go1.21.3
Go OS/Arch: darwin/arm64
phoenix@xiaobindeMacBook-Pro ~ % etcd
在终端启动 etcd:
$ etcd
输出:
{"level":"warn","ts":"2023-11-23T06:59:49.265098+0800","caller":"embed/config.go:676","msg":"Running http and grpc server on single port. This is not recommended for production."}
{"level":"info","ts":"2023-11-23T06:59:49.265318+0800","caller":"etcdmain/etcd.go:73","msg":"Running: ","args":["etcd"]}
{"level":"info","ts":"2023-11-23T06:59:49.265352+0800","caller":"etcdmain/etcd.go:100","msg":"failed to detect default host","error":"default host not supported on darwin_arm64"}
{"level":"warn","ts":"2023-11-23T06:59:49.265361+0800","caller":"etcdmain/etcd.go:105","msg":"'data-dir' was empty; using default","data-dir":"default.etcd"}
#.....
容器启动
在容器中启动 etcd 实例:
$ docker run -d registry.aliyuncs.com/google_containers/etcd:3.5.0-0 /usr/local/bin/etcd
进入 etcd 容器:
docker ps|grep etcd
docker exec –it <containerid> sh
使用
etcd 的使用较为简单,主要通过 etcdctl 来执行日常操作
查看集群
查看 etcd 集群中的所有成员:
$ etcdctl member list --write-out=table
输出:
+------------------+---------+---------+-----------------------+-----------------------+------------+
| ID | STATUS | NAME | PEER ADDRS | CLIENT ADDRS | IS LEARNER |
+------------------+---------+---------+-----------------------+-----------------------+------------+
| 8e9e05c52164694d | started | default | http://localhost:2380 | http://localhost:2379 | false |
+------------------+---------+---------+-----------------------+-----------------------+------------+
存储键值对
通过 put 命令用于将指定的值存储在指定的键下。使用方法如下:
$ etcdctl put [key] [value]
例如,要存储键为 mykey 和值为 myvalue 的键值对,你可以运行:
$ etcdctl put mykey myvalue
输出:
OK
这会在 etcd 中创建或更新键 mykey 的值为 myvalue。
获取键值对
get 命令用于检索存储在指定键下的值。使用方法如下:
$ etcdctl get [key]
继续上面的例子,要获取 mykey 的值,你可以运行:
$ etcdctl get mykey
输出:
mykey
myvalue
观察键值变化
通过 watch 命令可以观察键的变化。当指定的键发生变化(例如更新或删除)时,会输出通知。使用方法如下:
$ etcdctl watch [key]
例如,要观察 mykey 的变化,你可以运行:
$ etcdctl watch mykey
然后,在另一个终端更新 mykey 操作:
$ etcdctl put mykey newValue
$ etcdctl put mykey newValue2
$ etcdctl put mykey newValue3
然后执行 watch 命令的终端输出:
PUT
mykey
newValue
PUT
mykey
newValue2
PUT
mykey
newValue3
租约机制
租约(Lease)是一种允许将键值对与一个有时间限制的租约关联的机制。租约到期后,与其关联的键值对会自动删除。
这个特性主要用于:保存临时配置,实现分布式锁,心跳机制,集群成员管理等场景。
创建租约
使用 lease grant 命令可以创建一个租约:
$ etcdctl lease grant 60
输出:
lease 694d8c03cd2f520c granted with TTL(60s)
这个命令会创建一个持续 60 秒的租约,并且返回一个租约 ID,用于后续的操作。
列出所有租约
使用 lease list 可以查看所有活跃的租约:
$ etcdctl lease list
输出:
found 1 leases
694d8c03cd2f520c
这里列出当前所有活跃的租约
将键绑定到租约
使用 --lease=<LEASE_ID> 选项参数可以把键绑定在租约上:
$ etcdctl put mykey myvalue --lease=694d8c03cd2f520c
输出:
OK
这个键将在租约到期时自动删除。
保持活跃
使用 lease keep-alive 可以对租约进行续租:
$ etcdctl lease keep-alive 694d8c03cd2f520c
输出:
lease 694d8c03cd2f5214 keepalived with TTL(60)
lease 694d8c03cd2f5214 keepalived with TTL(60)
lease 694d8c03cd2f5214 keepalived with TTL(60)
# ....
这条命令将保持租约活跃,防止其到期。
撤销租约
使用 lease revoke 可以提前结束租约:
$ etcdctl lease revoke 694d8c03cd2f520c
输出:
lease 694d8c03cd2f520c revoked
这将撤销租约并删除所有与之相关联的键。
备份和恢复
在 etcd 中,snapshot 功能是一种重要的数据保护和恢复机制。它允许你保存 etcd 数据库的当前状态,并在需要时从这些快照中恢复数据。
创建快照
使用 etcdctl snapshot save 命令可以创建当前的数据快照:
$ etcdctl snapshot save snapshot.db
输出:
{"level":"info","ts":"2023-11-25T11:05:38.646873+0800","caller":"snapshot/v3_snapshot.go:65","msg":"created temporary db file","path":"snapshot.db.part"}
{"level":"info","ts":"2023-11-25T11:05:38.652861+0800","logger":"client","caller":"v3@v3.5.10/maintenance.go:212","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":"2023-11-25T11:05:38.653092+0800","caller":"snapshot/v3_snapshot.go:73","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2023-11-25T11:05:38.657127+0800","logger":"client","caller":"v3@v3.5.10/maintenance.go:220","msg":"completed snapshot read; closing"}
{"level":"info","ts":"2023-11-25T11:05:38.660291+0800","caller":"snapshot/v3_snapshot.go:88","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"98 kB","took":"now"}
{"level":"info","ts":"2023-11-25T11:05:38.660394+0800","caller":"snapshot/v3_snapshot.go:97","msg":"saved","path":"snapshot.db"}
这会将当前 etcd 数据库的状态保存到名为 snapshot.db 的文件中。
恢复数据
使用 etcdctl snapshot restore 命令可以从快照文件中恢复数据:
$ etcdctl snapshot restore snapshot.db
输出:
2023-11-25T11:06:10+08:00 info snapshot/v3_snapshot.go:260 restoring snapshot {"path": "snapshot.db", "wal-dir": "default.etcd/member/wal", "data-dir": "default.etcd", "snap-dir": "default.etcd/member/snap"}
2023-11-25T11:06:10+08:00 info membership/store.go:141 Trimming membership information from the backend...
2023-11-25T11:06:10+08:00 info membership/cluster.go:421 added member {"cluster-id": "cdf818194e3a8c32", "local-member-id": "0", "added-peer-id": "8e9e05c52164694d", "added-peer-peer-urls": ["http://localhost:2380"]}
2023-11-25T11:06:10+08:00 info snapshot/v3_snapshot.go:287 restored snapshot {"path": "snapshot.db", "wal-dir": "default.etcd/member/wal", "data-dir": "default.etcd", "snap-dir": "default.etcd/member/snap"}
这会从 snapshot.db 中恢复数据,并且配置新的 etcd 实例。
在 K8S 中创建 etcd
安装 Helm
首先,安装 Helm 包管理工具,它主要用于简化 Kubernetes 应用程序的部署和管理。
添加 bitnami 仓库
然后将 Bitnami 仓库添加到你的 Helm 包中:
$ helm repo add bitnami https://charts.bitnami.com/bitnami
Bitnami 提供了许多预打包的 K8S 应用和服务,添加它你可以方便的搜索、配置和安装各种安全可靠的应用。
下载 chart
从 Bitnami 仓库下载解压编辑 etcd 的 Helm chart:
$ helm pull bitnami/etcd
$ tar -xvf etcd-6.8.4.tgz
$ vi etcd/values.yaml
在本地环境为了避免产生不必要的数据文件,将数据持久化设置为 false:
persistence:
## @param persistence.enabled If true, use a Persistent Volume Claim. If false, use emptyDir.
enabled: false
这意味着 etcd 数据不会被持久化存储,当 Pod 重启时数据会丢失。
安装 chart
将 chart 部署到 Kubernetes 集群中:
$ helm install my-release ./etcd
执行这个命令,Helm 会根据位于 /etcd 目录中的 values.yaml 文件和其他 chart 文件,创建一组 Kubernetes 资源来部署 etcd 应用。
启动 etcd 客户端
启动 etcd 客户端:
$ kubectl run my-release-etcd-client --restart='Never' --image docker.io/bitnami/etcd:3.5.0-debian-10-r94 --env ROOT_PASSWORD=$(kubectl get secret --namespace default my-release-etcd -o jsonpath="{.data.etcd-root-password}" | base64 --decode) --env ETCDCTL_ENDPOINTS="my-release-etcd.default.svc.cluster.local:2379" --namespace default --command -- sleep infinity
此命令创建一个 etcd 客户端 Pod,用于和 etcd 服务进行交互。
验证
首先查看 Pod:
$ kubectl get pod
输出:
NAME READY STATUS RESTARTS AGE
my-release-etcd-0 1/1 Running 0 7m28s
my-release-etcd-client 1/1 Running 0 74s
进入容器:
$ kubectl exec --namespace default -it my-release-etcd-client -- bash
存储键:
$ etcdctl --user root:$ROOT_PASSWORD put /message Hello
获取键:
$ etcdctl --user root:$ROOT_PASSWORD get /message
输出:
/message
Hello
到这里在 K8S 中创建 etcd,从设置环境、安装 etcd,到通过客户端验证的基本使用到这里就完成了。
Kubernetes 漫游:etcd的更多相关文章
- kubernetes部署 etcd 集群
本文档介绍部署一个三节点高可用 etcd 集群的步骤: etcd 集群各节点的名称和 IP 如下: kube-node0:192.168.111.10kube-node1:192.168.111.11 ...
- Kubernetes集群部署之三ETCD集群部署
kuberntes 系统使用 etcd 存储所有数据,本文档介绍部署一个三节点高可用 etcd 集群的步骤,这三个节点复用 kubernetes 集群机器k8s-master.k8s-node-1.k ...
- 二进制搭建kubernetes多master集群【一、使用TLS证书搭建etcd集群】
上一篇我们介绍了kubernetes集群架构以及系统参数配置,参考:二进制搭建kubernetes多master集群[开篇.集群环境和功能介绍] 下面本文etcd集群才用三台centos7.5搭建完成 ...
- Kubernetes学习之路(二)之ETCD集群二进制部署
ETCD集群部署 所有持久化的状态信息以KV的形式存储在ETCD中.类似zookeeper,提供分布式协调服务.之所以说kubenetes各个组件是无状态的,就是因为其中把数据都存放在ETCD中.由于 ...
- Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列之自签TLS证书及Etcd集群部署(二)
0.前言 整体架构目录:ASP.NET Core分布式项目实战-目录 k8s架构目录:Kubernetes(k8s)集群部署(k8s企业级Docker容器集群管理)系列目录 一.服务器设置 1.把每一 ...
- 高可用Kubernetes集群-3. etcd高可用集群
五.部署高可用etcd集群 etcd是key-value存储(同zookeeper),在整个kubernetes集群中处于中心数据库地位,以集群的方式部署,可有效避免单点故障. 这里采用静态配置的方式 ...
- Kubernetes master无法加入etcd 集群解决方法
背景:一台master磁盘爆了导致k8s服务故障,重启之后死活kubelet起不来,于是老哥就想把它给reset掉重新join,接着出现如下报错提示是说etcd集群健康检查未通过: error exe ...
- 006.Kubernetes二进制部署ETCD
一 部署ETCD集群 1.1 安装ETCD etcd 是基于 Raft 的分布式 key-value 存储系统,由 CoreOS 开发,常用于服务发现.共享配置以及并发控制(如 leader 选举.分 ...
- kubernetes容器集群部署Etcd集群
安装etcd 二进制包下载地址:https://github.com/etcd-io/etcd/releases/tag/v3.2.12 [root@master ~]# GOOGLE_URL=htt ...
- kubernetes集群断电后etcd启动失败之etcd备份方案
一.问题描述 二进制部署的单Master节点的v1.13.10版本的集群,etcd部署的是3.3.10版本,部署在master节点上.在异常断电后,kubernetes集群无法正常启动.这里通过查看k ...
随机推荐
- Windows查找监听端口对应的进程及其路径
前言 假设扫描到1234端口存在可疑进程,需要找到该监听端口对应的进程及其进程文件的全路径,判断是否为可疑程序. 步骤 启动命令行:按win + r键,然后输入"cmd" 查看端口 ...
- vite 找不到依赖模块:[plugin:vite:dep-pre-bundle]
问题描述: 运行项目时,出现[plugin:vite:dep-pre-bundle] 错误.这种问题一般为依赖的包未正常配置相关字段,导致vite无法找到包的入口. 遇到这种模块内.找不到引用模块的, ...
- C++函数参数匹配规则
C++ 函数参数匹配 1 单个参数匹配 void f(); //f1 void f(int); //f2 void f(int, int); //f3 void f(double, double=3. ...
- 简单描述下HTTP协议和TCP协议之间的关系以及TCP三次握手, 四次挥手
TCP 三次握手, 四次挥手 TCP(传输控制协议)是一种用于在计算机网络中建立可靠连接的协议.TCP连接的建立和终止分别使用了"三次握手"和"四次挥手"的过程 ...
- 正则表达式快速入门一:正则表达式(regex)基本语法及概念
Regex quickstart :正则表达式快速入门 author: wclsn reference quick start 如果想要了解正则表达式的基本概念且英文ok的话,完全可以从我上面所附网站 ...
- qiankun微前端实践
为什么要使用微前端 微前端架构具备以下几个核心价值: 技术栈无关 主框架不限制接入应用的技术栈,微应用具备完全自主权 独立开发.独立部署 微应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步 ...
- Abp vNext 模块加载机制
文章目录 生命周期 PreConfigureServices 添加依赖注入或者其它配置之前 ConfigureServices 添加依赖注入或者其它配置 PostConfigureServices 添 ...
- Linux-Stream内存带宽及MLC内存延迟性能测试方法
1.Stream内存带宽测试 Stream是业界主流的内存带宽测试程序,测试行为相对简单可控.该程序对CPU的计算能力要求很小,对CPU内存带宽压力很大.随着处理器核心数量的增大,而内存带宽并没有 ...
- MySql 数据 管理表的操作
管理表的操作 use scoredb; -- 查看数据库中有哪些表 show tables; show tables from bipowernode; -- 查看数据表的基础结构 show colu ...
- Redis系列内容完整版
@ 目录 Redis系列之_Redis介绍安装配置 第一章 redis初识 1.1 Redis是什么 1.2 Redis特性(8个) 1.3 Redis单机安装 1.3.1下载安装 1.3.2三种启动 ...