从零开始的云计算生活第五十六天,临深履薄,kubernetes模块之etcd备份恢复和集群升级指南
从零开始的云计算生活——第五十六天,临深履薄,kubernetes模块之etcd备份恢复和集群升级指南
一.故事背景
本次将结束k8s的所有内容的学习
二. etcd备份恢复
1. 集群管理命令
etcdctl是一个命令行的客户端,它提供了一些命令,可以方便我们在对服务进行测试或者手动修改数据库内容。etcdctl命令基本用法如下所示:
etcdctl [global options] command [command options] [args…]
具体的命令选项参数可以通过 etcdctl command –help来获取相关帮助
环境变量
获得etcd数据库的访问url
kubectl -n kube-system get pods etcd-k8s-master -o yaml | grep -A10 “containers:”

如果遇到使用了TLS加密的集群,通常每条指令都需要指定证书路径和etcd节点地址,可以把相关命令行参数添加在环境变量中,在**~/.bashrc**添加以下内容:
HOST_1=https://192.168.71.128:2379
ENDPOINTS=${HOST_1}
# 如果需要使用原生命令,在命令开头加一个\ 例如:\etcdctl command
alias etcdctl="etcdctl --cert /etc/kubernetes/pki/etcd/peer.crt --key
/etc/kubernetes/pki/etcd/peer.key --endpoints=https://192.168.158.6:2379
--insecure-skip-tls-verify"
source ~/.bashrc
查看etcd版本
etcdctl version

查看etcd集群节点信息
etcdctl member list -w table

查看集群健康状态
etcdctl endpoint status -w table

####表格内容解析
ENDPOINT:节点的地址,这里是 https://192.168.158.6:2379。这表示该节点的网络地址和端口。
ID:节点的唯一标识符,这里是 6dc5c9ae772d8898。
VERSION:节点的版本号,这里是 3.5.9。
DB SIZE:数据库大小,这里是 9.1 MB。
IS LEADER:是否为集群的领导者节点。true 表示该节点是领导者。
IS LEARNER:是否为学习者节点。false 表示该节点不是学习者节点。
RAFT TERM:Raft协议中的任期编号,这里是 4。Raft协议用于分布式系统的共识机制,任期编号用于区分不同的选举周期。
RAFT INDEX:Raft协议中的日志索引,这里是 30622。它表示当前日志的最新位置。
RAFT APPLIED INDEX:Raft协议中已应用的日志索引,这里是 30622。它表示已提交并应用到状态机的日志位置。
ERRORS:错误信息,这里为空,表示没有错误
查看告警事件
如果内部出现问题,会触发告警,可以通过命令查看告警引起原因,命令如下所示:
etcdctl alarm
[flags]
常用的子命令主要有两个:
查看所有告警
etcdctl alarm list
解除所有告警
etcdctl alarm disarm
以下是 etcdctl 命令和选项的中文翻译:
命令:
alarm disarm停止所有告警alarm list列出所有告警auth disable禁用身份验证auth enable启用身份验证auth status返回身份验证状态check datascale检查给定服务器端点上不同工作负载的数据存储内存使用情况check perf检查 etcd 集群的性能compaction压缩 etcd 中的事件历史记录defrag对具有给定端点的 etcd 成员进行存储碎片整理del删除指定的键或键范围 [key, range_end)elect观察并参与领导者选举endpoint hashkv打印--endpoints中每个端点的 KV 历史记录哈希endpoint health检查--endpoints标志中指定的端点的健康状态endpoint status打印--endpoints标志中指定的端点的状态get获取键或键范围help任何命令的帮助lease grant创建租约lease keep-alive保持租约活跃(续租)lease list列出所有活跃的租约lease revoke撤销租约lease timetolive获取租约信息lock获取命名锁make-mirror在目标 etcd 集群创建镜像member add向集群中添加成员member list列出集群中的所有成员member promote将集群中的非投票成员提升为投票成员member remove从集群中移除成员member update更新集群中的成员move-leader将领导权转移到另一个 etcd 集群成员put将给定的键放入存储中role add添加新角色role delete删除角色role get获取角色的详细信息role grant-permission给角色授予键role list列出所有角色role revoke-permission从角色中撤销键snapshot restore将 etcd 成员快照恢复到 etcd 目录snapshot save将 etcd 节点后端快照存储到给定文件snapshot status[已弃用] 获取给定文件的后端快照状态txn事务处理所有请求user add添加新用户user delete删除用户user get获取用户的详细信息user grant-role给用户授予角色user list列出所有用户user passwd更改用户密码user revoke-role从用户中撤销角色version打印 etcdctl 的版本watch监视键或前缀上的事件流选项:
--cacert=""使用此 CA 包验证启用了 TLS 的安全服务器的证书--cert=""使用此 TLS 证书文件标识安全客户端--command-timeout=5s短命令的超时时间(不包括拨号超时)--debug[=false]启用客户端调试日志记录--dial-timeout=2s客户端连接的拨号超时时间-d, --discovery-srv=""查询描述集群端点的 SRV 记录的域名--discovery-srv-name=""使用 DNS 发现时查询的服务名称--endpoints=[127.0.0.1:2379]gRPC 端点-h, --help[=false]etcdctl 的帮助--hex[=false]将字节字符串打印为十六进制编码的字符串--insecure-discovery[=true]接受描述集群端点的不安全 SRV 记录--insecure-skip-tls-verify[=false]跳过服务器证书验证(注意:此选项仅应在测试目的下启用)--insecure-transport[=true]禁用客户端连接的传输安全--keepalive-time=2s客户端连接的保活时间--keepalive-timeout=6s客户端连接的保活超时时间--key=""使用此 TLS 密钥文件标识安全客户端--password=""身份验证的密码(如果使用此选项,–user 选项不应包含密码)--user=""身份验证的用户名[:密码](如果未提供密码,将提示输入)-w, --write-out="simple"设置输出格式(字段,JSON,protobuf,简单,表格)
数据库操作命令
增加(put)
添加一个键值,基本用法如下所示:
etcdctl put [options]
[flags]
常用参数如下所示:
| 参数 | 功能描述 |
|---|---|
| –prev-kv | 输出修改前的键值 |
注意事项:
- 其中value接受从stdin的输入内容
- 如果value是以横线-开始,将会被视为flag,如果不希望出现这种情况,可以使用两个横线代替–
- 若键已经存在,则进行更新并覆盖原有值,若不存在,则进行添加

查询(get)
查询键值,基本用法如下所示:
etcdctl get [options]
[range_end] [flags]
常用参数如下所示:
| 参数 | 功能描述 |
|---|---|
| –hex | 以十六进制形式输出 |
| –limit number | 设置输出结果的最大值 |
| –prefix | 根据prefix进行匹配key |
| –order | 对输出结果进行排序,ASCEND 或 DESCEND |
| –sort-by | 按给定字段排序,CREATE, KEY, MODIFY, VALUE, VERSION |
| –print-value-only | 仅输出value值 |
| –from-key | 按byte进行比较,获取大于等于指定key的结果 |
| –keys-only | 仅获取keys |
示例
获取键值

只获取值

批量取从foo1到foo3的值,不包括foo3

批量获取前缀为foo的值

批量获取符合前缀的前两个值

批量获取前缀为foo的值,并排序

删除(del)
删除键值,基本用法如下所示:
etcdctl del [options]
[range_end] [flags]
常用参数如下所示:
| 参数 | 功能描述 |
|---|---|
| –prefix | 根据prefix进行匹配删除 |
| –prev-kv | 输出删除的键值 |
| –from-key | 按byte进行比较,删除大于等于指定key的结果 |
示例
删除name的键值

删除从foo1到foo3且不包含foo3的键值

删除前缀为foo的所有键值

更新(put覆盖)
若键已经存在,则进行更新并覆盖原有值,若不存在,则进行添加。
查询键历史记录查询
etcd在每次键值变更时,都会记录变更信息,便于我们查看键变更记录
监听命令
watch是监听键或前缀发生改变的事件流, 主要用法如下所示:
etcdctl watch [options] [key or prefix] [range_end] [–] [exec-command arg1 arg2 …] [flags]
示例如下所示:
对某个key监听操作,当key1发生改变时,会返回最新值
etcdctl watch name
监听key前缀
etcdctl watch name –prefix
监听到改变后执行相关操作
etcdctl watch name – etcdctl get age
# 启动监听命令
[root@tiaoban etcd]# etcdctl watch foo
#另一个控制台执行新增命令
[root@tiaoban ~]# etcdctl put foo bar
OK
# 观察控制台监听输出
[root@tiaoban etcd]# etcdctl watch foo
PUT
foo
bar
#另一个控制台执行更新命令
[root@tiaoban ~]# etcdctl put foo bar123
OK
# 观察控制台监听输出
[root@tiaoban etcd]# etcdctl watch foo
PUT
foo
bar
PUT
foo
bar123
#另一个控制台执行删除命令
[root@tiaoban ~]# etcdctl del foo
1
# 观察控制台监听输出
[root@tiaoban etcd]# etcdctl watch foo
PUT
foo
bar
PUT
foo
bar123
DELETE
foo同时监听多个键
# 监听前缀为foo的键
[root@tiaoban etcd]# etcdctl watch --prefix foo
# 另一个控制台执行操作
[root@tiaoban ~]# etcdctl put foo1 bar1
OK
[root@tiaoban ~]# etcdctl put foo2 bar2
OK
[root@tiaoban ~]# etcdctl del foo1
1
# 观察控制台输出
[root@tiaoban etcd]# etcdctl watch --prefix foo
PUT
foo1
bar1
PUT
foo2
bar2
DELETE
foo1
# 监听指定的多个键
[root@tiaoban etcd]# etcdctl watch -i
watch name
watch location
# 另一个控制台执行操作
[root@tiaoban ~]# etcdctl put name cuiliang
OK
[root@tiaoban ~]# etcdctl del name
1
[root@tiaoban ~]# etcdctl put location beijing
OK
# 观察控制台输出
[root@tiaoban etcd]# etcdctl watch -i
watch name
watch location
PUT
name
cuiliang
DELETE
name
PUT
location
beijing租约命令
租约具有生命周期,需要为租约授予一个TTL(time to live),将租约绑定到一个key上,则key的生命周期与租约一致,可续租,可撤销租约,类似于redis为键设置过期时间。其主要用法如下所示:
etcdctl lease
[flags]
添加租约
主要用法如下所示:
etcdctl lease grant
[flags]
设置60秒后过期时间
[root@tiaoban etcd]# etcdctl lease grant 60
lease 6e1e86f4c6512a2b granted with TTL(60s)把foo和租约绑定,设置成60秒后过期
[root@tiaoban etcd]# etcdctl put –lease=6e1e86f4c6512a29 foo bar
OK租约期内查询键值
[root@tiaoban etcd]# etcdctl get foo
foo
bar租约期外查询键值
[root@tiaoban etcd]# etcdctl get foo
返回为空
查看租约
查看租约信息,以便续租或查看租约是否仍然存在或已过期。 查看租约详情主要用法如下所示:
etcdctl lease timetolive
[options] [flags]
# 添加一个50秒的租约
[root@tiaoban etcd]# etcdctl lease grant 50
lease 6e1e86f4c6512a32 granted with TTL(50s)
# 将name键绑定到6e1e86f4c6512a32租约上
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a32 name cuiliang
OK
# 查看所有租约列表
[root@tiaoban etcd]# etcdctl lease list
found 1 leases
6e1e86f4c6512a32
# 查看租约详情,remaining(6s) 剩余有效时间6秒;--keys 获取租约绑定的 key
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a32
lease 6e1e86f4c6512a32 granted with TTL(50s), remaining(6s), attached keys([name])租约续约
通过刷新 TTL 值来保持租约的有效,使其不会过期。 主要用法如下所示:
etcdctl lease keep-alive [options]
[flags]
# 设置60秒后过期租约
[root@tiaoban etcd]# etcdctl lease grant 60
lease 6e1e86f4c6512a36 granted with TTL(60s)
# 把name和租约绑定,设置成 60 秒后过期
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a36 name cuiliang
OK
# 自动定时执行续约,续约成功后每次租约为60秒
[root@tiaoban etcd]# etcdctl lease keep-alive 6e1e86f4c6512a36
lease 6e1e86f4c6512a36 keepalived with TTL(60)
lease 6e1e86f4c6512a36 keepalived with TTL(60)
lease 6e1e86f4c6512a36 keepalived with TTL(60)
……删除租约
通过租约 ID 撤销租约,撤销租约将删除其所有绑定的 key。 主要用法如下所示:
etcdctl lease revoke
[flags]
# 设置600秒后过期租约
[root@tiaoban etcd]# etcdctl lease grant 600
lease 6e1e86f4c6512a39 granted with TTL(600s)
# 把foo和租约绑定,600秒后过期
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a39 foo bar
OK
# 查看租约详情
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 granted with TTL(600s), remaining(556s), attached keys([foo])
# 删除租约
[root@tiaoban etcd]# etcdctl lease revoke 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 revoked
# 查看租约详情
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a39
lease 6e1e86f4c6512a39 already expired
# 获取键值
[root@tiaoban etcd]# etcdctl get foo
返回为空多key同一租约
一个租约支持绑定多个 key
# 设置60秒后过期的租约
[root@tiaoban etcd]# etcdctl lease grant 60
lease 6e1e86f4c6512a3e granted with TTL(60s)
# foo1与租约绑定
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a3e foo1 bar1
OK
# foo2与租约绑定
[root@tiaoban etcd]# etcdctl put --lease=6e1e86f4c6512a3e foo2 bar2
OK
# 查看租约详情
[root@tiaoban etcd]# etcdctl lease timetolive --keys 6e1e86f4c6512a3e
lease 6e1e86f4c6512a3e granted with TTL(60s), remaining(14s),
attached keys([foo1 foo2])租约过期后,所有 key 值都会被删除,因此:
- 当租约只绑定了一个 key 时,想删除这个 key,最好的办法是撤销它的租约,而不是直接删除这个 key。
- 当租约没有绑定key时,应主动把它撤销掉,单纯删除 key 后,续约操作持续进行,会造成内存泄露。
直接删除key演示:
# 设置租约并绑定 zoo1
[root@tiaoban etcd]# etcdctl lease grant 60
lease 6e1e86f4c6512a43 granted with TTL(60s)
[root@tiaoban etcd]# etcdctl --lease=6e1e86f4c6512a43 put zoo1 val1
OK
# 续约
[root@tiaoban etcd]# etcdctl lease keep-alive 6e1e86f4c6512a43
lease 6e1e86f4c6512a43 keepalived with TTL(60)
# 此时在另一个控制台执行删除key操作:
[root@tiaoban ~]# etcdctl del zoo1
1
# 单纯删除 key 后,续约操作持续进行,会造成内存泄露
[root@tiaoban etcd]# etcdctl lease keep-alive 6e1e86f4c6512a43
lease 6e1e86f4c6512a43 keepalived with TTL(60)
lease 6e1e86f4c6512a43 keepalived with TTL(60)
lease 6e1e86f4c6512a43 keepalived with TTL(60)
...撤销key的租约演示:
# 设置租约并绑定 zoo1
[root@tiaoban etcd]# etcdctl lease grant 50
lease 32698142c52a1717 granted with TTL(50s)
[root@tiaoban etcd]# etcdctl --lease=32698142c52a1717 put zoo1 val1
OK
# 续约
[root@tiaoban etcd]# etcdctl lease keep-alive 32698142c52a1717
lease 32698142c52a1717 keepalived with TTL(50)
lease 32698142c52a1717 keepalived with TTL(50)
# 另一个控制台执行:etcdctl lease revoke 32698142c52a1717
# 续约撤销并退出
lease 32698142c52a1717 expired or revoked.
[root@tiaoban etcd]# etcdctl get zoo1
# 返回空备份恢复命令
主要用于管理节点的快照,其主要用法如下所示:
etcdctl snapshot <subcommand> [flags]生成快照
其主要用法如下所示:
etcdctl snapshot save <filename> [flags]示例如下所示:
etcdctl snapshot save etcd-snapshot.db查看快照
其主要用法如下所示:
etcdctl snapshot status <filename> [flags]示例如下所示:
etcdctl snapshot status etcd-snapshot.db -w table恢复快照
其主要用法如下所示:
etcdctl snapshot restore <filename> [options] [flags]三. Kubernetes集群升级
1.集群升级过程辅助命令
(1)查看节点上运行的pod。

(2)查看集群配置文件。

(3)查看当前集群节点。

2. 升级master节点
2.1、升级kubeadm
更新包管理器
yum update
查看可用版本
apt-cache madison kubeadm
yum list | grep kubeadm更新
yum update -y kubeadm
验证版本
kubeadm version
修改仓库源版本(节点与master都改)



2.2、验证升级计划
(1)检查可升级到哪些版本,并验证你当前的集群是否可升级。

2.3、master节点升级
(1)升级到 1.29.15版本,此命令仅升级master节点(control plane)。
kubeadm upgrade apply v1.29.15


(2) 腾空节点,即将节点上除守护进程之外的其他进程调度到其他节点,同时将开启调度保护。
kubectl drain k8s-master –ignore-daemonsets

(3)升级kubelet与kubectl组件。
yum update -y kubelet

(4)重启 kubelet。
systemctl daemon-reload
systemctl restart kubelet
(5)解除调度保护。
kubectl uncordon k8s-master

3. 升级node节点
(1)升级节点kubelet 配置。
kubeadm upgrade node

(2)腾空节点,同时开启调度保护,此命令请在master节点操作
kubectl drain k8s-node1 –ignore-daemonsets
若有临时存贮pod使用该命令删除
kubectl drain k8s-node1 \
--ignore-daemonsets \
--force \
--delete-emptydir-data
(3)升级kubelet与kubectl组件。
yum update -y kubelet

(4)重启 kubelet。
systemctl daemon-reload
systemctl restart kubelet

(5)解除调度保护,master节点上执行该命令。
kubectl uncordon k8s-node1
kubectl uncordon k8s-node2

4. 总结
每个版本的升级都不一样,所以要根据版本进行适当调整,不作为万能指导。 升级过程:
- 升级master组件。
- 升级worker节点组件,调度保护、排空节点、worker节点组件升级、解除保护。
Kubernetes集群的升级可以分为以下几个步骤:
备份数据。在升级之前,需要备份Kubernetes集群的数据,包括访问控制、配置文件、数据卷等。
选择升级方式。Kubernetes集群的升级方式可以分为两种:滚动升级和强制替换。滚动升级是指逐个升级每个节点,直到所有节点都升级完成。强制替换是指一次性替换所有节点,将旧节点直接替换为新节点。
准备新版本。Kubernetes升级需要准备新版本的二进制文件和镜像文件。可以从Kubernetes官方网站下载最新版本的二进制文件和镜像文件,并上传到集群中的节点上。
升级Master节点。首先需要升级Master节点,使用新版本的二进制文件替换旧版本的二进制文件,并启动新版本的Kubernetes API Server、ControllerKubernetes是一个快速发展的开源项目,为了保持其功能和安全性,集群的升级是必须的。
- 查看升级文档:首先需要查看官方的升级文档,了解升级过程中需要注意的事项。
- 备份数据:在升级前需要备份当前的数据,以防升级过程中的意外情况导致数据丢失。
- 准备好备份:在升级前需要确保备份的可用性,以便在需要时能够 Manager和Scheduler。
升级Node节点。接下来需要升级Node节点。首先需要将节点上的Kubelet和kube-proxy服务停止,使用新版本的二进制文件替换旧版本的二进制文件,然后启动新版本的Kubelet和kube-proxy服务。
验证升级结果。升级完成后,需要验证恢复数据。
- 升级前的测试:可以在测试环境中进行升级测试,以确保升级过程和升级后的集群正常运行。
- 升级Node:首先需要升级每个Node节点中的Kubernetes组件,包括kubelet和kube-proxy等。
- 升级Control Plane:然后需要升级Control Plane中的Kubernetes组件,包括kube-apiserver、kube-controller-manager和kube-scheduler等。
- 升级Kubernetes对象:升级完Control Plane后,需要升级Kubernetes对象,如Deployment集群是否正常运行。可以使用kubectl命令查看集群的状态和资源对象的状态,确保所有的服务都能够正常访问。
回滚升级。如果升级失败或出现问题,可以回滚到之前的版本。回滚的过程与升级的过程相同,只需要使用旧版本的二进制文件和镜像文件即可。
Kubernetes集群的升级需要仔细规划和准备,并按照一定的步骤进行操作。只有在备份数据、选择适当的升级方式、准备新版本、升级Master节点、升级Node节点、验证升级结果等步骤都完成后,才能确保集群的升级成功。、StatefulSet等。
升级后的检查:
- 验证集群状态:升级后需要验证集群的状态,包括Node节点的状态、Pod的状态、Service的状态等。
- 验证应用程序:升级后需要验证应用程序的运行状态,确保应用程序正常运行。
- 观察日志:如果发现问题,可以通过查看日志来排查问题原因。
Kubernetes集群升级是一个需要谨慎处理的过程,需要充分准备和测试,以确保升级过程的顺利和集群的稳定。在升级过程中,需要注意备份数据和备份的可用性,升级顺序和升级后的检查等问题,以确保集群的正常运行和应用程序的稳定性。
四.总结
本文总结了Kubernetes集群管理的核心内容,重点介绍了etcd数据库的备份恢复操作和集群升级流程。在etcd部分,详细讲解了etcdctl命令行工具的使用方法,包括集群管理、数据操作、租约管理、快照备份等核心功能。在集群升级部分,系统阐述了master节点和worker节点的升级步骤,包括组件更新、节点排空、版本验证等关键操作。文章强调升级过程需要谨慎执行,建议提前备份数据并在测试环境验证升级方案,确保生产环境升级的平稳性和可靠性。这些内容为Kubernetes集群的日常运维提供了实用的技术指导。