首页 > 其他分享 >k8s--etcd 基本操作

k8s--etcd 基本操作

时间:2023-03-08 21:33:18浏览次数:44  
标签:5.0 etcd -- etcdctl sh key 基本操作 k8s

介绍

Etcd 是 CoreOS 基于 Raft 开发的分布式 key-value 存储,可用于服务发现、共享配置以及一致性保障(如数据库选主、分布式锁等)。

在分布式系统中,如何管理节点间的状态一直是一个难题,etcd像是专门为集群环境的服务发现和注册而设计,它提供了数据TTL失效、数据改变监视、多值、目录监听、分布式锁原子操作等功能,可以方便的跟踪并管理集群节点的状态。

  • 键值对存储:将数据存储在分层组织的目录中,如同在标准文件系统中
  • 监测变更:监测特定的键或目录以进行更改,并对值的更改做出反应
  • 简单: curl 可访问的用户的 API(HTTP+JSON)
  • 安全: 可选的 SSL 客户端证书认证
  • 快速: 单实例每秒 1000 次写操作,2000+ 次读操作
  • 可靠: 使用 Raft 算法保证一致性

主要功能

  • 基本的 key-value 存储
  • 监听机制
  • key 的过期及续约机制,用于监控和服务发现
  • 原子 Compare And Swap 和 Compare And Delete,用于分布式锁和 leader 选举

使用场景

  • 也可以用于键值对存储,应用程序可以读取和写入 etcd 中的数据
  • etcd 比较多的应用场景是用于服务注册与发现
  • 基于监听机制的分布式异步系统

键值对存储

etcd 是一个键值存储的组件,其他的应用都是基于其键值存储的功能展开。

  • 采用 kv 型数据存储,一般情况下比关系型数据库快。
  • 支持动态存储(内存)以及静态存储(磁盘)。
  • 分布式存储,可集成为多节点集群。
  • 存储方式,采用类似目录结构。(B+tree)
  • 只有叶子节点才能真正存储数据,相当于文件。
  • 叶子节点的父节点一定是目录,目录不能存储数据。

服务注册与发现

  • 强一致性、高可用的服务存储目录。
    • 基于 Raft 算法的 etcd 天生就是这样一个强一致性、高可用的服务存储目录。
  • 一种注册服务和服务健康状况的机制。
    • 用户可以在 etcd 中注册服务,并且对注册的服务配置 key TTL,定时保持服务的心跳以达到监控健康状态的效果。

消息发布与订阅

  • 在分布式系统中,最适用的一种组件间通信方式就是消息发布与订阅。
  • 即构建一个配置共享中心,数据提供者在这个配置中心发布消息,而消息使用者则订阅他们关心的主题,一旦主题有消息发布,就会实时通知订阅者。
  • 通过这种方式可以做到分布式系统配置的集中式管理与动态更新。
  • 应用中用到的一些配置信息放到 etcd 上进行集中管理。
  • 应用在启动的时候主动从etcd获取一次配置信息,同时,在etcd节点上注册一个Watcher并等待,以后每次配置有更新的时候,etcd都会实时通知订阅者,以此达到获取最新配置信息的目的。

安装

参考官网:https://github.com/etcd-io/etcd/releases

参考别人的文档:https://www.modb.pro/db/108852

基本使用

我们安装好了 k8s 之后就有了 etcd 了,因为我有 k8s 集群,所以就不单独安装 etcd 了,进入 etcd 容器内

// 查看 etcd 名称
[root@master ~]# kubectl get pod -n kube-system
NAME                                       READY   STATUS    RESTARTS   AGE
calico-kube-controllers-58497c65d5-h9br8   1/1     Running   3          25d
calico-node-b49wm                          1/1     Running   2          25d
calico-node-d7ksf                          1/1     Running   2          25d
calico-node-zhz2z                          1/1     Running   2          25d
coredns-57d4cbf879-xwcrl                   1/1     Running   2          26d
coredns-57d4cbf879-zmdm6                   1/1     Running   2          26d
etcd-master                                1/1     Running   3          32d
kube-apiserver-master                      1/1     Running   3          32d
kube-controller-manager-master             1/1     Running   4          28d
kube-proxy-8tx9s                           1/1     Running   2          25d
kube-proxy-dtpmg                           1/1     Running   2          25d
kube-proxy-q2d7h                           1/1     Running   2          25d
kube-scheduler-master                      1/1     Running   8          32d

// 进入 etcd 容器内部
[root@master ~]# kubectl exec -it  etcd-master -n kube-system -- sh
sh-5.0#

查看 etcd 的版本

// 查看 etcd 的版本
sh-5.0# etcdctl version
etcdctl version: 3.4.13
API version: 3.4

查看 etcd 集群的成员节点

etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key member list
  • --endpoints:GRPC 端点
  • --cacert:服务器使用 HTTPS 时,使用 CA 文件进行验证
  • --cert:HTTPS 下客户端使用的 SSL 证书文件
  • --key:HTTPS 下客户端使用的 SSL 秘钥文件

备注: --cacert为客户端连接etcd所需的证书信息,这个证书我们可以通过 ps -ef | grep etcd 查看

为了便于操作操作,将该证书 alias 别名 

// 将该证书 alias 别名
alias etcdctl='etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key'
// 查看 etcd 集群的成员节点
sh-5.0# etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key member list
14c62a8374fa525b, started, master, https://10.6.215.6:2380, https://10.6.215.6:2379, false

// 别名
sh-5.0# alias etcdctl='etcdctl --endpoints=https://[127.0.0.1]:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/healthcheck-client.crt --key=/etc/kubernetes/pki/etcd/healthcheck-client.key'

// 起了别名后就可以不带证书了
sh-5.0# etcdctl member list
14c62a8374fa525b, started, master, https://10.6.215.6:2380, https://10.6.215.6:2379, false

上面查看不好看,我们可以输出的时候让已表格的格式输出,加上 --write-out=table 参数就可以了

etcdctl member list --write-out=table

数据的增删改查

新增数据 put

在 etcd 里需要新增键值对的时候,可以用 put 进行新增数据

# 往 etcd 里插入数据,key 为 a。value 为 b
sh-5.0# etcdctl put a b
OK

# 根据 key 进行查询数据
sh-5.0# etcdctl get a
a
b

# etcd 里如果有数据的话,在 put 就是修改数据
sh-5.0# etcdctl put a ba
OK

# 在查询
sh-5.0# etcdctl get a
a
ba
查询数据 get

查询数据通过 get

# 根据 key 进行查询数据,返回 key 和 value
sh-5.0# etcdctl get a
a
b

也可以通过 -w json 的方式输出详细信息

# 返回的 key 和 value 是加密过的
sh-5.0# etcdctl get a -w json
{"header":{"cluster_id":14380622575892849445,"member_id":1496930670238913115,"revision":3889492,"raft_term":5},"kvs":[{"key":"YQ==","create_revision":3888952,"mod_revision":3889294,"version":5,"value":"YmE="}],"count":1}

获取某个前缀的所有键值对,通过 --prefix 可以指定前缀

# 查看前缀为 /registry/namespaces 的 key 和 value
etcdctl get --prefix /registry/namespaces

上面查看 key  和 value 的话,数据量太大了,通过我们只查询 key,在根据某个 key 查询 对应的 value,加上 --keys-only 就可以了

# 只查看 key
sh-5.0# etcdctl get --prefix /registry/namespaces --keys-only
/registry/namespaces/amamba-demo

/registry/namespaces/daocloud

/registry/namespaces/default

/registry/namespaces/kube-node-lease

/registry/namespaces/kube-public

/registry/namespaces/kube-system

/registry/namespaces/local-path-storage

/registry/namespaces/zouzou

限制返回的条数

# 加上 --limit 就可以限制返回条数
sh-5.0# etcdctl get --prefix /registry/namespaces --keys-only --limit=2
/registry/namespaces/amamba-demo

/registry/namespaces/daocloud
查询范围

etcd 也可以根据范围进行查询

语法

# 获取大于等于 key1,且小于 key2 的键值对。key2 不在范围之内,
# 因为范围是半开区间 [key1, key2), 不包含 key2
etcdctl get key1 key2

例如下面的例子

etcdctl put testdir/testkey1 "Hello world1"

etcdctl put testdir/testkey2 "Hello world2"

etcdctl put testdir/testkey3 "Hello world3"

# 范围查询
etcdctl get testdir/testkey1 testdir/testkey3

结果

testdir/testkey1
Hello world1
testdir/testkey2
Hello world2

删除数据 del

通过 del 就可以删除,返回的是删除的个数

sh-5.0# etcdctl get a
a
ba

# 删除 key 为 a 的数据,返回的是删除成功的数量
sh-5.0# etcdctl del a
1

# 在查询没有返回数据了
sh-5.0# etcdctl get a

删除前缀为 zoo 的键的命令

# 删除前缀为 zoo 的数据
etcdctl del --prefix zoo

删除键并返回被删除的键值对

sh-5.0# etcdctl put a bc
OK
sh-5.0# etcdctl del --prev-kv a
1  # 一个键被删除
a  # 被删除的键
bc # 被删除的键的值

watch 监视

watch 监测一个键值的变化,一旦键值发生更新,就会输出最新的值并退出。例如:用户更新 abc 键值为 Hello

# 新增数据
sh-5.0# etcdctl put a abc
OK

# 监听执行后没有输出,在另一个终端更改 a 的值为 hello,然后就会输出下面的内容
sh-5.0# etcdctl watch a
PUT
a
hello

 

标签:5.0,etcd,--,etcdctl,sh,key,基本操作,k8s
From: https://www.cnblogs.com/zouzou-busy/p/16368125.html

相关文章

  • RecyclerView实现下拉列表,连接数据库
    packagecom.example.clockappliction;importandroidx.appcompat.app.AppCompatActivity;importandroid.content.Intent;importandroid.os.Bundle;importandroi......
  • 软件测试常见面试题1000问涵盖一千+公司面试软件测试面试题(全网最全)
    前前后后面试了有20多家的公司吧,最近抽空把当时的录音整理了下,然后给大家分享下开头都是差不多,就让做一个自我介绍,这个不用再给大家普及了吧视频教程:【【呕心沥血】耗时7天......
  • Azure虚拟桌面专题之十一:解决DomainTrustCheck失败导致会话主机状态不可用问题
    在创建完主机池并添加会话主机之后,在主机池概述中发现虚拟机总数和不可用状态数量一样,也就是说所有的虚拟机状态都处于不可用刚开始创建之后的几分钟内状态不可用是正常现象......
  • 先用python添加用户,再用shell脚本将python程序添加的用户删除
    1.python代码添加用户(在这里用列表推导生成100个用户)importrandom,subprocessfromstringimportdigits,ascii_lettersdic={'tom':'tom','jack':'123'}defget_passwor......
  • LabVIEW|知识点:设计模式
    1、简单设计模式设计:需求-----方案架构1)简单VI模式:通常无需用户执行指定启示或停止工作。2、状态机1)表示状态的量(枚举/字符串)2)条件结构3)移位寄存器标准设计:1、使用......
  • ImageView(图像视图)
    本节介绍的UI基础控件是:ImageView(图像视图),就是用来显示图像的一个View或者说控件!本节讲解的内容如下:ImageView的src属性和blackground的区别;adjustViewBounds设置图像缩......
  • 从零开始学习Kruskal最小生成树
    -1919810.前言如果你想要学好Kruskal最小生成树的话,那么你就得先学好Kruskal最小生成树,你一看这个Kruskal最小生成树,你想掌握它还真不容易,基础知识里头你就得掌握Kruskal......
  • sql
    SQL基础条件查询语法格式:select字段1,字段2...from表名where条件;执行顺序:先from,然后where,最后select.<,>,<=,>=,<>,!=,and,between…and….,isnull,isnotn......
  • celery
    celery介绍是一个python的框架。主要用来解决定时任务异步任务延迟任务的框架官方文档https://docs.celeryq.dev/en/stable/运行原理1可以不依赖任何服务器,通......
  • 通用表表达式
    通用表表达式通用表表达式(CommonTableExpression、CTE)是一个临时的查询结果或者临时表,可以在其他SELECT、INSERT、UPDATE以及DELETE语句中使用。通用表表达式只在......