k8s的核心组件etcd的安装使用、快照说明及etcd命令详解【含单节点,多节点和新节点加入说明】


见下面多节点配置中:“新节点加入集群”,有详细说明

删除一个节点成员


  • 命令:etcdctl member remove id【ID用命令:etcdctl member list查看,开头的一串数字就是ID】

  • 如,我删除158这个成员

[root@etcd1 ~]# etcdctl member list | grep 158

240bc0d12da09d72: name=etcd-158 peerURLs=http://192.168.59.158:2380 clientURLs=http://192.168.59.158:2379,http://localhost:2379 isLeader=false

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl member remove 240bc0d12da09d72

Removed member 240bc0d12da09d72 from cluster

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl member list | grep 158

[root@etcd1 ~]#

备份etcd的整个数据目录


  • 如果是通过快照恢复,还会清除默认数据目录的所有内容,所以备份整个数据目录和快照是冲突的,主要是说明一下etcdctl中backup的使用以及etcd的默认数据目录罢了。

  • 默认的数据目录为/var/lib/etcd/

[root@etcd1 ~]# etcdctl backup --data-dir /var/lib/etcd --backup-dir /tmp/etcd

2021-07-14 10:40:01.869919 I | open /var/lib/etcd/member/snap: no such file or directory

[root@etcd1 ~]# cd /tmp/etcd

[root@etcd1 etcd]# ls

member

[root@etcd1 etcd]#

  • 参数说明:

  • --data-dir:指明数据目录的位置

  • --backup-dir:指明备份的位置

etcd单节点命令的使用【增删改查】

=================================================================================

etcd单节点的安装配置


安装etcd包

  • 安装etcd包:yum -y install etcd

配置文件编辑

  • 3台虚拟机,仅用一个节点操作即可【是单节点配置】。

  • 安装完毕后配置文件如下:

[root@etcd1 etcd]# cd /etc/etcd/

[root@etcd1 etcd]# ls

etcd.conf

[root@etcd1 etcd]#

  • 编辑前还是先备份一下源文件:

[root@etcd1 etcd]# cp /etc/etcd/etcd.conf /

  • 注意,配置文件中的所有参数在下面这篇博客中有详细说明,自行去查看对比,我在这就不对参数做说明,仅对修改内容做说明

博客连接。。。。。。

  • 需要修改的内容如下:

[root@etcd1 etcd]# vim /etc/etcd/etcd.conf

1 #[Member]

2 #下面行是存储位置,可以自定义位置【我是用的默认】

3 ETCD_DATA_DIR=“/var/lib/etcd/default.etcd”

4 #下面3380需要取消注释,和3379后面都需要加上自己ip:port【默认用的是回环端口】

5 ETCD_LISTEN_PEER_URLS=“http://localhost:2380,http://192.168.59.156:2380”

6 ETCD_LISTEN_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

7 #

8 #下面是etcd名字,可以自定义【我用的默认】

9 ETCD_NAME=“default”

19 #[Clustering]

20 #添加下面的ip,让其监听该端口

21 ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

22 #ETCD_DISCOVERY=“”

#其他参数可以不用动,直接保存退出

服务加入开机启动

因为我不是第一次执行,所以没有打印任何内容。

[root@etcd1 ~]# systemctl enable etcd --now

[root@etcd1 ~]#

[root@etcd1 ~]# systemctl is-active etcd

active

[root@etcd1 ~]#

获取帮助


  • 这里面有使用的说明,多看看这里面。

  • 方式一:etcdctl --help

  • 方式二:man etcdctl

  • etcd写入数据有2个版本,版本2和版本3,默认使用的版本2

注:版本2个版本3写入数据的方式是不一样的且不可混用。

版本2


  • 默认使用的是版本2,如果切换到版本3了,使用下面命令切换版本2的环境。

命令:export ETCDCTL_API=2

查看所有命令

  • 执行:etcdctl --help

下拉,有一个COMMANDS,这里面就是2版本的所有命令了【和linux命令类似】

COMMANDS:

backup backup an etcd directory

cluster-health check the health of the etcd cluster

mk make a new key with a given value

mkdir make a new directory

rm remove a key or a directory

rmdir removes the key if it is an empty directory or a key-value pair

get retrieve the value of a key

ls retrieve a directory

set set the value of a key

setdir create a new directory or update an existing directory TTL

update update an existing key with a given value

updatedir update an existing directory

watch watch a key for changes

exec-watch watch a key for changes and exec an executable

member member add, remove and list subcommands

user user add, grant and revoke subcommands

role role add, grant and revoke subcommands

auth overall auth controls

help, h Shows a list of commands or help for one command

如:创建、查看、删除

[root@etcd1 ~]# etcdctl ls /

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl mkdir /aa

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl ls /

/aa

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl rmdir /aa

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl ls /

[root@etcd1 ~]#

其他节点访问该etcd

  • 准确来说,叫做远程执行其他etcd命令罢了【注意,这仅仅是远程访问而已,并不是该集群的一部分】

命令:etcdctl --endpoints IP:2379 这跟需要执行的命令【2和3的版本命令不一样】

  • 如下,我在157上查看156这个etc的数据

[root@etcd2 ~]# etcdctl --endpoints http://192.168.59.156:2379 ls /

/aa

[root@etcd2 ~]#

[root@etcd2 ~]# ip a | grep 59

inet 192.168.59.157/24 brd 192.168.59.255 scope global ens32

[root@etcd2 ~]#

版本3


  • 需要执行一个环境变量,然后就默认使用版本3了。

命令:export ETCDCTL_API=3

查看所有命令

  • 我执行了3的环境变量后,直接执行:etcdctl --help

下拉,有一个COMMANDS,这里面就是3版本的所有命令了【这个更像数据库】,可以看到比2多很多,而且使用方式也变了

COMMANDS:

get Gets the key or a range of keys

put Puts the given key into the store

del Removes the specified key or range of keys [key, range_end)

txn Txn processes all the requests in one transaction

compaction Compacts the event history in etcd

alarm disarm Disarms all alarms

alarm list Lists all alarms

defrag Defragments the storage of the etcd members with given endpoints

endpoint health Checks the healthiness of endpoints specified in --endpoints flag

endpoint status Prints out the status of endpoints specified in --endpoints flag

endpoint hashkv Prints the KV history hash for each endpoint in --endpoints

move-leader Transfers leadership to another etcd cluster member.

watch Watches events stream on keys or prefixes

version Prints the version of etcdctl

lease grant Creates leases

lease revoke Revokes leases

lease timetolive Get lease information

lease list List all active leases

lease keep-alive Keeps leases alive (renew)

member add Adds a member into the cluster

member remove Removes a member from the cluster

member update Updates a member in the cluster

member list Lists all members in the cluster

snapshot save Stores an etcd node backend snapshot to a given file

snapshot restore Restores an etcd member snapshot to an etcd directory

snapshot status Gets backend snapshot status of a given file

make-mirror Makes a mirror at the destination etcd cluster

migrate Migrates keys in a v2 store to a mvcc store

lock Acquires a named lock

elect Observes and participates in leader election

auth enable Enables authentication

auth disable Disables authentication

user add Adds a new user

user delete Deletes a user

user get Gets detailed information of a user

user list Lists all users

user passwd Changes password of user

user grant-role Grants a role to a user

user revoke-role Revokes a role from a user

role add Adds a new role

role delete Deletes a role

role get Gets detailed information of a role

role list Lists all roles

role grant-permission Grants a key to a role

role revoke-permission Revokes a key from a role

check perf Check the performance of the etcd cluster

help

如:创建、查看、删除

文件存储是以表链接的形式。

[root@etcd1 ~]# #/ccx/date1是存储路径,"ccx is superhero"是数据内容

[root@etcd1 ~]# etcdctl put /ccx/date1 “ccx is superhero”

OK

[root@etcd1 ~]# etcdctl get /ccx/date1

/ccx/date1

ccx is superhero

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl del /ccx/date1

1

[root@etcd1 ~]#

[root@etcd1 ~]# etcdctl get /ccx/date1

其他节点访问该etcd

  • 准确来说,叫做远程执行其他etcd命令罢了【注意,这仅仅是远程访问而已,并不是该集群的一部分】

命令:etcdctl --endpoints IP:2379 这跟需要执行的命令【2和3的版本命令不一样】

  • 如下,我在157上查看156这个etc的数据

[root@etcd2 ~]# #我查看3的内容,本地也需要切换到3的环境,否则命令找不到

[root@etcd2 ~]# export ETCDCTL_API=3

[root@etcd2 ~]# etcdctl --endpoints http://192.168.59.156:2379 get /ccx/date1

/ccx/date1

ccx is superhero

[root@etcd2 ~]#

[root@etcd2 ~]#

[root@etcd2 ~]# ip a | grep 59

inet 192.168.59.157/24 brd 192.168.59.255 scope global ens32

[root@etcd2 ~]#

取消版本定义【恢复默认】


  • 比如我之前定义了版本3,现在想让其恢复到默认状态【默认位版本2】

注:k8s在1.5版本以后默认使用的是版本3向etcd写入数据。

  • 命令:unset ETCDCTL_API

[root@etcd1 ~]# export ETCDCTL_API=3

[root@etcd1 ~]#

[root@etcd1 ~]# unset ETCDCTL_API

[root@etcd1 ~]#

多节点配置

====================================================================

  • 前面说过,最好是3台,我用2台以配置文件的形式加入,第三台用加入集群的方式。

配置主节点【主节点leader】


  • 注:这个没有真正的主节点概念,我只是用这个来做第一个配置,为了后面好说明,所以命其为 “主节点”

  • 先停止etcd服务并清除现有数据【我是用上面单节点配置的,已经配置并启动etcd服务】

注:必须清空数据,否则会报错

[root@etcd1 ~]# systemctl stop etcd

[root@etcd1 ~]# rm -rf /var/lib/etcd/*

[root@etcd1 ~]#

[root@etcd1 ~]# ls /var/lib/etcd

修改配置文件

  • 文件:/etc/etcd/etcd.conf

  • 可以看到,现在配置文件中可用的就这么几行

[root@etcd1 ~]# grep -o ‘[#].*’ /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/default.etcd”

ETCD_LISTEN_PEER_URLS=“http://localhost:2380,http://192.168.59.156:2380”

ETCD_LISTEN_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

ETCD_NAME=“default”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

[root@etcd1 ~]#

  • 直接vim /etc/etcd/etcd.conf,将里面的东西删完,复制下面内容进去修改IP,其他不变。

  • 192.168.59.156为我当前节点IP,192.168.59.157/158为我准备加入该节点的IP

[root@etcd1 ~]# vim /etc/etcd/etcd.conf

#数据存储位置【自定义】

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

#服务器间通讯端口

ETCD_LISTEN_PEER_URLS=“http://192.168.59.156:2380,http://localhost:2380”

客户端通讯端口

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.156:2379,http://localhost:2379”

#集群名字【自定义】

ETCD_NAME=“etcd-156”

#端口监听

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.156:2380”

#端口监听

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

#所有集群IP信息都需要列出来【自己和要加入该集群的ip,前面的名称是上面的集群名字,不能乱写】

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380”

#类似于秘钥【每台上面的这个值要一样】

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

#新集群值必须为new

ETCD_INITIAL_CLUSTER_STATE=“new”

  • 参数详细说明:

  • ETCD_DATA_DIR 服务运行数据保存的路径

  • ETCD_NAME 节点名称,默认为default

-ETCD_LISTEN_PEER_URLS 监听的同伴通信的地址,比如http://ip:2380,如果有多个,使用逗号分隔。需要 所有节点都能够访问,所以不要使用 localhost!

  • ETCD_LISTEN_CLIENT_URLS 监听的客户端服务地址

  • ETCD_ADVERTISE_CLIENT_URLS 对外公告的该节点客户端监听地址,这个值会告诉集群中其他节点。

  • ETCD_INITIAL_ADVERTISE_PEER_URLS 对外公告的该节点同伴监听地址,这个值会告诉集群中其他节点

  • ETCD_INITIAL_CLUSTER 集群中所有节点的信息

  • ETCD_INITIAL_CLUSTER_STATE 新建集群的时候,这个值为 new;假如加入已经存在的集群,这个值为 existing。

  • ETCD_INITIAL_CLUSTER_TOKEN 集群的ID,多个集群的时候,每个集群的ID必须保持唯一

导入配置文件到其他节点

  • 主节点上将配置文件拷贝到另外一个节点上【导入前要先去另外节点上安装etcd服务】

[root@etcd1 ~]# scp /etc/etcd/etcd.conf 192.168.59.157:/etc/etcd/

root@192.168.59.157’s password:

etcd.conf 100% 567 984.1KB/s 00:00

[root@etcd1 ~]#

其他节点同步主节点【备节点】


  • 注:加入主节点其实和主节点的配置是一样的,为了方便说明才命其为:”其他节点“

安装etcd包

  • 安装etcd包:yum -y install etcd

修改配置文件

  • 我在主节点上已经将配置文件导入过来了,所以直接将ip和NAME修改即可【其他不变】。

  • 修改IP:在编辑界面输入::1,6s/156/157/g可以直接替换1-6行的ip【仅替换1-6行】

在这里插入图片描述

  • 修改ETCD_NAME=,修改规则如下图

在这里插入图片描述

  • 如,我157修改完毕以后的配置文件信息如下

[root@etcd2 ~]# cat /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

ETCD_LISTEN_PEER_URLS=“http://192.168.59.157:2380,http://localhost:2380”

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.157:2379,http://localhost:2379”

ETCD_NAME=“etcd-157”

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.157:2380”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.157:2379”

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380”

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

ETCD_INITIAL_CLUSTER_STATE=“new”

[root@etcd2 ~]#

启动etcd服务

  • 这个玩意有启动顺序的,我们现在主节点上启动该服务

命令:systemctl start etcd

这时候是卡主的【是正常的,要让另外节点etcd服务都起来以后该节点才会启完】

在这里插入图片描述

  • 然后我们去启动其他节点的etcd服务

命令:systemctl start etcd

[root@etcd2 ~]# systemctl start etcd

[root@etcd2 ~]#

  • 这时候主节点的etcd服务才会启动完毕

[root@etcd1 ~]# systemctl start etcd

[root@etcd1 ~]#

  • 上面所有节点服务都启动完毕以后,再所有节点执行加入开启启动的命令:

systemctl enable etcd

#注意主机名是3台的

[root@etcd1 ~]# systemctl enable etcd

[root@etcd1 ~]#

[root@etcd2 ~]# systemctl enable etcd

Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.

[root@etcd2 ~]#

至此,主备节点就配置完毕了

新节点加入集群


  • 所谓新节点加入集群,就是一台新的主机,需要加入到已存在的集群里面

  • 这个需要在版本2上完成,所以需要将版本切回2,否则会报member命令不存在。

命令:export ETCDCTL_API=2

安装etcd包

  • 安装etcd包:yum -y install etcd

查看现有节点的leader信息

[root@etcd1 ~]# etcdctl member list

220b656d1029422: name=etcd-157 peerURLs=http://192.168.59.157:2380 clientURLs=http://192.168.59.157:2379,http://localhost:2379 isLeader=false

aaaca50ef34fc86: name=etcd-156 peerURLs=http://192.168.59.156:2380 clientURLs=http://192.168.59.156:2379,http://localhost:2379 isLeader=true

[root@etcd1 ~]#

如上,isLeader=yes的就是主节点了,下面操作就在这上面进行。

加入节点【命令获取配置文件信息】

  • 在主节点上执行:etcdctl member add 自定义名称 http://ip:2380 【主节点(leader)上执行】 【该命令必须执行】

  • 如,我准备将etcd3加入:

执行这个命令以后,下面会出现3行ETCD开头的内容,意思是需要将这3行内容写入配置文件:/etc/etcd/etcd.conf中,但这3行内容是不够的还需要其他的,所以我们可以直接导入主节点的配置文件更方便。

[root@etcd1 ~]# etcdctl member add etcd-158 http://192.168.59.158:2380

Added member named etcd-158 with ID 9b5d28a80771cff9 to cluster

ETCD_NAME=“etcd-158”

ETCD_INITIAL_CLUSTER=“etcd-157=http://192.168.59.157:2380,etcd-156=http://192.168.59.156:2380,etcd-158=http://192.168.59.158:2380”

ETCD_INITIAL_CLUSTER_STATE=“existing”

[root@etcd1 ~]#

  • 执行上面条代码更主要的是能查看到该节点信息了,虽然不完整【因为配置文件没配置哦】

[root@etcd1 ~]# etcdctl member list

220b656d1029422: name=etcd-157 peerURLs=http://192.168.59.157:2380 clientURLs=http://192.168.59.157:2379,http://localhost:2379 isLeader=false

aaaca50ef34fc86: name=etcd-156 peerURLs=http://192.168.59.156:2380 clientURLs=http://192.168.59.156:2379,http://localhost:2379 isLeader=true

9b5d28a80771cff9[unstarted]: peerURLs=http://192.168.59.158:2380

[root@etcd1 ~]#

  • 配置文件继续往下看

修改配置文件

  • 上面说过,直接导入主配置文件更方便,先导入吧【任意已存在节点上操作都可以】

[root@etcd1 ~]# scp /etc/etcd/etcd.conf 192.168.59.158:/etc/etcd/

root@192.168.59.158’s password:

etcd.conf 100% 567 984.1KB/s 00:00

[root@etcd1 ~]#

  • 修改IP:在编辑界面输入::1,6s/156/157/g可以直接替换1-6行的ip【仅替换1-6行】【参考上面】

  • 此外,还需要新增和修改下面2样内容。

在这里插入图片描述

  • 修改完毕以后的代码如下 【注:只修改这一个节点即可,主备节点不需要修改】

[root@etcd3 ~]# cat /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

ETCD_LISTEN_PEER_URLS=“http://192.168.59.158:2380,http://localhost:2380”

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.158:2379,http://localhost:2379”

ETCD_NAME=“etcd-158”

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.158:2380”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.158:2379”

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380,etcd-158=http://192.168.59.158:2380”

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

ETCD_INITIAL_CLUSTER_STATE=“existing”

[root@etcd3 ~]#

启动etcd服务

  • 直接启动服务即可,一定要确定状态为:active,如果状态不对,处理方法看下面的。。。处理方法

[root@etcd3 ~]# systemctl start etcd

[root@etcd3 ~]# systemctl is-active etcd

active

[root@etcd3 ~]#

  • 然后加入开机启动

[root@etcd3 ~]# systemctl enable etcd

Created symlink from /etc/systemd/system/multi-user.target.wants/etcd.service to /usr/lib/systemd/system/etcd.service.

[root@etcd3 ~]#

启动etcd服务正常,但etcd状态为inactive处理方法


  • 是这样的,我上面新节点加入是我之前配置过的,所以当我用新加入方式的时候,最后启动该服务就是有问题,也是折腾了一会才想起是因为做过配置,导致服务不能启动的。

  • 内容如下

服务启动不会报错,但状态就是不会为:active

[root@etcd3 ~]# systemctl restart etcd

[root@etcd3 ~]# systemctl status etcd

● etcd.service - Etcd Server

Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)

Active: inactive (dead) since 三 2021-07-14 17:44:36 CST; 1s ago

Process: 2530 ExecStart=/bin/bash -c GOMAXPROCS= ( n p r o c ) / u s r / b i n / e t c d − − n a m e = " (nproc) /usr/bin/etcd --name=" (nproc)/usr/bin/etcdname="{ETCD_NAME}" --data-dir=“ E T C D D A T A D I R " − − l i s t e n − c l i e n t − u r l s = " {ETCD_DATA_DIR}" --listen-client-urls=" ETCDDATADIR"listenclienturls="{ETCD_LISTEN_CLIENT_URLS}” (code=exited, status=0/SUCCESS)

Main PID: 2530 (code=exited, status=0/SUCCESS)

  • 原因:这是因为该节点之前配置过,有存储信息,所以导致该情况发生

  • 处理方法

直接执行:rm -rf /var/lib/etcd/*删除数据,然后重启就正常了

[root@etcd3 ~]# rm -rf /var/lib/etcd/*

[root@etcd3 ~]#

[root@etcd3 ~]# systemctl start etcd

[root@etcd3 ~]# systemctl status etcd

● etcd.service - Etcd Server

Loaded: loaded (/usr/lib/systemd/system/etcd.service; enabled; vendor preset: disabled)

Active: active (running) since 三 2021-07-14 17:46:23 CST; 2s ago

Main PID: 2595 (etcd)

CGroup: /system.slice/etcd.service

└─2595 /usr/bin/etcd --name=etcd-158 --data-dir=/var/lib/etcd/cluster.etcd --listen-client-urls=http://192.168.59.158:2379,http://localhost:2379

3个节点配置一览


  • 通过命令可以看到leader是etcd-156【主机名etcd1】

[root@etcd3 ~]# etcdctl member list

220b656d1029422: name=etcd-157 peerURLs=http://192.168.59.157:2380 clientURLs=http://192.168.59.157:2379,http://localhost:2379 isLeader=false

aaaca50ef34fc86: name=etcd-156 peerURLs=http://192.168.59.156:2380 clientURLs=http://192.168.59.156:2379,http://localhost:2379 isLeader=true

9b5d28a80771cff9: name=etcd-158 peerURLs=http://192.168.59.158:2380 clientURLs=http://192.168.59.158:2379,http://localhost:2379 isLeader=false

[root@etcd3 ~]#

  • etcd1和etcd2是做的主备,etcd3是用命令加入的

用空白行隔开了,注意看主机名

[root@etcd1 ~]# cat /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

ETCD_LISTEN_PEER_URLS=“http://192.168.59.156:2380,http://localhost:2380”

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.156:2379,http://localhost:2379”

ETCD_NAME=“etcd-156”

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.156:2380”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.156:2379”

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380”

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

ETCD_INITIAL_CLUSTER_STATE=“new”

[root@etcd1 ~]#

[root@etcd2 ~]# cat /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

ETCD_LISTEN_PEER_URLS=“http://192.168.59.157:2380,http://localhost:2380”

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.157:2379,http://localhost:2379”

ETCD_NAME=“etcd-157”

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.157:2380”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.157:2379”

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380”

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

ETCD_INITIAL_CLUSTER_STATE=“new”

[root@etcd2 ~]#

[root@etcd3 ~]# cat /etc/etcd/etcd.conf

ETCD_DATA_DIR=“/var/lib/etcd/cluster.etcd”

ETCD_LISTEN_PEER_URLS=“http://192.168.59.158:2380,http://localhost:2380”

ETCD_LISTEN_CLIENT_URLS=“http://192.168.59.158:2379,http://localhost:2379”

ETCD_NAME=“etcd-158”

ETCD_INITIAL_ADVERTISE_PEER_URLS=“http://192.168.59.158:2380”

ETCD_ADVERTISE_CLIENT_URLS=“http://localhost:2379,http://192.168.59.158:2379”

ETCD_INITIAL_CLUSTER=“etcd-156=http://192.168.59.156:2380,etcd-157=http://192.168.59.157:2380,etcd-158=http://192.168.59.158:2380”

ETCD_INITIAL_CLUSTER_TOKEN=“etcd-cluster”

ETCD_INITIAL_CLUSTER_STATE=“existing”

[root@etcd3 ~]#

测试


  • 如,我在节点1和节点2上分别创建一个文件,然后去节点3上查看,可以看到数据是同步的即正常

注意看主机名【用空白行隔开了】

下面是默认版本2

[root@etcd1 ~]# etcdctl mkdir /etcd1

[root@etcd1 ~]#

[root@etcd2 ~]# etcdctl mkdir /etcd2

[root@etcd2 ~]#

[root@etcd3 ~]# etcdctl ls /

/etcd1

/etcd2

[root@etcd3 ~]#

  • 版本3也是一样可以同步的 ,但需要注意同一目录下数据会被覆盖

如下,我在节点1上写入了hero1,然后去2节点上写入hero2,最终看到的是hero2 【注意,3版本在生产环境千万不能这么搞,这么搞数据就丢了】

[root@etcd1 ~]# export ETCDCTL_API=3

[root@etcd1 ~]# etcdctl put /ccx hero1

OK

[root@etcd1 ~]#

[root@etcd2 ~]# etcdctl put /ccx hero2

OK

[root@etcd2 ~]#

版本3和版本2还不一样,3版本是以表链接形式,统一目录下数据会被覆盖,不能共存【2版本可以】

[root@etcd3 ~]# etcdctl get /ccx

/ccx

hero2

[root@etcd3 ~]#

etcd快照【snap】

===========================================================================

  • 快照是:etcdctl 3版本里来做的

先在每台上执行3的环境变量:export ETCDCTL_API=3

  • 现在我们创建2组数据,用来测试后面的快照恢复。

[root@etcd1 ~]# etcdctl put date1 “hello word”

OK

[root@etcd1 ~]# etcdctl put date2 “hello word_new”

OK

[root@etcd1 ~]#

[root@etcd3 ~]# etcdctl get date1

date1

hello word

[root@etcd3 ~]# etcdctl get date2

date2

hello word_new

[root@etcd3 ~]#

获取帮助


  • 命令:etcdctl snap --help

这里面有很多详细说明

  • 但我这关注使用,下翻有一个COMMANDS选项,里说使用

如:save是做快照,restore是恢复快照。

[root@etcd3 ~]# etcdctl snap --help | grep -A 5 COMMANDS:

COMMANDS:

save Stores an etcd node backend snapshot to a given file

restore Restores an etcd member snapshot to an etcd directory

status Gets backend snapshot status of a given file

GLOBAL OPTIONS:

[root@etcd3 ~]#

无证书快照创建与恢复


创建快照【无证书】

  • 命令:etcdctl snap save 自定义名称

注:当前所在什么目录,打包的数据就存放在什么目录

  • 如:我将我现在的数据打包为:snap1.date

[root@etcd3 /]# etcdctl snap save snap1.date

Snapshot saved at snap1.date

[root@etcd3 /]#

[root@etcd3 /]# ls | grep sna

snap1.date

[root@etcd3 /]#

恢复快照【无证书】

  • 恢复前我先删除现有做过快照的数据

[root@etcd3 /]# etcdctl del date1

1

[root@etcd3 /]#

[root@etcd3 /]# etcdctl del date2

1

[root@etcd3 /]#

快照拷贝至其他节点

  • 然后将备份的数据拷贝到其他节点【我etcd3上做的快照,所以就拷贝到1和2上】

也就是说,虽然写数据仅在其中一个节点写会自动同步到其他节点,但恢复数据需要在每一个节点上都操作一遍,不能仅在其中某些节点操作!

[root@etcd3 /]# ls | grep sna

snap1.date

[root@etcd3 /]#

[root@etcd3 /]# scp snap1.date 192.168.59.156:/

The authenticity of host ‘192.168.59.156 (192.168.59.156)’ can’t be established.

ECDSA key fingerprint is SHA256:zRtVBoNePoRXh9aA8eppKwwduS9Rjjr/kT5a7zijzjE.

ECDSA key fingerprint is MD5:b8:53:cc:da:86:2a:97:dc:bd:64:6b:b1:d0:f3:02:ce.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘192.168.59.156’ (ECDSA) to the list of known hosts.

root@192.168.59.156’s password:

Permission denied, please try again.

root@192.168.59.156’s password:

snap1.date 100% 20KB 10.9MB/s 00:00

[root@etcd3 /]# scp snap1.date 192.168.59.157:/

The authenticity of host ‘192.168.59.157 (192.168.59.157)’ can’t be established.

ECDSA key fingerprint is SHA256:zRtVBoNePoRXh9aA8eppKwwduS9Rjjr/kT5a7zijzjE.

ECDSA key fingerprint is MD5:b8:53:cc:da:86:2a:97:dc:bd:64:6b:b1:d0:f3:02:ce.

Are you sure you want to continue connecting (yes/no)? yes

Warning: Permanently added ‘192.168.59.157’ (ECDSA) to the list of known hosts.

root@192.168.59.157’s password:

snap1.date 100% 20KB 11.4MB/s 00:00

[root@etcd3 /]#

[root@etcd3 /]#

etcd数据清除【所有节点同步操作】

  • 先停止所有节点的etcd服务

[root@etcd3 /]# systemctl stop etcd

[root@etcd2 /]# systemctl stop etcd

[root@etcd1 /]# systemctl stop etcd

  • 删除现有全部数据

[root@etcd1 ~]# rm -rf /var/lib/etcd/*

[root@etcd2 ~]# rm -rf /var/lib/etcd/*

[root@etcd3 ~]# rm -rf /var/lib/etcd/*

开始数据恢复【所有节点同步操作】

  • 给快照文件添加etcd的组和用户,免得没有权限访问报错

【注:默认是有etcd这个用户的,在快照文件目录下执行chown etcd.etcd 快照文件 即可

[root@etcd3 /]# cat /etc/passwd| grep etcd

etcd❌997:995:etcd user:/var/lib/etcd:/sbin/nologin

[root@etcd3 /]#

[root@etcd3 /]# ls | grep snap

snap1.date

[root@etcd3 /]#

[root@etcd3 /]# chown etcd.etcd snap1.date

[root@etcd3 /]#

[root@etcd3 /]#

[root@etcd2 /]# chown etcd.etcd snap1.date

[root@etcd1 /]# chown etcd.etcd snap1.date

  • 数据恢复模版

【在快照文件目录下操作】

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
t@etcd3 /]#

[root@etcd3 /]# chown etcd.etcd snap1.date

[root@etcd3 /]#

[root@etcd3 /]#

[root@etcd2 /]# chown etcd.etcd snap1.date

[root@etcd1 /]# chown etcd.etcd snap1.date

  • 数据恢复模版

【在快照文件目录下操作】

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。[外链图片转存中…(img-YivrLIsY-1713338035270)]

[外链图片转存中…(img-CTwgDvVq-1713338035270)]

[外链图片转存中…(img-s7jRmMEz-1713338035271)]

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

如果你觉得这些内容对你有帮助,可以扫码获取!!(备注Java获取)

img

最后

为什么我不完全主张自学?
平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。
②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。
如果说你认为你的目标十分明确,能做到第②点所说的几个点,以目前的市场来看,你才真正的适合去自学。

除此之外,对于绝大部分人来说,报班一定是最好的一种快速成长的方式。但是有个问题,现在市场上的培训机构质量参差不齐,如果你没有找准一个好的培训班,完全是浪费精力,时间以及金钱,这个需要自己去甄别选择。

我个人建议线上比线下的性价比更高,线下培训价格基本上没2W是下不来的,线上教育现在比较成熟了,此次疫情期间,学生基本上都感受过线上的学习模式。相比线下而言,线上的优势以我的了解主要是以下几个方面:
①价格:线上的价格基本上是线下的一半;
②老师:相对而言线上教育的师资力量比线下更强大也更加丰富,资源更好协调;
③时间:学习时间相对而言更自由,不用裸辞学习,适合边学边工作,降低生活压力;
④课程:从课程内容来说,确实要比线下讲的更加深入。

应该学哪些技术才能达到企业的要求?(下图总结)

[外链图片转存中…(img-lydRk2CW-1713338035271)]

[外链图片转存中…(img-51dwkayE-1713338035271)]

《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!

  • 9
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当k8s etcd集群中的三个节点数据不一致时,可能会导致集群的稳定性和可靠性问题。这种情况下,我们需要对数据不一致的原因进行排查,并进行相应的处理。 首先,要确保三个节点之间的网络连接是稳定的,确保数据能够正常传输。如果网络连接存在问题,可以尝试重启节点或者检查网络配置,以确保节点之间的通信正常。 其次,需要检查etcd集群中的角色和权限设置。etcd集群中有一个Leader节点,负责处理写入请求和同步数据到其他节点。如果Leader节点的角色或权限设置有问题,可能导致数据不一致。可以通过检查Leader节点的日志和配置文件,以及调整权限设置来解决这个问题。 另外,数据不一致还可能是由于节点之间的时钟差异导致的。etcd在处理数据同步时会依赖于节点之间的时钟同步,如果节点之间的时钟存在较大的差异,可能导致数据不一致。可以通过调整节点的时钟同步机制,确保节点之间的时间同步。 最后,如果以上方法都无效,可以尝试进行数据恢复操作。可以选择其中一个数据正确的节点,将其数据备份,然后将备份数据恢复到其他两个节点上。同时,也要确保停止写入请求,以防止数据的写入进一步影响集群的一致性。 总之,当k8s etcd集群中的三个节点数据不一致时,我们需要仔细排查问题的根源,并根据具体情况采取相应的解决措施,以恢复集群的稳定性和一致性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值