小白成长之路-k8s原理(二)

文章目录

  • 一、Service原理
    • 1.1概述
    • 1.2为什么需要service
    • 1.3service
    • 1.4service类型
    • 1.5service组件协同
  • 二、configMap原理
    • 2.1概述
    • 2.2命令
    • 2.3类型
  • 三、volume
    • 2.1emptydir
    • 2.2hostPath
    • 2.3pv/pvc
    • 2.4storageClass
  • 四、调度管理
    • 3.1概念
    • 3.2特点
    • 3.3亲和性
    • 3.4容忍和污点
    • 3.5固定节点调度
  • 五、etcd
    • 5.1概述
    • 5.2相关操作
        • 查看告警事件
    • 5.3etcd数据库相关操作
        • 增加(put)
        • 查询(get)
        • 删除(del)
        • 更新(put覆盖)
        • 查询键历史记录查询
      • 监听命令
        • 监听单个键
        • 同时监听多个键
      • 租约命令
        • 添加租约
        • 查看租约
        • 租约续约
        • 删除租约
        • 多key同一租约
      • 备份恢复命令
        • 生成快照
        • 查看快照
        • 恢复快照
        • 备份恢复演示


一、Service原理

1.1概述

暴漏服务的重要方式
KubernetesService定义了这样一种抽象:一个Pod的逻辑分组,一种可以访问它们的策略-- 通常称为微服务。这一组Pod能够被Service访问到,通常是通过’Label Selector
在这里插入图片描述

1.2为什么需要service

在这里插入图片描述
如果不用service可以实现如图的效果,部署nginx和tomcat,但是如果tomcat的pod坏了一台,deployment会创建新的Pod,但是pod的ip变化了,之前可以实现负载均衡,但是现在ip变了,负载均衡无法代理到新的pod ip上

如果我们中间加了service
在这里插入图片描述
service:标签选择器和集群
不管Pod如何更新,都会被加入到负载均衡集群

1.3service

在这里插入图片描述
service-userspace:
在这里插入图片描述
service-iptables:
在这里插入图片描述
service-ipvs:
在这里插入图片描述

1.4service类型

在这里插入图片描述

ClusterIP:
在这里插入图片描述
如图所示,deployment所控制的是两台机器,nginx代理的是23和46两台,现在46机器损坏,控制器会创建新的pod,但是新的pod,ip地址会发生改变,nginx无法代理,也就无法实现负载均衡
在这里插入图片描述
ClusterIP:提供一个集群内部的虚拟ip以供Pod访问,他只会收集满足条件的pod

NodePort:
在这里插入图片描述
由于用户无法访问虚拟ip,所以我们引入了NodePort,他会提供一个真实的ip,供外部访问

LoadBalancer:
在这里插入图片描述
通过外部的负载均衡器来访问

1.5service组件协同

在这里插入图片描述
clusterIP:
在这里插入图片描述
案例:
在这里插入图片描述

在这里插入图片描述
会自动生成一个资源清单:
在这里插入图片描述

二、configMap原理

配置信息的保存方式

2.1概述

在这里插入图片描述
ConfigMap 功能在 Kubernetes1.2 版本中引入,许多应用程序会从配置文件、命令行参数或环境变量中读取配置信息。ConfigMap API给我们提供了向容器中注入配置信息的机制ConfigMap 可以被用来保存单个属性,也可以用来保存整个配置文件或者 JSON 二进制等对象

2.2命令

在这里插入图片描述
–from-file
要求
文件内部必须是一行一对的k=v,可以在使用的时候注入至内部变成环境变量
1.txt
name-zhangsan
passwd=123
文件内部不符合要求,创建的时候依然可以变为k,val的形式,但是不会成为内部的环境变量
2.txt
今天去爬山
案例1:
注入环境变量
在这里插入图片描述
案例2:
把环境变量作为启动参数
在这里插入图片描述
在这里插入图片描述

2.3类型

在这里插入图片描述
Clusterip:
在这里插入图片描述

如图所示是一个简单的nginx负载均衡,他现在代理的是23和46这两台机器,如果第二台机器出现问题了,那么deployment会重建一个新的,但是这个新的机器ip地址可能会发生变化,导致nginx无法实现负载均衡
在这里插入图片描述
Clusterip:他会收集满足条件的pod,他会动态的更新后端Pod的状态
NodePort:
在这里插入图片描述
创建的真实ip就可以指向我们当前的Pod上
整个集群的高可用:
在这里插入图片描述

三、volume

容器磁盘上的文件的生命周期是短暂的,这就使得在容器中运行重要应用时会出现一些问题。首先,当容器崩溃时,kubelet 会重启它,但是容器中的文件将丢失–容器以干净的状态(镜像最初的状态)重新启动。其次,在Pod'中同时运行多个容器时,这些容器之间通常需要共享文件。Kubernetes 中的Volume抽象就很好的解决了这些问题

2.1emptydir

当 Pod 被分配给节点时,首先创建emptyDir'卷,并且只要该 Pod 在该节点上运行,该卷就会存在。正如卷的名字所述,它最初是空的。Pod 中的容器可以读取和写入emptyDir’卷中的相同文件,尽管该卷可以挂载到每个容器中的相同或不同路径上。当出于任何原因从节点中删除Pod 时,emptyDir中的数据将被永久删除
容器崩渍不会从节点中移除 pod,因此emptyDir 卷中的数据在容器崩溃时是安全的
emptyDir 的用法有:
》暂存空间,例如用于基于磁盘的合并排序、用作长时间计算崩溃恢复时的检查点>Web 服务器容器提供数据时,保存内容管理器容器提取的文件
案例1:
在这里插入图片描述
验证:访问nginx页面并
打印busybox容器日志:
在这里插入图片描述
或者可以在节点上查看日志
在这里插入图片描述

在这里插入图片描述
我们在日志中加入元素并查看busybox日志:确实访问一致
在这里插入图片描述
在这里插入图片描述
案例2:共享内存
在这里插入图片描述

2.2hostPath

hostPath 卷将主机节点的文件系统中的文件或目录挂载到集群中
hostPath 用途如下
》运行需要访问 Docker 内部的容器;使用/var/lib/docker'的hostPath》在容器中运行 cAdvisor;使用/dev/cgroupshostPath允许 pod 指定给定的 hostPath 是否应该在 pod 运行之前存在,是否应该创建,以及它应该以什么形式存在 除了所需的'path属性之外,用户还可以为hostPath卷指定`type

类型:
在这里插入图片描述
注意:
在这里插入图片描述
案例:
在这里插入图片描述

path:/data是pod最后分配节点的跟data
必须保证节点有这个目录才会创建成功
在这里插入图片描述

2.3pv/pvc

在这里插入图片描述
回收策略:
在这里插入图片描述
状态:
在这里插入图片描述
保护:
在这里插入图片描述
案例:
所有的几点都要安装yum install -y nfs-common nfs-utils rpcbindmkdir /nfsdata
master:创建共享目录并赋予权限
在这里插入图片描述
为了方便测试,可以多创建几个测试文件
在这里插入图片描述
在这里插入图片描述
查看当前的共享结果:
在这里插入图片描述
验证:
node1节点上:
在这里插入图片描述
部署PV:
在这里插入图片描述
在这里插入图片描述
创建PVC:
在这里插入图片描述
在这里插入图片描述
改一下数量:
在这里插入图片描述
验证的stateful的特性:有序创建,有序回收

特性:
在这里插入图片描述

2.4storageClass

一种动态的申请存储机制
在这里插入图片描述
nfs-client-provisioner:
在这里插入图片描述
案例:
cat sa.yaml

apiVersion: v1
kind: Namespace
metadata:name: newnfs
---
apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisionernamespace: newnfs
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["persistentvolumes"]verbs: ["get", "list", "watch", "create", "delete"]- apiGroups: [""]resources: ["persistentvolumeclaims"]verbs: ["get", "list", "watch", "update"]- apiGroups: ["storage.k8s.io"]resources: ["storageclasses"]verbs: ["get", "list", "watch"]- apiGroups: [""]resources: ["events"]verbs: ["create", "update", "patch"]
---
kind: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: newnfs
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: newnfs
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisionernamespace: newnfs
subjects:- kind: ServiceAccountname: nfs-client-provisionernamespace: newnfs
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io

cat nfs.yaml

kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-client-provisionernamespace: newnfs
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreate        #设置升级策略为删除再创建(默认为滚动更新)template:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisioner  #上一步创建的ServiceAccount名称containers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0imagePullPolicy: IfNotPresentvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAME  # Provisioner的名称,以后设置的storageclass要和这个保持一致value: storage-nfs- name: NFS_SERVER        # NFS服务器地址,需和valumes参数中配置的保持一致value: 192.168.166.3- name: NFS_PATH          # NFS服务器数据存储目录,需和volumes参数中配置的保持一致value: /data- name: ENABLE_LEADER_ELECTIONvalue: "true"volumes:- name: nfs-client-rootnfs:server: 192.168.166.3       # NFS服务器地址path: /data        # NFS共享目录

执行文件:
在这里插入图片描述
在这里插入图片描述

创建存储类:
在node节点上查看nfs的版本
在这里插入图片描述

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: nfs-storageannotations:storageclass.kubernetes.io/is-default-class: "false"  ## 是否设置为默认的storageclass
provisioner: storage-nfs                                   ## 动态卷分配者名称,必须和上面创建的deploy中环境变量“PROVISIONER_NAME”变量值一致
parameters:archiveOnDelete: "true"                                 ## 设置为"false"时删除PVC不会保留数据,"true"则保留数据
mountOptions: - hard                                                  ## 指定为硬挂载方式- nfsvers=4  

在这里插入图片描述
注意:
需要 “隔离” 的资源(如 Pod、PVC) → 加命名空间,避免不同团队 / 业务互相影响;
需要 “全局复用” 的资源(如 StorageClass、PV) → 不加命名空间,让整个集群的资源能共用同一套配置。
创建pvc,通过storageclass动态生成pv:

kind: PersistentVolumeClaim
apiVersion: v1
metadata:name: storage-pvcnamespace: newnfs
spec:storageClassName: nfs-storage    ## 需要与上面创建的storageclass的名称一致accessModes:- ReadWriteOnceresources:requests:storage: 1Mi

在这里插入图片描述
编写pod绑定pvc:

apiVersion: v1
kind: Pod
metadata:name: pod-pvc1namespace: newnfs
spec:containers:- name: nginximage: nginximagePullPolicy: IfNotPresentvolumeMounts:- name: nginx-htmlmountPath: /usr/share/nginx/htmlvolumes:- name: nginx-htmlpersistentVolumeClaim:claimName: storage-pvc

验证:
在这里插入图片描述
在这里插入图片描述

四、调度管理

3.1概念

在这里插入图片描述
在这里插入图片描述
案例:自定义调度器
基于shell自定义:
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

3.2特点

3.3亲和性

生产上为了保证应用的高可用性,需要将同一应用的不同pod分散在不同的宿主机上,以防宿主机出现宕机等情况导致pod重建,影响到业务的连续性。要想实现这样的效果,需要用到k8s自带的pod亲和性和反亲和性特性。

Pod 的亲和性与反亲和性有两种类型:

requiredDuringSchedulingIgnoredDuringExecution ##一定满足
preferredDuringSchedulingIgnoredDuringExecution ##尽量满足

**podAffinity(亲和性):**pod和pod更倾向腻在一起,把相近的pod结合到相近的位置,如同一区域,同一机架,这样的话pod和pod之间更好通信,比方说有两个机房,这两个机房部署的集群有1000台主机,那么我们希望把nginx和tomcat都部署同一个地方的node节点上,可以提高通信效率;

**podAntiAffinity(反亲和性):**pod和pod更倾向不腻在一起,如果部署两套程序,那么这两套程序更倾向于反亲和性,这样相互之间不会有影响。

第一个pod随机选则一个节点,做为评判后续的pod能否到达这个pod所在的节点上的运行方式,这就称为pod亲和性;我们怎么判定哪些节点是相同位置的,哪些节点是不同位置的;我们在定义pod亲和性时需要有一个前提,哪些pod在同一个位置,哪些pod不在同一个位置,这个位置是怎么定义的,标准是什么?以节点名称为标准,这个节点名称相同的表示是同一个位置,节点名称不相同的表示不是一个位置。
案例:软策性:
在这里插入图片描述
在这里插入图片描述
从运行结果来看,他都运行在Node2节点上,说明node2优于node1

硬策略:
在这里插入图片描述
状态为pending
在这里插入图片描述
满足条件:
在这里插入图片描述
在这里插入图片描述
验证:满足条件
在这里插入图片描述
反亲和性:软策略
在这里插入图片描述
在这里插入图片描述
反亲和性:硬策略
在这里插入图片描述
在这里插入图片描述
总结:
在这里插入图片描述

3.4容忍和污点

污点:
在这里插入图片描述
污点的组成:
在这里插入图片描述
在这里插入图片描述

我们使用descibe查看详细信息
在这里插入图片描述
添加污点:
在这里插入图片描述
再次查看:
在这里插入图片描述
删除污点:
在这里插入图片描述
在这里插入图片描述
我们创建10个pod:
在这里插入图片描述
在这里插入图片描述
master出现节点了.所以说明不是master无法分配节点,而是它本身存在污点
容忍:
在这里插入图片描述
我们先把master本身的污点加上:
在这里插入图片描述
在这里插入图片描述
设置方式:
在这里插入图片描述
特殊类型:
在这里插入图片描述
在这里插入图片描述

3.5固定节点调度

pod.spec.nodename将pod直接调度到指定节点上,跳过scheduler的调度策略,属于强制匹配
在这里插入图片描述
为了更方便实验,可以把nodeName改为master节点
及时设置污点,也能分配到master节点
在这里插入图片描述
我们也可以通过标签选择器去实现
在这里插入图片描述
因为我们没有这个标签,所以容器处于pending状态:
在这里插入图片描述
现在我们添加这个标签:
在这里插入图片描述

五、etcd

5.1概述

etcd 是 K8s 的唯一数据存储源(Single Source of Truth),所有组件(如 API Server、Controller Manager、Scheduler、kubelet 等)的配置与状态都依赖 etcd 存储,具体包括:
集群拓扑信息:节点(Node)的注册与状态
资源对象数据:Pod、Service、Deployment、ConfigMap、Secret、Namespace 等的定义和运行状态
集群配置:如集群网络 CIDR、API Server 地址、证书信息等
状态数据:如 Pod 的运行状态(Running/Pending)、Service 的 endpoints 列表等
注意:K8s 中仅 API Server 有权直接读写 etcd,其他组件(如 Controller Manager、kubelet)需通过 API Server 的接口间接操作 etcd 数据,确保数据一致性和安全性。

5.2相关操作

etcdctl的tar包可以从github上获取
在这里插入图片描述

环境变量配置:
在这里插入图片描述
查看etcd版本:
在这里插入图片描述
查看etcd集群节点信息:
在这里插入图片描述
查看etcd集群的健康状态:
在这里插入图片描述

查看告警事件

如果内部出现问题,会触发告警,可以通过命令查看告警引起原因,命令如下所示:

etcdctl alarm <subcommand> [flags]

常用的子命令主要有两个:

# 查看所有告警
etcdctl alarm list
# 解除所有告警
etcdctl alarm disarm

5.3etcd数据库相关操作

增加(put)

添加一个键值,基本用法如下所示:

etcdctl put [options] <key> <value> [flags]

常用参数如下所示:

参数功能描述
–prev-kv输出修改前的键值

注意事项:

  • 其中value接受从stdin的输入内容
  • 如果value是以横线-开始,将会被视为flag,如果不希望出现这种情况,可以使用两个横线代替–
  • 若键已经存在,则进行更新并覆盖原有值,若不存在,则进行添加

示例

[root@tiaoban etcd]# etcdctl put name cuiliang
OK
[root@tiaoban etcd]# etcdctl put location -- -beijing
OK
[root@tiaoban etcd]# etcdctl put foo1 bar1
OK
[root@tiaoban etcd]# etcdctl put foo2 bar2
OK
[root@tiaoban etcd]# etcdctl put foo3 bar3
OK
查询(get)

查询键值,基本用法如下所示:

etcdctl get [options] <key> [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

示例

# 获取键值
[root@tiaoban etcd]# etcdctl get name
name
cuiliang
#查看所有的key
etcdctl get / --prefix --keys-only
# 只获取值
[root@tiaoban etcd]# etcdctl get location --print-value-only
-beijing
# 批量取从foo1到foo3的值,不包括foo3
[root@tiaoban etcd]# etcdctl get foo foo3 --print-value-only
bar1
bar2
# 批量获取前缀为foo的值
[root@tiaoban etcd]# etcdctl get --prefix foo --print-value-only
bar1
bar2
bar3
# 批量获取符合前缀的前两个值
[root@tiaoban etcd]# etcdctl get --prefix --limit=2 foo --print-value-only
bar1
bar2
# 批量获取前缀为foo的值,并排序
[root@tiaoban etcd]# etcdctl get --prefix foo --print-value-only --order DESCEND
bar3
bar2
bar1
删除(del)

删除键值,基本用法如下所示:

etcdctl del [options] <key> [range_end] [flags]

常用参数如下所示:

参数功能描述
–prefix根据prefix进行匹配删除
–prev-kv输出删除的键值
–from-key按byte进行比较,删除大于等于指定key的结果

示例

# 删除name的键值
[root@tiaoban etcd]# etcdctl del name
1
# 删除从foo1到foo3且不包含foo3的键值
[root@tiaoban etcd]# etcdctl del foo1 foo3
2
# 删除前缀为foo的所有键值
[root@tiaoban etcd]# etcdctl del --prefix foo
1
更新(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

etcdctl watch name – etcdctl put name Kevin,如果写成,会不会变成死循环,导致无限监视,尽量避免。
示例

监听单个键
# 启动监听命令
[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
namePUT
location
beijing

在这里插入图片描述
在这里插入图片描述

租约命令

租约具有生命周期,需要为租约授予一个TTL(time to live),将租约绑定到一个key上,则key的生命周期与租约一致,可续租,可撤销租约,类似于redis为键设置过期时间。其主要用法如下所示:

etcdctl lease <subcommand> [flags]
添加租约

主要用法如下所示:

etcdctl lease grant <ttl> [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 <leaseID> [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] <leaseID> [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 <leaseID> [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]
备份恢复演示
  • 新建一个名为name的key
[root@tiaoban ~]# etcdctl put name cuiliang
OK
[root@tiaoban ~]# etcdctl get name
name
cuiliang
[root@tiaoban ~]# etcdctl endpoint status -w table
+---------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
|      ENDPOINT       |        ID        | VERSION | DB SIZE | IS LEADER | IS LEARNER | RAFT TERM | RAFT INDEX | RAFT APPLIED INDEX | ERRORS |
+---------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
| 192.168.10.100:2379 | 2e0eda3ad6bc6e1e |  3.4.23 |   20 kB |      true |      false |         4 |         10 |                 10 |        |
|  192.168.10.11:2379 | bc34c6bd673bdf9f |  3.4.23 |   20 kB |     false |      false |         4 |         10 |                 10 |        |
|  192.168.10.12:2379 | 5d2c1bd3b22f796f |  3.4.23 |   20 kB |     false |      false |         4 |         10 |                 10 |        |
+---------------------+------------------+---------+---------+-----------+------------+-----------+------------+--------------------+--------+
  • 生成快照,创建名为snap.db的备份文件
[root@k8s-work1 ~]# etcdctl snapshot save snap.db
{"level":"info","ts":1679220752.5883558,"caller":"snapshot/v3_snapshot.go:119","msg":"created temporary db file","path":"snap.db.part"}
{"level":"info","ts":"2023-03-19T18:12:32.592+0800","caller":"clientv3/maintenance.go:200","msg":"opened snapshot stream; downloading"}
{"level":"info","ts":1679220752.5924425,"caller":"snapshot/v3_snapshot.go:127","msg":"fetching snapshot","endpoint":"127.0.0.1:2379"}
{"level":"info","ts":"2023-03-19T18:12:32.595+0800","caller":"clientv3/maintenance.go:208","msg":"completed snapshot read; closing"}
{"level":"info","ts":1679220752.597161,"caller":"snapshot/v3_snapshot.go:142","msg":"fetched snapshot","endpoint":"127.0.0.1:2379","size":"25 kB","took":0.008507131}
{"level":"info","ts":1679220752.5973082,"caller":"snapshot/v3_snapshot.go:152","msg":"saved","path":"snap.db"}
Snapshot saved at snap.db
  • 查看备份文件详情
[root@k8s-work1 ~]# ls -lh snap.db 
-rw------- 1 root root 25K 319 18:12 snap.db
[root@k8s-work1 ~]# etcdctl snapshot status snap.db -w table
+----------+----------+------------+------------+
|   HASH   | REVISION | TOTAL KEYS | TOTAL SIZE |
+----------+----------+------------+------------+
| 8f097221 |       39 |         47 |      25 kB |
+----------+----------+------------+------------+
  • 把快照文件传到其他节点
[root@k8s-work1 ~]# scp snap.db 192.168.10.100:/root                                                                                                                      100%   24KB   6.9MB/s   00:00    
[root@k8s-work1 ~]# scp snap.db 192.168.10.12:/root
  • 停止所有节点的etcd服务,并删除数据目录
[root@k8s-work1 ~]# rm -rf /var/lib/etcd/*
[root@k8s-work1 ~]# etcdctl snapshot restore test.db
[root@k8s-work1 ~]# cp -r default.etcd/member/ /var/lib/etcd/
[root@k8s-work1 ~]# docker ps -a | grep etcd
[root@k8s-work1 ~]# docker restart 550
[root@k8s-work1 ~]# etcdctl get s
s
1
# 其余两个节点相同操作

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

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

相关文章

2025 数字化转型期,值得关注的 10 项高价值证书解析

2025 年&#xff0c;数字化转型已迈入深度渗透阶段&#xff0c;大数据、人工智能、云计算等技术重塑各行业格局&#xff0c;相关领域人才缺口持续扩大。对于职场人突破瓶颈、大学生抢占就业先机而言&#xff0c;适配转型需求的专业证书已成为核心竞争力。本文结合行业经验&…

STM32 入门教程:从零基础到项目实战

STM32 微控制器凭借其高性能、低功耗、丰富外设以及庞大的生态系统&#xff0c;成为工程师和开发者的首选。对于刚接触 STM32 的新手来说&#xff0c;面对复杂的芯片架构和开发流程&#xff0c;往往会感到无从下手。本文将以通俗易懂的语言&#xff0c;结合实际案例&#xff0c…

ros、slam、激光雷达、自动驾驶相关学习内容和计划

明白 ✅。你现在做的是 LHD自动驾驶&#xff0c;核心技术是 SLAM、LiDAR、ROS、感知与规划控制。这类项目涉及“工程落地 学术算法 安全规范”三大方面。我给你一个循序渐进的学习方案&#xff08;从基础到应用&#xff09;&#xff0c;并附带开源项目推荐&#xff0c;方便你…

Flutter 完全组件化的项目结构设计实践

Flutter 完全组件化的项目结构设计实践 在做 Flutter 项目的时候&#xff0c;随着业务不断扩展&#xff0c;如果所有代码都堆在 lib/ 目录里&#xff0c;后期维护会越来越痛苦。组件化&#xff08;Componentization&#xff09; 是一种常见的解决方案&#xff0c;它能让项目更清…

文件上传漏洞基础及挖掘流程

基础介绍定义用户通过文件上传的功能模块进行文件上传时&#xff0c;如果服务端没有对上传文件进行严格的验 证和过滤&#xff0c;而导致的用户可以越过其本身权限向服务器上上传可执行的动态脚本文件。则 攻击者可以通过上传木马&#xff0c;webshell等恶意文件&#xff0c;经…

【C2000】C2000的硬件设计指导与几点意见

《C2000 MCU硬件设计指南》 提示:《C2000 MCU硬件设计指南》用于指导C2000 MCU应用中的原理图设计与注意事项 文章目录 《C2000 MCU硬件设计指南》 前言 1.器件选型与封装决策 2.电源设计与去耦策略 3.时钟与复位电路设计 4.PCB布局与接地策略 5.EMI/EMC与ESD防护 [F2800x C20…

屏随人动+视觉魔方+多样主题+智能留言,涂鸦Wukong AI 2.0助力打造爆款带屏云台相机

一、带屏云台机&#xff1a;超硬核的市场魔力 作为 IPC 消费级别里的第一大品类&#xff0c;云台机市场一直处于稳步增长阶段&#xff0c;2024 年全球出货量达到 7000 万台。而其中的最强潜力股–带屏云台机&#xff0c;在 AI 大模型的强势赋能下&#xff0c;更于今年迎来全新…

Polkadot - ELVES

ELVES (Endorsing Light Validity Evaluator System) 即 轻量级背书有效性评估系统 。它是 JAM 可扩展且自适应的区块审计协议&#xff0c;即是JAM用于finalise区块的协议, 确保只有有效区块才能最终确定。 论文 – 2024-961 : Jeff Burdges、Cevallos 等人在2024年提出的 ELV…

【科研写作自动化工具】如何​​用AI技术组合(大模型+多Agent+自动化)打造一个“智能论文生产线”​​,把写作流程变成自动化

自主构建智慧科研写作系统——融合LLM语义理解、多智能体任务协同与n8n自动化工作流n8n 是一款开源的 ​​工作流自动化工具​​&#xff0c;类似于 Zapier 或 Make&#xff08;原 Integromat&#xff09;&#xff0c;但更注重灵活性和开发者友好性。在课程文件中提到的 ​​n8…

window显示驱动开发—监视器类函数驱动程序

设备节点用于表示已连接到一台监视器的显示适配器上的每个视频输出。 设备节点是显示适配器设备节点的子节点。通常情况下&#xff0c;设备堆栈中只有两个设备对象代表一对视频输出/监视器&#xff1a;物理设备对象 (PDO)。功能设备对象 (FDO)。在某些情况下&#xff0c;筛选器…

STM32CubeMX + HAL 库:基于 I²C 通信的 AHT20 高精度温湿度测量实验

1 概述1.1 实验目的本实验基于 STM32CubeMX 与 HAL 库&#xff0c;借助硬件 IC 接口实现对 AHT20 高精度温湿度传感器的测量与数据处理。实验内容涵盖 AHT20 的初始化流程、指令交互机制、测量数据的采集与物理量转换等关键环节。通过对实验驱动代码与测试结果的完整展示&#…

今日分享:C++ -- vector

&#x1f60e;【博客主页&#xff1a;你最爱的小傻瓜】&#x1f60e; &#x1f914;【本文内容&#xff1a;C vector &#x1f60d; 】&#x1f914; --------------------------------------------------------------------------------------------------------------------…

NAS Docker 安装N8N

NAS Docker 安装N8Ndocker 操作中文版使用 Docker Compose&#xff08;更易于管理&#xff09;创建一个 docker-compose.yml 文件&#xff0c;内容如下&#xff1a;yaml version: 3services:n8n:image: n8nio/n8n:latestcontainer_name: n8nrestart: unless-stoppedports:- &q…

Node.js汉字转拼音指南:pinyin-pro全解析

pinyin-pro 工具库简介核心功能&#xff1a;汉字转拼音、多音字处理、音调控制、格式定制等性能特点&#xff1a;高效、轻量级、支持多种拼音风格应用场景&#xff1a;搜索优化、数据排序、中文输入法等环境准备与安装Node.js npm 或 yarn 安装 pinyin-pronpm install pinyin-p…

UART-TCP双向桥接服务

UART-TCP双向桥接服务是一种将串口&#xff08;UART&#xff09;通信与TCP/IP网络通信相互转换的技术服务&#xff0c;其核心功能是实现两种不同协议之间的数据透明传输。1. 基本概念UART&#xff08;串口&#xff09;&#xff1a;硬件设备的传统通信接口&#xff0c;常见于嵌入…

江协科技STM32学习笔记补充之001。为什么C语言在对STM32编程过程中的二进制要用十六进制来进行读写。而不能直接用二进制来进行读写。

下面给你一个“为什么嵌入式 C&#xff08;如 STM32&#xff09;普遍用十六进制而不是二进制来读写寄存器/地址”的系统性分析。核心观点&#xff1a;十六进制是对底层位模式更高效、更可靠的“人类可读编码”&#xff0c;与硬件资料、编译器和调试器生态形成了标准化协同。1&a…

从 “对话” 到 “共创”:生成式 AI 如何重塑内容创作全流程,普通人也能掌握的高效工具指南

一、引言&#xff1a;内容创作的 “AI 范式转移”—— 从单向输出到双向共创​传统内容创作痛点&#xff1a;灵感枯竭、流程繁琐&#xff08;选题 - 调研 - 初稿 - 修改 - 定稿耗时久&#xff09;、专业门槛高&#xff08;如设计需掌握 PS、写作需深厚文字功底&#xff09;​生…

函数、数组与 grep + 正则表达式的 Linux Shell 编程进阶指南

文章目录1.函数相关2.数组相关3.正则表达式与grep根据你提供的内容&#xff0c;我整理了一份关于Shell脚本中函数、数组和正则表达式的简明参考&#xff1a; 1.函数相关 函数调用&#xff1a; 直接使用函数名调用&#xff1a;函数名 参数传递&#xff1a; 函数内接收参数&…

nginx-realip问题解决方案

nginx-realip问题解决方案一、配置真实ip解析二、日志中记录真实 IP三、在日志中验证一、配置真实ip解析 让backend server知道前端是谁来访问的&#xff0c;知道他们的ip地址 LB在转发数据包的时候&#xff0c;在http请求报文里增加一个字段&#xff0c;携带user的ip地址&am…

Kafka入门指南:从安装到集群部署

一、Kafka 基础与系统要求 1.1 核心概念 Broker&#xff1a;Kafka 服务器节点&#xff0c;负责存储消息和处理客户端请求 Topic&#xff1a;消息分类的逻辑容器&#xff0c;每条消息需指定发送到某个 Topic Partition&#xff1a;Topic 的物理分片&#xff0c;可分布式存储…