小白成長之路-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
英文地址,請注明出處:http://en.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 庫:基于 I2C 通信的 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;可分布式存儲…