吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

怎么使用Kubernetes檢查點API快速進行容器的備份和恢復呢?

dyquk4xk2p3d ? 來源:k8s技術圈 ? 2023-10-30 15:50 ? 次閱讀

Kubernetes v1.25 引入了容器檢查點 API 作為 alpha 特性。這提供了一種在不停止容器的情況下備份和恢復運行在 Pod 中的容器的方式。此功能主要用于調試分析,但任何 Kubernetes 用戶都可以利用常規備份和恢復功能。

接下來,讓我們來看看這個特性,并了解如何在我們的集群中啟用它,并利用它進行備份和恢復或調試分析。

安裝

在我們開始對任何容器進行檢查點處理之前,我們需要一個 playgroud,在這個 playgroud 上我們可以操作 kubelet 和它的工作負載。為此,我們將需要一個支持容器檢查點處理的 v1.25+ 版本的 Kubernetes集 群和容器運行時環境。

這里我們將使用在 Vagrant 中構建的虛擬機內使用 kubeadm 創建一個集群,只需執行vagrant up即可快速啟動該集群。

如果你想搭建自己的集群,請確保集群必須啟用ContainerCheckpoint功能標志。對于 kubeadm 使用以下配置:

#kubeadm-config.yaml
apiVersion:kubelet.config.k8s.io/v1beta1
kind:KubeletConfiguration
featureGates:
ContainerCheckpoint:true
---
apiVersion:kubeadm.k8s.io/v1beta3
kind:ClusterConfiguration
kubernetesVersion:v1.25.0
apiServer:
extraArgs:
feature-gates:"ContainerCheckpoint=true"
controllerManager:
extraArgs:
feature-gates:"ContainerCheckpoint=true"
scheduler:
extraArgs:
feature-gates:"ContainerCheckpoint=true"
networking:
podSubnet:10.244.0.0/16

這將向集群組件傳遞--feature-gates標志。此外,我們還需要使用支持檢查點的容器運行時。撰寫本文時,僅CRI-O支持它,而 Containerd 可能很快也會支持(https://github.com/containerd/containerd/pull/6965),最新版本的crictl已經支持通過crictl checkpoint創建檢查點。

要使用 CRI-O 配置集群,請按照文檔中的說明安裝它,或者使用上述存儲庫中的腳本(你應該在虛擬機而不是本地運行此腳本)。

另外,我們還需要為 CRI-O 啟用CRIU,這是在后臺執行實際檢查點的工具。要啟用它,我們需要設置--enable-criu-support=true標志。上面的腳本可以為你做到這一點。

另外,如果你打算將其恢復到 Pod 中,還需要將--drop-infra-ctr設置為 false,否則您將收到CreateContainerError并顯示如下消息:

kubeletError:podlevelPIDnamespacerequestedforthecontainer,...
...butpodsandboxwasnotsimilarlyconfigured,anddoesnothaveaninfracontainer

在安裝了 CRI-O 之后,我們還需要告訴 kubeadm 使用它的 sock 文件,下面的配置將會處理這個問題:

apiVersion:kubeadm.k8s.io/v1beta3
kind:InitConfiguration
localAPIEndpoint:
advertiseAddress:192.168.56.2
bindPort:6443
nodeRegistration:
criSocket:"unix:///var/run/crio/crio.sock"
---

然后我們就可以使用以下命令快速啟動集群:

kubeadminit--config=.../kubeadm-config.yaml--upload-certs|teekubeadm-init.out

這將給我們提供一個單節點集群,如下(注意容器運行時版本):

$kubectlgetnodes-owide
NAMESTATUSROLESAGEVERSION...OS-IMAGEKERNEL-VERSIONCONTAINER-RUNTIME
kubemasterReadycontrol-plane82sv1.25.4...Ubuntu20.04.5LTS5.4.0-125-genericcri-o://1.25.0

Checkpointing

集群安裝完成后,我們可以嘗試創建一個檢查點。在 Kubernetes 上通常可以使用 kubectl 或者運行 curl 命令來執行常規操作,訪問集群 APIServer。然而,在這里這樣做是行不通的,因為檢查點 API 只暴露在每個集群節點上的 kubelet 上。因此,我們必須前往節點上并直接與 kubelet 交互:

$vagrantsshkubemaster
$sudosu-

#Checkifit'srunning...
$systemctlstatuskubelet

kubelet.service-kubelet:TheKubernetesNodeAgent
Loaded:loaded(/lib/systemd/system/kubelet.service;enabled;vendorpreset:enabled)
Drop-In:/etc/systemd/system/kubelet.service.d
└─10-kubeadm.conf
Active:active(running)sinceSat2022-11-121029UTC;30sago
Docs:https://kubernetes.io/docs/home/
MainPID:29501(kubelet)
Tasks:14(limit:2339)
Memory:34.7M
CGroup:/system.slice/kubelet.service
└─29501/usr/bin/kubelet--bootstrap-kubeconfig=...--kubeconfig=...

為了創建檢查點,我們還需要一個正在運行的 Pod。讓我們在 default 命名空間中創建一個 Nginx Pod:

$kubectltaintnodes--allnode-role.kubernetes.io/control-plane-
$kubectlrunwebserver--image=nginx-ndefault
$kubectlgetpods-owide
NAMEREADYSTATUSRESTARTSAGEIPNODE
webserver1/1Running027s10.85.0.4kubemaster

這里我們從節點中刪除了污點,這樣即使它是控制平面,我們也可以在節點上調度工作負載。

接下來,讓我們向 kubelet 發出一個示例 API 請求,來查看是否正常:

$curl-skv-XGET"https://localhost:10250/pods"
--key/etc/kubernetes/pki/apiserver-kubelet-client.key
--cacert/etc/kubernetes/pki/ca.crt
--cert/etc/kubernetes/pki/apiserver-kubelet-client.crt

{
"kind":"PodList",
"apiVersion":"v1",
"metadata":{},
"items":[
{
"metadata":{
"name":"webserver",
"namespace":"default",
...
}
}
...
}

kubelet 默認運行在端口 10250 上,因此我們使用 curl 命令并請求其所有的 Pod。我們還需要指定 CA 證書、客戶端證書和密鑰進行身份驗證。

接下來就可以創建一個檢查點了:

$curl-sk-XPOST"https://localhost:10250/checkpoint/default/webserver/webserver"
--key/etc/kubernetes/pki/apiserver-kubelet-client.key
--cacert/etc/kubernetes/pki/ca.crt
--cert/etc/kubernetes/pki/apiserver-kubelet-client.crt

#Response:
#{"items":["/var/lib/kubelet/checkpoints/checkpoint-webserver_default-webserver-2022-11-12T1013Z.tar"]}

#Checkthedirectory:
$ls-l/var/lib/kubelet/checkpoints/

total3840
-rw-------1rootroot3931136Nov1210:28checkpoint-webserver_default-webserver-2022-11-12T1013Z.tar

#Verifythatoriginalcontainerisstillrunning:
$crictlps--namewebserver
CONTAINERIMAGECREATEDSTATENAMEATTEMPTPODIDPOD
880ee7ddff7f3docker.io/library/nginx@sha256:...48secondsagoRunningwebserver0d584446dd8d5ewebserver

檢查點 API 位于.../checkpoint/${NAMESPACE}/${POD}/${CONTAINER},這里我們使用之前創建的 Pod,此請求在/var/lib/kubelet/checkpoints/checkpoint-_--.tar中創建了一個存檔。

運行上述 curl 后,您可能會收到如下錯誤:

checkpointingofdefault/webserver/webserverfailed(CheckpointContainerisonlysupportedintheCRIv1runtimeAPI)
#or
checkpointingofdefault/webserver/webserverfailed(rpcerror:code=Unknowndesc=checkpoint/restoresupportnotavailable)

這意味著您的容器運行時尚不支持檢查點功能,或者未正確啟用。

分析

我們現在有了一個檢查點容器存檔,所以讓我們看看里面有什么:

$cd/var/lib/kubelet/checkpoints/
#Renamebecause"tar"doesn'tlike":"innames
$mv"checkpoint-webserver_default-webserver-2022-11-12T1013Z.tar"webserver.tar
#Viewcontents:
$tar--exclude="*/*"-tfwebserver.tar

dump.log
checkpoint/
config.dump
spec.dump
rootfs-diff.tar
io.kubernetes.cri-o.LogPath

#Extract:
$tar-xfcheckpoint-webserver_default-webserver-2022-09-04T1037Z.tar
$lscheckpoint/
cgroup.imgfdinfo-4.imgids-31.imgmountpoints-13.imgpages-2.imgtmpfs-dev-139.tar.gz.img
core-1.imgfiles.imginventory.imgnetns-10.imgpages-3.imgtmpfs-dev-140.tar.gz.img
core-30.imgfs-1.imgipcns-var-11.imgpagemap-1.imgpages-4.imgtmpfs-dev-141.tar.gz.img
core-31.imgfs-30.imgmemfd.imgpagemap-30.imgpstree.imgtmpfs-dev-142.tar.gz.img
descriptors.jsonfs-31.imgmm-1.imgpagemap-31.imgseccomp.imgutsns-12.img
fdinfo-2.imgids-1.imgmm-30.imgpagemap-shmem-94060.imgtimens-0.img
fdinfo-3.imgids-30.imgmm-31.imgpages-1.imgtmpfs-dev-136.tar.gz.img


$catconfig.dump
{
"id":"880ee7ddff7f3ce11ee891bd89f8a7356c97b23eb44e0f4fbb51cb7b94ead540",
"name":"k8s_webserver_webserver_default_91ad1757-424e-4195-9f73-349b332cbb7a_0",
"rootfsImageName":"docker.io/library/nginx:latest",
"runtime":"runc",
"createdTime":"2022-11-12T1056.460946241Z"
}

$tar-tfrootfs-diff.tar
var/cache/nginx/proxy_temp/
var/cache/nginx/scgi_temp/
var/cache/nginx/uwsgi_temp/
var/cache/nginx/client_temp/
var/cache/nginx/fastcgi_temp/
etc/mtab
run/nginx.pid
run/secrets/kubernetes.io/
run/secrets/kubernetes.io/serviceaccount/

如果您不需要一個正在運行的 Pod/容器進行分析,那么提取并閱讀上面顯示的一些文件可能會為您提供必要的信息

恢復

雖然 Checkpointing API 目前更加注重于調試分析,但它仍然可以用于從存檔中恢復 Pod/容器。最簡單的方法是從檢查點存檔創建一個鏡像:

FROMscratch
#NeedtouseADDbecauseitextractsarchives
ADDwebserver.tar.

這里我們使用一個空(scratch)鏡像,然后向其添加歸檔文件。這里需要使用 ADD 命令,因為它會自動解壓縮歸檔文件。接下來,我們使用 docker 或 buildah 構建它。

$cd/var/lib/kubelet/checkpoints/
#Ordockerbuild...
$buildahbud
--annotation=io.kubernetes.cri-o.annotations.checkpoint.name=webserver
-trestore-webserver:latest
Dockerfile.

$buildahpushlocalhost/restore-webserver:latestdocker.io/martinheinz/restore-webserver:latest

在上面,我們還添加了一個注解,描述了容器的原始可讀名稱,然后我們將其推送到一些倉庫,以便 Kubernetes 可以拉取它。最后,我們創建一個Pod,指定之前推送的鏡像。

#pod.yaml
apiVersion:v1
kind:Pod
metadata:
name:restore-webserver
labels:
app:nginx
spec:
containers:
-name:webserver
image:docker.io/martinheinz/restore-webserver:latest
nodeName:kubemaster

為了測試是否成功,我們可以通過 Service 將 Pod 暴露出來,并使用 curl 命令訪問其IP地址。

$kubectlexposepodrestore-webserver--port=80--target-port=80
$kubectlgetsvc

NAMETYPECLUSTER-IPEXTERNAL-IPPORT(S)AGE
kubernetesClusterIP10.96.0.1443/TCP14m
restore-webserverClusterIP10.104.30.9080/TCP17s

$curlhttp://10.104.30.90




Welcometonginx!
...


可以看到生效了,我們成功地在不停止它的情況下備份了并恢復一個正在運行的 Pod。

總結

Kubernetes 的檢查點功能是增強容器化應用程序容錯性和彈性的強大工具。通過實施良好規劃的檢查點策略,你可以將停機時間降至最低,改善資源利用情況,并簡化應用程序遷移。

優點

增強的容錯性——檢查點功能使應用程序能夠在故障發生時從最后一個已知檢查點恢復,減少停機時間,并確保應用程序保持高可用性。

簡化遷移——檢查點功能使將正在運行的應用程序移動到不同主機變得更加容易。通過保存應用程序的狀態,您可以將其遷移到不同的節點,而不會丟失進度或造成中斷。如果您的應用程序需要很長時間的預熱,您可以利用這個功能。這將大大減少應用程序的啟動時間。

改進的擴展性——通過檢查點功能,您可以輕松地擴展應用程序以滿足波動的需求。如果一個節點過載了,您可以將應用程序遷移到擁有更多資源的另一個節點,確保最佳性能。

高效的資源使用——檢查點功能允許您暫停長時間運行的應用程序,釋放資源給其他任務使用。當再次需要應用程序時,可以從檢查點恢復。

Kubernetes 檢查點的最佳實踐

定期創建檢查點——根據應用程序的要求,定期創建檢查點,以最小化在故障發生時的數據丟失。

監控和管理資源——檢查點功能可能消耗大量系統資源,尤其是內存。監控集群的資源使用情況,并根據需要調整檢查點策略,以避免性能問題。

測試您的檢查點策略——定期測試您的檢查點過程,確保其按預期工作,并能在故障發生時恢復應用程序。

自動化檢查點管理——使用像 cron 作業或 Kubernetes Operator 這樣的自動化工具,在預定的時間表上創建和管理檢查點,確保您的應用程序始終受到保護。







審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 虛擬機
    +關注

    關注

    1

    文章

    937

    瀏覽量

    28426
  • CRI
    CRI
    +關注

    關注

    1

    文章

    16

    瀏覽量

    12264
  • POD
    POD
    +關注

    關注

    0

    文章

    18

    瀏覽量

    6048

原文標題:如何使用 Kubernetes 檢查點 API 快速進行容器的備份和恢復

文章出處:【微信號:良許Linux,微信公眾號:良許Linux】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    Kubernetes:構建高效的容器化應用平臺

    Kubernetes 作為容器編排的事實標準,在容器化應用部署中發揮著關鍵作用。 搭建 Kubernetes 集群是應用的基礎。可以使用kubeadm工具
    的頭像 發表于 01-23 15:22 ?84次閱讀

    使用 Flexus 云服務器 X 實例部署 Kubernetes 圖形化管理平臺

    Kubernetes 作為當今最流行的容器編排平臺,隨著云計算、微服務架構和 DevOps 文化的普及,Kubernetes 在自動化部署、擴展和管理容器化應用程序方面扮演著越來越重要
    的頭像 發表于 01-21 16:14 ?101次閱讀
    使用 Flexus 云服務器 X 實例部署 <b class='flag-5'>Kubernetes</b> 圖形化管理平臺

    OpenAI宣布API恢復運行,ChatGPT正在逐步回歸

    近日,OpenAI官方發布了一則重要更新說明,宣布其API系統現已全面恢復運行,同時確認ChatGPT服務正在逐步恢復中。這一消息對于眾多依賴OpenAI服務的用戶來說,無疑是一個好消息。 早些時候
    的頭像 發表于 12-28 14:41 ?436次閱讀

    低壓電容器運行前需要檢查什么

    在低壓電容器投入運行前,通常需要進行以下檢查,以確保其正常運行和安全性: 外觀檢查檢查容器
    的頭像 發表于 10-25 14:16 ?312次閱讀
    低壓電<b class='flag-5'>容器</b>運行前需要<b class='flag-5'>檢查</b>什么

    Kubernetes集群搭建容器云需要幾臺服務器?

    Kubernetes集群搭建容器云需要幾臺服務器?至少需要4臺服務器。搭建容器云所需的服務器數量以及具體的搭建步驟,會根據所選用的技術棧、業務規模、架構設計以及安全需求等因素而有所不同。以下是一個基于
    的頭像 發表于 10-21 10:06 ?196次閱讀

    VILA與其他模型在提供邊緣AI 2.0方面的表現

    VILA 是 NVIDIA 研究部門與麻省理工學院共同開發的高性能視覺語言模型系列。最大的模型約有 400 億參數,最小的模型約有 30 億參數,并且完全開源(包括模型檢查點、訓練代碼和訓練數據)。
    的頭像 發表于 10-10 10:06 ?295次閱讀
    VILA與其他模型在提供邊緣AI 2.0方面的表現

    容器云服務引擎是什么?如何使用

    容器云服務引擎(CloudContainerEngine,簡稱CCE),是一個企業級的Kubernetes集群托管服務,提供高度可擴展、高性能的云原生應用部署和管理方案。容器云服務引擎一種基于云原生
    的頭像 發表于 09-30 10:17 ?242次閱讀

    故障電容器檢查時的注意事項

    能存有電荷,應使用專用放電電阻或放電棒對其進行放電處理。 2、檢查外觀 觀察鼓包和變形 :檢查容器外殼是否有鼓包、變形或裂紋,這是內部故障的明顯跡象。
    的頭像 發表于 08-22 14:04 ?533次閱讀

    假如服務器的數據丟失,如何快速恢復丟失的數據?

    在服務器數據丟失后,快速恢復丟失的數據是至關重要的,以避免業務中斷和數據損失。以下是一些方法和步驟,可以幫助企業快速有效地恢復丟失的數據: 1. 使用
    的頭像 發表于 08-08 16:59 ?603次閱讀

    使用Velero備份Kubernetes集群

    Velero 是 heptio 團隊(被 VMWare 收購)開源的 Kubernetes 集群備份、遷移工具。
    的頭像 發表于 08-05 15:43 ?401次閱讀
    使用Velero<b class='flag-5'>備份</b><b class='flag-5'>Kubernetes</b>集群

    DevOps中的質量門工作原理,以及靜態代碼分析Klocwork和Perforce Helix QAC在質量門中的實踐應用

    如何使用靜態代碼分析工具(如Klocwork 和 Helix QAC)實現質量門。 什么是質量門? 質量門是在IT或開發項目中實施的檢查點,這些檢查點要求在進入下一個開發階段之前達到最低標準。質量門可以阻止不合格代碼的部署,幫助確保更高質量的產品。
    的頭像 發表于 07-29 15:12 ?475次閱讀

    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝Kubernetes集群

    Kubernetes,通常縮寫為K8s,是一個開源的容器編排平臺,旨在自動化容器化應用的部署、擴展和管理。有了Kubernetes,您可以輕松地部署、更新和擴展應用,而無需擔心底層基礎
    的頭像 發表于 07-15 13:31 ?912次閱讀
    如何使用Kubeadm命令在PetaExpress Ubuntu系統上安裝<b class='flag-5'>Kubernetes</b>集群

    恢復檢查方法有哪些?

    恢復橋作為現代電力電子設備中的重要組成部分,其性能和可靠性直接影響整個系統的效率和穩定性。快恢復橋具有較快的恢復時間,廣泛應用于各種高頻電力轉換場合。因此,定期對快恢復
    的頭像 發表于 07-11 10:38 ?346次閱讀
    快<b class='flag-5'>恢復</b>橋<b class='flag-5'>檢查</b>方法有哪些?

    如何為您的超級電容器快速充電

    如何為您的超級電容器快速充電超級電容器(或超級電容器)適用于短充電和放電周期。它們需要高電流進行快速
    的頭像 發表于 07-10 13:34 ?1059次閱讀
    如何為您的超級電<b class='flag-5'>容器</b><b class='flag-5'>快速</b>充電

    恢復二極管檢查方法有哪些?

    恢復二極管是一種特殊類型的二極管,具有快速恢復特性,廣泛應用于開關電源、逆變器等高速開關電路中。在實際應用中,確保快恢復二極管的性能和質量。1.外觀
    的頭像 發表于 07-05 10:42 ?703次閱讀
    快<b class='flag-5'>恢復</b>二極管<b class='flag-5'>檢查</b>方法有哪些?
    百家乐官网赌牌技巧| 百家乐官网最新投注方法| 百家乐伴侣| 百家乐官网一黑到底| 云博娱乐城官网注册| 澳门百家乐娱乐城网址| 百家乐官网凯时娱乐平台| 浦东新区| 钱大发888游戏下载| 至尊百家乐娱乐网| 24山72向局图解| 百家乐官网包台| 百家乐官网娱乐城游戏| 全讯网3344111| 百家乐打法分析| 百家乐官网赢钱面面观| 百家乐官网高手看百家乐官网| 大发888大家赢娱乐| 百家乐游戏什么时间容易出| 皇冠百家乐代理网| 七匹狼百家乐官网的玩法技巧和规则| 百家乐官网人生信条漫谈| 法老王娱乐城| 大发888娱乐客户端下载| 天博百家乐娱乐城| 百家乐娱乐备用网址| 九州百家乐娱乐城| 线上百家乐官网是如何作弊| 百家乐官网台布21点| 百家乐官网什么牌最大| 明升国际| 皇廷国际| 九龙娱乐| 在线棋牌| 时时博娱乐城评级| 大发888官方网站| 大发888在线| 澳门顶级赌场娱乐城| 百家乐出庄概率| 百家乐官网必胜打| 免费百家乐官网缩水软件|