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.mzph.cn/news/41226.shtml

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

相关文章

【hive】简单介绍hive的几种join

文章目录 前言1. Common Join2. Map Join介绍:使用方法:限制: 3. Bucket Map Join介绍:好处:使用条件:使用方法: 4. Sort Merge Bucket Map Join介绍:如何使用: 5. Skew …

如何在控制台查看excel内容

背景 最近发现打开电脑的excel很慢,而且使用到的场景很少,也因为mac自带了预览的功能。但是shigen就是闲不住,想自己搞一个excel预览软件,于是在一番技术选型之后,我决定使用python在控制台显示excel的内容。 具体的需…

NodeJs导出PDF

(优于别人,并不高贵,真正的高贵应该是优于过去的自己。——海明威) 场景 根据订单参数生成账单PDF 结果 示例代码 /* eslint-disable no-unused-vars */ /* eslint-disable no-undef */ /* eslint-disable complexity */ const…

【仿写tomcat】二、扫描java文件,获取带有@WebServlet注解的类

tomcat仿写 项目结构扫描文件servlet注解map容器servlet工具类启动类调用 项目结构 扫描文件之前当然要确定一下项目结构了,我这里的方案是tomcat和项目同级 项目的话就仿照我们平时使用的结构就好了,我们规定所有的静态资源文件都在webApp目录下存放…

Java进阶篇--数据结构

目录 一.数组(Array): 1.1 特点: 1.2 基本操作: 1.3 使用数组的好处包括: 1.4 数组也有一些限制: 二.集合框架(Collections Framework): 2.1 列表…

当你出差在外时,怎样轻松访问远程访问企业局域网象过河ERP系统?

文章目录 概述1.查看象过河服务端端口2.内网穿透3. 异地公网连接4. 固定公网地址4.1 保留一个固定TCP地址4.2 配置固定TCP地址 5. 使用固定地址连接 概述 ERP系统对于企业来说重要性不言而喻,不管是财务、生产、销售还是采购,都需要用到ERP系统来协助。…

miniconda克隆arcpy

arcpy环境克隆 前言尝试思考到此结束 前言 最近遇到了一些问题,需要用到arcpy来处理一些东西,但众所周知,arcgis的arcpy是python 2.0的,我不是很喜欢;所以我安装了arcgis pro 2.8,我发现这也是个坑&#x…

Git分布式版本控制系统

目录 2、安装git 2.1 初始环境 2.2 Yum安装Git 2.3 编译安装 2.4 初次运行 Git 前的配置 2.5 初始化及获取 Git 仓库 2.6 Git命令常规操作 2.6.2 添加新文件 2.6.3 删除git内的文件 2.6.4 重命名暂存区数据 2.6.5 查看历史记录 2.6.6 还原历史数据 2.6.7 还原未来…

react使用antd的table组件,实现点击弹窗显示对应列的内容

特别提醒:不能在table的columns的render里面设置弹窗组件渲染,因为这会导致弹窗显示的始终是最后一行的内容,因为这样渲染的结果是每一行都会重新渲染一遍这个弹窗并且会给传递一个content的值,渲染到最后一行的时候,就…

Unity的TimeScale的影响范围分析

大家好,我是阿赵。 这期来说一下Unity的TimeScale。 一、前言 Unity提供了Time这个类,来控制时间。其实我自己倒是很少使用这个Time,因为做网络同步的游戏,一般是需要同步服务器时间,所以我比较多是在使用System.Date…

问道管理:机器人概念走势活跃,新时达涨停,拓斯达、丰立智能等大涨

机器人概念17日盘中走势活跃,到发稿,拓斯达大涨18%,昊志机电涨近16%,丰立智能涨超13%,步科股份、优德精细涨超10%,新时达涨停,天玑科技、兆龙互联、中大力德涨逾9%。 消息面上,8月16…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

element+vue 表格行拖拽功能

解决方案 使用 sortable.js 步骤一&#xff1a; 安装 npm install vuedraggable步骤二&#xff1a;引入 import Sortable from sortablejs;步骤三&#xff1a; el-table 添加row-key属性&#xff0c;外层包一层 sortableDiv <div class"sortableDiv"> 拖…

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测

分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测 目录 分类预测 | MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测分类效果基本描述程序设计参考资料 分类效果 基本描述 1.MATLAB实现WOA-CNN-BiLSTM-Attention数据分类预测&#xff0c;运行环境Matlab2023b及以上…

seata 的部署和集成

文章目录 seata的部署和集成一、部署Seata的tc-server1.下载2.解压3.修改配置4.在nacos添加配置5.创建数据库表6.启动TC服务 二、微服务集成seata1.引入依赖2.修改配置文件 TODO三、TC服务的高可用和异地容灾1.模拟异地容灾的TC集群2.将事务组映射配置到nacos3.微服务读取nacos…

中期国际:MT4数据挖掘与分析方法:以数据为导向,制定有效的交易策略

在金融市场中&#xff0c;制定有效的交易策略是成功交易的关键。而要制定一份可靠的交易策略&#xff0c;数据挖掘与分析方法是不可或缺的工具。本文将介绍如何以数据为导向&#xff0c;利用MT4进行数据挖掘与分析&#xff0c;从而制定有效的交易策略。 首先&#xff0c;我们需…

操作系统搭建相关知识

文章目录 系统篇netstat命令systemctl命令Systemd系统资源分类&#xff08;12类&#xff09; 网络篇ifconfig命令操作系统配置动态IP脚本dhcp服务的安装与配置防火墙相关知识 操作系统常用配置文件 系统篇 netstat命令 netstat指路 systemctl命令 常用于重启系统的每个服务…

Jetpack Compose:探索声明式UI开发的未来

Jetpack Compose&#xff1a;探索声明式UI开发的未来 1. 引言 在移动应用开发领域&#xff0c;用户界面&#xff08;UI&#xff09;开发一直是开发过程中的关键挑战之一。传统的UI开发方式往往涉及大量繁琐的布局代码、手动管理状态和事件处理&#xff0c;不仅容易引发错误&a…

Google浏览器点击链接打开新标签页

由于新安装的谷歌浏览器点击链接时默认在当前窗口打开非常不方便&#xff0c;这里提供一下解决思路 1、打开浏览器输入任意内容&#xff0c;点击右上角的设置 2、在弹出的选项栏中点击See all Search settings 3、点击Other settings&#xff0c;将指定选项打开即可