K8S核心组件etcd详解(上)

这篇具有很好参考价值的文章主要介绍了K8S核心组件etcd详解(上)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1 介绍

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

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

2 etcd高可用集群部署

2.1 服务器配置

主机名 ip地址 cpu数量 内存数量
etcd1 172.18.101.39 4 8
etcd2 172.18.101.40 4 8
etcd3 172.18.101.41 4 8

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 |       |
+--------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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 |       |
+--------------------+--------+------------+-------+

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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"

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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

K8S核心组件etcd详解(上),kubernetes,etcd,容器

在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

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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存储集群状态和元数据的唯一地方。

K8S核心组件etcd详解(上),kubernetes,etcd,容器

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需要使用到证书进行认证

K8S核心组件etcd详解(上),kubernetes,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相关的键值数据。

K8S核心组件etcd详解(上),kubernetes,etcd,容器文章来源地址https://www.toymoban.com/news/detail-657506.html

到了这里,关于K8S核心组件etcd详解(上)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 容器化进阶Kubernetes(K8S)详解

    1.1.1 Kubernetes是什么及作用 Kubernetes(K8S)是Google在2014年发布的一个开源项目,用于自动化容器化应用程序的部署、扩展和管理。 Kubernetes通常结合docker容器工作,并且整合多个运行着docker容器的主机集群。 官网地址 Kubernetes 中文社区 Kubernetes(k8s)中文文档 目录_Kubernetes中文社

    2024年02月05日
    浏览(78)
  • K8S基础理论,核心组件,数据流向详解

    目录 第一章.k8s概述 1.1.什么是云原生 1.2.什么是K8S 1.3.K8S的优势 1.4.K8S的功能 1.5.K8S 的特性: 1.6.Kubernetes 集群架构与组件 第二章.K8S的核心组件 2.1.Master 组件 2.2.配置存储中心 2.3.Node 组件 第三章.Kubernetes 核心概念 3.1.Pod 3.2.Pod 控制器 3.3.Label 3.4.Label 选择器(Label selector) 3.5.S

    2024年02月03日
    浏览(47)
  • 基于k8s集群容器化部署etcd集群和apisix服务

    创建StorageClass,支持动态pvc创建,StorageClass使用nfs-client,同时使用华为云sfs作为数据持久化存储目录 角色认证(rabc.yaml) 创建nfs-provisioner(nfs-provisioner.yaml) 设置nfs-client(nfs-client.yaml) 创建svc,后续apisix中会使用到(svc.yaml) 挨个执行以上yaml文件,kubectl apply -f ***.yaml 创建etcd有状态服务(e

    2024年01月19日
    浏览(42)
  • K8s组件:etcd安装、使用及原理(Linux)

    1.1 介绍 分布式系统架构中对一致性要求很高,etcd就满足了分布式系统中的一致性要求。 实现了分布式一致性键值对存储的中间件,支持跨平台,有活跃的社区。 etcd 是基于go实现的一个分布式键值对存储(类比Redis),设计用来可靠而快速的保存关键数据并提供访问。通过分布

    2024年02月03日
    浏览(51)
  • Kubernetes(K8s)从入门到精通系列之十:使用 kubeadm 创建一个高可用 etcd 集群

    默认情况下,kubeadm 在每个控制平面节点上运行一个本地 etcd 实例。也可以使用外部的 etcd 集群,并在不同的主机上提供 etcd 实例。 可以设置HA集群: 使用堆叠控制控制平面节点,其中 etcd 节点与控制平面节点共存 使用外部 etcd 节点,其中 etcd 在与控制平面不同的节点上运行

    2024年02月14日
    浏览(55)
  • 【云原生 • Kubernetes】认识 k8s、k8s 架构、核心概念点介绍

    目录 一、Kubernetes 简介 二、Kubernetes 架构 三、Kunbernetes 有哪些核心概念? 1. 集群 Cluster 2. 容器 Container 3. POD 4. 副本集 ReplicaSet 5. 服务 service 6. 发布 Deployment 7. ConfigMap/Secret 8. DaemonSet 9. 核心概念总结 Kubernetes 简称 k8s,是支持云原生部署的一个平台,起源于谷歌。谷歌早在十几

    2024年02月03日
    浏览(199)
  • Kubernetes技术--k8s核心技术 ingress

    1.引入        我们之前在部署应用(如nginx)的时候,如果你需要外部进行访问,使用的是service中的nodePort方式进行对外的暴露。然后外部就可以使用ip + 端口号来进行访问部署应用。         其实这一种方式是存在着较为明显的缺陷,每一个端口你只能够使用一次,一个端口

    2024年02月10日
    浏览(42)
  • Kubernetes技术--k8s核心技术 configMap

    1.概述    configMap最主要的作用是 存储一些 不加密 的数据 到 /etcd ,让pod以变量或者数据卷(volume)挂载到容器。    应用场景:配置文件、存储信息等 2.使用 -1. 创建配置文件。 这里我们需要先编写一个配置文件。使用redis,如下所示:

    2024年02月10日
    浏览(56)
  • Kubernetes技术--k8s核心技术Helm

    1.引入 我们先回顾一下之前部署 一个应用 的过程,如部署nginx,实现效果如下所示: -1.编写deployment的yaml文件,然后运行。 -2.使用service中的NodePort对外暴漏端口 -3.为了弥补Nodeport的缺陷,使用ingress实现转发        这样一个应用就部署完了,这一种情况相对于如果你需要部署

    2024年02月09日
    浏览(50)
  • Kubernetes技术--k8s核心技术 Secret

    1.概述      Secret 解决了密码、token、密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中。Secret可以以 Volume 或者环境变量的方式使用。 作用       加密数据存储在/etc中 ,使得 pod 容器以挂载volume方式进行访问 。在进行的数据存储中是以 base64

    2024年02月10日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包