K8S核心组件etcd详解(上)

1 介绍

https://etcd.io/docs/v3.5/

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

2 etcd高可用集群部署

2.1 服务器配置

主机名ip地址cpu数量内存数量
etcd1172.18.101.3948
etcd2172.18.101.4048
etcd3172.18.101.4148

2.2 部署etcd集群

安装包下载地址

https://github.com/etcd-io/etcd/tags

以下操作在三个etcd节点上进行

[root@etcd-1 ~]# wget https://github.com/etcd-io/etcd/releases/download/v3.4.27/etcd-v3.4.27-linux-amd64.tar.gz
[root@etcd-1 ~]# tar xvf etcd-v3.4.27-linux-amd64.tar.gz
[root@etcd-1 ~]# mv etcd-v3.4.27-linux-amd64/etcd* /usr/local/bin/ ##复制etcd命令文件
[root@etcd-1 ~]# mkdir -p /var/lib/etcd/   ##创建数据存放目录
[root@etcd-1 ~]# mkdir -p /etc/etcd ##创建配置文件存放目录

三个节点设置etcd配置文件,三个节点的防火墙要放行2379及2380端口

#etcd节点1
[root@etcd-1 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd1
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.18.101.39:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.39:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.39:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="http://172.18.101.39:2379"#etcd节点2
[root@etcd-2 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd2
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.18.101.40:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.40:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.40:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="http://172.18.101.40:2379"#etcd节点3
[root@etcd-3 ~]# cat /etc/etcd/etcd.conf
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.18.101.41:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.41:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="new"
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="http://172.18.101.41:2379"
  • ETCD_NAME:指定ETCD节点的名称。每个节点在集群中应具有唯一的名称,以便进行识别和通信。

  • ETCD_DATA_DIR:指定ETCD存储数据的目录路径。ETCD使用此目录来持久化存储数据。

  • ETCD_LISTEN_PEER_URLS:指定ETCD节点监听对等节点连接的URL。对等URL用于节点之间的通信和数据同步。

  • ETCD_LISTEN_CLIENT_URLS:指定ETCD节点监听客户端连接的URL列表。客户端URL用于与ETCD集群进行交互,例如执行读取或写入操作。

  • ETCD_INITIAL_ADVERTISE_PEER_URLS:指定ETCD节点初始公告对等节点连接的URL。当新节点加入集群时,将向其他节点宣告自己的URL,以便其他节点可以找到并连接到它。

  • ETCD_INITIAL_CLUSTER:指定ETCD集群的初始成员列表及其对等节点连接URL。每个成员由名称和对等节点连接URL组成,用逗号分隔。在启动集群时,指定初始成员列表用于插入新节点。

  • ETCD_INITIAL_CLUSTER_STATE:指定ETCD集群的初始状态。可选值为"new"和"existing"。"new"表示创建一个新的集群,"existing"表示已经存在的集群。

  • ETCD_INITIAL_CLUSTER_TOKEN:指定ETCD集群的初始令牌。所有成员在启动时应使用相同的令牌,以便它们可以识别和加入相同的集群。

  • ETCD_ADVERTISE_CLIENT_URLS:指定ETCD节点公告给客户端的连接URL。客户端连接URL用于向应用程序或工具公开ETCD节点,以便进行读取和写入操作。

配置systemd管理etcd,三个节点配置相同

[root@etcd-1 ~]# cat /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Server
After=network.target
After=network-online.target
Wants=network-online.target[Service]
User=root
Type=notify
EnvironmentFile=-/etc/etcd/etcd.conf
ExecStart=/usr/local/bin/etcd
Restart=on-failure
RestartSec=10s
LimitNOFILE=40000[Install]
WantedBy=multi-user.target

三个节点上启动服务

[root@etcd-1 ~]# systemctl enable etcd
[root@etcd-1 ~]# systemctl start etcd

2.3 部署后集群状态检查

2.3.1 查看集群成员

[root@etcd-1 ~]# etcdctl member list ##列出集群成员
916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379, false
9f9b71960dcb7180, started, etcd3, http://172.18.101.41:2380, http://172.18.101.41:2379, false
[root@etcd-1 ~]# etcdctl -w table endpoint status --endpoints=172.18.101.39:2379,172.18.101.40:2379,172.18.101.41:2379 ##查看集群leader是哪个节点
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|     ENDPOINT     |       ID       | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 172.18.101.39:2379 | 9a04401d57e3afba |  3.4.27 |   20 kB |      true |      false |       123 |         14 |                 14 |       |
| 172.18.101.40:2379 | 916281517eb238d9 |  3.4.27 |   20 kB |     false |      false |       123 |         14 |                 14 |       |
| 172.18.101.41:2379 | 9f9b71960dcb7180 |  3.4.27 |   20 kB |     false |      false |       123 |         14 |                 14 |       |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

图片

2.3.2 查看集群成员的健康状态

[root@etcd-1 ~]# etcdctl -w table endpoint health --endpoints=172.18.101.39:2379,172.18.101.40:2379,172.18.101.41:2379
+--------------------+--------+------------+-------+
|     ENDPOINT     | HEALTH |   TOOK   | ERROR |
+--------------------+--------+------------+-------+
| 172.18.101.39:2379 |   true | 2.190331ms |       |
| 172.18.101.41:2379 |   true | 2.517434ms |       |
| 172.18.101.40:2379 |   true |  3.06371ms |       |
+--------------------+--------+------------+-------+

图片

3 某个节点异常如何处理

  • 使用命令移除节点

  • 删除异常节点数据目录

  • 重新将节点添加至集群

3.1 移除节点

假设etcd3出现了异常

[root@etcd-1 ~]# etcdctl member list ##第一列为节点的id
916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379, false
9f9b71960dcb7180, started, etcd3, http://172.18.101.41:2380, http://172.18.101.41:2379, false
[root@etcd-1 ~]#
[root@etcd-1 ~]# etcdctl member remove 9f9b71960dcb7180 ##通过节点的id将节点删除
Member 9f9b71960dcb7180 removed from cluster 8356fccf618a037f
[root@etcd-1 ~]# etcdctl member list
916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379, false

3.2 删除异常节点的数据目录

[root@etcd-3 ~]# rm -rf /var/lib/etcd
[root@etcd-3 ~]# cat /etc/etcd/etcd.conf ##修改ETCD_INITIAL_CLUSTER_STATE为exsiting
ETCD_NAME=etcd3
ETCD_DATA_DIR="/var/lib/etcd"
ETCD_LISTEN_PEER_URLS="http://172.18.101.41:2380"
ETCD_LISTEN_CLIENT_URLS="http://127.0.0.1:2379,http://172.18.101.41:2379"
ETCD_INITIAL_ADVERTISE_PEER_URLS="http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER="etcd1=http://172.18.101.39:2380,etcd2=http://172.18.101.40:2380,etcd3=http://172.18.101.41:2380"
ETCD_INITIAL_CLUSTER_STATE="existing"  ##修改为existing
ETCD_INITIAL_CLUSTER_TOKEN="singless"
ETCD_ADVERTISE_CLIENT_URLS="http://172.18.101.41:2379"

图片

3.3 将节点添加至集群

[root@etcd-1 ~]# etcdctl member add etcd3 --peer-urls=http://172.18.101.41:2380
Member 51fc8f5f71060fdc added to cluster 8356fccf618a037f
[root@etcd-1 ~]# etcdctl member list ##可以看到节点添加后处于一个未启动的状态,需要手动去etcd-3节点上启动一下etcd服务
51fc8f5f71060fdc, unstarted, , http://172.18.101.41:2380, , false
916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379, false

图片

在etcd-3上启动服务即可

[root@etcd-3 ~]# systemctl start etcd
[root@etcd-1 ~]# etcdctl member list ##重新添加后,节点的id会变,属于正常现象
51fc8f5f71060fdc, started, etcd3, http://172.18.101.41:2380, http://172.18.101.41:2379, false
916281517eb238d9, started, etcd2, http://172.18.101.40:2380, http://172.18.101.40:2379, false
9a04401d57e3afba, started, etcd1, http://172.18.101.39:2380, http://172.18.101.39:2379, false

4 etcdctl增删改查操作

https://github.com/etcd-io/etcd/tree/main/etcdctl

etcdctl 是用于与 ETCD 进行交互的命令行工具,它提供了一系列命令和选项,用于检索、设置、修改和删除 ETCD 中的数据。

4.1 etcd的数据存储模型

前面介绍过,etcd是一个分布式的键值存储系统。etcd在键的组织上采用了层次化的空间结构,类似于文件系统中目录的概念。但是并不存在目录的那种层级关系。

例如现在

类似于文件系统中的目录(文件夹)结构,ETCD的命名空间允许以键的层次结构来组织数据,并且每个键可以唯一地标识一个节点。顶层节点被称为根节点,然后可以在根节点下创建子节点,子节点又可以包含更多子节点,以此类推。这种层次化的结构可以用于将数据进行分类、分类和组织。

例如,假设我们有以下目录结构:

  • /singless/test

  • /singless/test/gender

在上述示例中/singless/test/singless/test/gender,有类似于目录一样的共同的索引前缀//singless,但是并不存在目录的那种层级关系。它们都可以作为一个key存储相应的value。

4.2 增和改

增加数据和修改数据需要用到put命令进行操作

[root@etcd-1 ~]# etcdctl put /singless/test/gender male ##创建一个键/singless/test/gender,值为male
OK
[root@etcd-1 ~]# etcdctl put /singless/test true ##创建一个键/singless/test,值为test
OK

图片

4.3 查询操作

查询操作需要使用到get参数

[root@etcd-1 ~]# etcdctl get /singless/test/gender ##根据具体的key查询对应的值
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl get --prefix / ##根据索引前缀查询,这里查询的是以/为前缀的key、value,所以能看到所有的键值对
/singless/test
true
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl put /singless/test false ##使用put修改键/singless/test的value
OK
[root@etcd-1 ~]# etcdctl get /singless/test
/singless/test
false

图片

4.4 删除操作

删除操作使用del命令

[root@etcd-1 ~]# etcdctl del /singless/test ##可以指定key进行删除
1
[root@etcd-1 ~]# etcdctl get --prefix /
/singless/test/gender
male
[root@etcd-1 ~]# etcdctl del --prefix / ##也可以执行索引前缀进行删除
1
[root@etcd-1 ~]# etcdctl get --prefix /

5 k8s中的etcd

5.1 介绍

k8s中所有对象的manifest都需要保存到某个地方,这样他们的manifest在api server重启和失败的时候才不会丢失,因此引入了etcd。在k8s中只有api server和etcd直接交互,其它组件都通过api server间接和etcd交互,这样做的好处如下。

  • 增强乐观锁系统及验证系统的健壮性

  • 方便后续存储的替换,只需修改api server组件的相关接口。

etcd是一个响应快、分布式、一致的KV存储,也是k8s存储集群状态和元数据的唯一地方。

图片

5.2 查看k8s中etcd存储的数据

[root@k8s-master01 ~]# kubectl get pod -n kube-system |grep etcd
etcd-k8s-master01                          1/1     Running   1             47d
etcd-k8s-master02                          1/1     Running   0             47d
etcd-k8s-master03                          1/1     Running   0             47d
[root@k8s-master01 ~]#
[root@k8s-master01 ~]# kubectl exec -it -n kube-system etcd-k8s-master01 -- /bin/sh
sh-5.1# etcdctl member list --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key
15c808b23512a31a, started, k8s-master02, https://10.0.107.77:2380, https://10.0.107.77:2379, false
5ca9692dbcd57e55, started, k8s-master03, https://10.0.113.204:2380, https://10.0.113.204:2379, false
f8b45063ae1a7dfa, started, k8s-master01, https://10.0.87.66:2380, https://10.0.87.66:2379, false

k8s中的etcd需要使用到证书进行认证

图片

查看etcd中存储的数据,可以手动在master节点上安装etcdctl命令

[root@k8s-master01 ~]# export ETCDCTL_API=3 ##指定使用的api版本
[root@k8s-master01 ~]# etcdctl get --prefix "" --endpoints=10.0.87.66:2379,10.0.107.77:2379,10.0.113.204:2379 --cacert=/etc/kubernetes/pki/etcd/ca.crt --cert=/etc/kubernetes/pki/etcd/server.crt --key=/etc/kubernetes/pki/etcd/server.key |head -2

--endpoints指定etcd节点,另外要使用到k8s证书,证书通常在/etc/kubernetes/pki/目录下,以下输出可以看到etcd中存储的k8s相关的键值数据。

图片

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/95184.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Llama 2免费托管及API提供

Llama 2 是 Meta 最新的文本生成模型,目前其性能优于所有开源替代方案。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 1、强大的Llama 2 它击败了 Falcon-40B(之前最好的开源基础模型),与 GPT-3.5 相当,仅低…

redis的三种集群方式

redis有三种集群方式:主从复制,哨兵模式和集群。 1.主从复制 主从复制原理: 从服务器连接主服务器,发送SYNC命令; 主服务器接收到SYNC命名后,开始执行BGSAVE命令生成RDB文件并使用缓冲区记录此后执行的所…

Fluent-MyBatis

Fluent-MyBatis Fluent-MyBatis 简介 何为 Fluent Mybatis? Fluent Mybatis, 是一款 Mybatis 语法增强框架, 综合了 Mybatis Plus, Dynamic SQL, JPA 等框架特性和优点 Fluent-MyBatis 开源地址 Fluent-MyBatis 原理 Fluent-MyBatis 原理是利用 annotation pro…

2023.8.12号论文阅读

文章目录 TriFormer: A Multi-modal Transformer Framework For Mild Cognitive Impairment Conversion Prediction摘要本文方法实验结果 SwIPE: Efficient and Robust Medical Image Segmentation with Implicit Patch Embeddings摘要本文方法实验结果 TriFormer: A Multi-mod…

Java实现钉钉企业内部应用机器和自定义机器人发送消息

前言 公司让写一个服务监控的功能,当监测到服务停止时,向钉钉群里推送报警信息。之前大概看到钉钉的开放平台的API文档,好像能群发消息的只有机器人。 钉钉开放平台目前提供三种机器人: 企业内部应用机器人 群模板机器人 自定义机器人 本来向用自己比较熟悉的自定义机器人…

【实用黑科技】如何 把b站的缓存视频弄到本地——数据恢复软件WinHex 和 音视频转码程序FFmpeg

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:效率…

numpy与matplotlib 常用日常代码

matplotlab 和 numpy 可能是python 数据处理工作中用的最多的库了, 官网的文档十分详细,但是就是因为数量庞大,很多时候常用的功能和生僻冷门的功能混在一起,找不到重点。按照二八原则,掌握20%的功能就已经能应付绝大多…

[Docker精进篇] Docker镜像构建和实践 (三)

前言: Docker镜像构建的作用是将应用程序及其依赖打包到一个可移植、自包含的镜像中,以便在不同环境中快速、可靠地部署和运行应用程序。 文章目录 Docker镜像构建1️⃣是什么?2️⃣为什么?3️⃣镜像构建一、用现有容器构建新镜像…

最强自动化测试框架Playwright(34)CDPSession

在 Playwright 中,CDPSession 类是用于与浏览器的 Chrome DevTools Protocol (CDP) 会话进行交互的对象。CDP 是与Chromium浏览器通信的底层协议,它提供了许多与浏览器进行交互和控制的功能。 CDPSession 类提供了执行底层 CDP 命令的方法,并…

优测云服务平台|【压力测试功能升级】轻松完成压测任务

一、本次升级主要功能如下: 1.多份报告对比查看测试结果 2.报告新增多种下载格式 Word格式Excel格式 3.新增多种编排复杂场景的控制器 漏斗控制器并行控制器事务控制器仅一次控制器分组控制器集合点 4.新增概览页面,包含多种统计维度 二、报告对比…

30W IP网络有源音箱 校园广播音箱

SV-7042XT是深圳锐科达电子有限公司的一款2.0声道壁挂式网络有源音箱,具有10/100M以太网接口,可将网络音源通过自带的功放和喇叭输出播放,可达到功率30W。同时它可以外接一个30W的无源副音箱,用在面积较大的场所。5寸进口全频低音…

嵌入式Linux开发实操(九):CAN接口开发

前言: CAN网络在汽车中的使用可以说相当广泛。而CAN网络需要的收发器最常用的就是NXP 的TJA1042: CAN网络:

Docker网络与Cgroup硬件资源占用控制

目录 1.dockers的网络模式 1.1 获取容器的进程号 1.2 docker网络模式的特性 1.3 host主机模式 1.4 container模式 1.5 none模式 1.6 bridge 桥接模式 1.6 容器的自定义网络 (1)未创建自定义网络时,创建指定IP容器的测试 &#xff0…

opsForHash() 与 opsForValue 请问有什么区别?

&#x1f449;&#xff1a;&#x1f517;官方API参考手册 如图&#xff0c;opsForHash()返回HashOperations<K,HK,HV>但是 opsForValue()返回ValueOperations<K,V>… 区别就是opsForHash的返回值泛型中有K,HK,HV,其中K是Redis指定的某个数据库里面某一个关键字(由…

详解拦截器和过滤器

目录 代码演示过滤器Demo拦截器Demo 过滤器自定义拦截器配置拦截器过滤器执行原理多个过滤器的执行顺序 拦截器自定义拦截器注册拦截器1&#xff09;注册拦截器2&#xff09;配置拦截的路径3&#xff09;配置不拦截的路径 多个拦截器的执行顺序 过滤器和拦截器的区别 代码演示 …

如何使用Spark/Flink等分布式计算引擎做网络入侵检测

如何使用Spark/Flink等分布式计算引擎做网络入侵检测 引言16 Distributed Abnormal Behavior Detection Approach Based on Deep Belief Network and Ensemble SVM Using Spark17 Spark configurations to optimize decision tree classification on UNSW-NB1518 A dynamic spa…

elementUI 的上传组件<el-upload>,自定义上传按钮样式

方法一&#xff1a; 原理&#xff1a;调用<el-upload>组件的方法唤起选择文件事件 效果&#xff1a; 页面代码&#xff1a; 1、选择图片按钮 <div class"flex_row_spacebetween btn" click"chooseImg"><span class"el-icon-plus ic…

【QT】 QFileQFileInfo文件操作

很高兴在雪易的CSDN遇见你 &#xff0c;给你糖糖 欢迎大家加入雪易社区-CSDN社区云 前言 本文分享QT对文件的操作技术&#xff0c;希望对各位小伙伴有所帮助&#xff01; 感谢各位小伙伴的点赞关注&#xff0c;小易会继续努力分享&#xff0c;一起进步&#xff01; 你的点…

Vue3 —— watchEffect 高级侦听器

该文章是在学习 小满vue3 课程的随堂记录示例均采用 <script setup>&#xff0c;且包含 typescript 的基础用法 前言 Vue3 中新增了一种特殊的监听器 watchEffect&#xff0c;它的类型是&#xff1a; function watchEffect(effect: (onCleanup: OnCleanup) > void,o…

go_并发编程(1)

go并发编程 一、 并发介绍1&#xff0c;进程和线程2&#xff0c;并发和并行3&#xff0c;协程和线程4&#xff0c;goroutine 二、 Goroutine1&#xff0c;使用goroutine1&#xff09;启动单个goroutine2&#xff09;启动多个goroutine 2&#xff0c;goroutine与线程3&#xff0…