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

    文章

    902

    浏览量

    27991
  • CRI
    CRI
    +关注

    关注

    1

    文章

    16

    浏览量

    12222
  • POD
    POD
    +关注

    关注

    0

    文章

    16

    浏览量

    6007

原文标题:如何使用 Kubernetes 检查点 API 快速进行容器的备份和恢复

文章出处:【微信号:良许Linux,微信公众号:良许Linux】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    低压电容器运行前需要检查什么

    在低压电容器投入运行前,通常需要进行以下检查,以确保其正常运行和安全性: 外观检查检查容器
    的头像 发表于 10-25 14:16 100次阅读
    低压电<b class='flag-5'>容器</b>运行前需要<b class='flag-5'>检查</b>什么

    Kubernetes集群搭建容器云需要几台服务器?

    Kubernetes集群搭建容器云需要几台服务器?至少需要4台服务器。搭建容器云所需的服务器数量以及具体的搭建步骤,会根据所选用的技术栈、业务规模、架构设计以及安全需求等因素而有所不同。以下是一个基于
    的头像 发表于 10-21 10:06 102次阅读

    故障电容器检查时的注意事项

    能存有电荷,应使用专用放电电阻或放电棒对其进行放电处理。 2、检查外观 观察鼓包和变形 :检查容器外壳是否有鼓包、变形或裂纹,这是内部故障的明显迹象。
    的头像 发表于 08-22 14:04 324次阅读

    假如服务器的数据丢失,如何快速恢复丢失的数据?

    在服务器数据丢失后,快速恢复丢失的数据是至关重要的,以避免业务中断和数据损失。以下是一些方法和步骤,可以帮助企业快速有效地恢复丢失的数据: 1. 使用
    的头像 发表于 08-08 16:59 279次阅读

    使用Velero备份Kubernetes集群

    Velero 是 heptio 团队(被 VMWare 收购)开源的 Kubernetes 集群备份、迁移工具。
    的头像 发表于 08-05 15:43 302次阅读
    使用Velero<b class='flag-5'>备份</b><b class='flag-5'>Kubernetes</b>集群

    恢复检查方法有哪些?

    恢复桥作为现代电力电子设备中的重要组成部分,其性能和可靠性直接影响整个系统的效率和稳定性。快恢复桥具有较快的恢复时间,广泛应用于各种高频电力转换场合。因此,定期对快恢复
    的头像 发表于 07-11 10:38 248次阅读
    快<b class='flag-5'>恢复</b>桥<b class='flag-5'>检查</b>方法有哪些?

    如何为您的超级电容器快速充电

    如何为您的超级电容器快速充电超级电容器(或超级电容器)适用于短充电和放电周期。它们需要高电流进行快速
    的头像 发表于 07-10 13:34 743次阅读
    如何为您的超级电<b class='flag-5'>容器</b><b class='flag-5'>快速</b>充电

    恢复二极管检查方法有哪些?

    恢复二极管是一种特殊类型的二极管,具有快速恢复特性,广泛应用于开关电源、逆变器等高速开关电路中。在实际应用中,确保快恢复二极管的性能和质量。1.外观
    的头像 发表于 07-05 10:42 460次阅读
    快<b class='flag-5'>恢复</b>二极管<b class='flag-5'>检查</b>方法有哪些?

    Kubernetes Gateway API攻略教程

    Kubernetes Gateway API 刚刚 GA,旨在改进将集群服务暴露给外部的过程。这其中包括一套更标准、更强大的 API资源,用于管理已暴露的服务。在这篇文章中,我将介绍 Gateway
    的头像 发表于 01-12 11:32 801次阅读
    <b class='flag-5'>Kubernetes</b> Gateway <b class='flag-5'>API</b>攻略教程

    mysql中表分区的备份恢复

    MySQL的表分区是一种将大型表分成更小段的技术,这样可以提高查询效率、降低维护成本和减少数据备份恢复时间。在进行表分区的过程中,我们也需要了解如何备份
    的头像 发表于 11-23 14:39 1011次阅读

    mysql备份还原哪些方法

    和注意事项。 一、物理备份 物理备份是将MySQL数据库的全部数据文件直接复制到另一个位置,可以快速恢复数据,但不能精确到表级别的恢复。物理
    的头像 发表于 11-23 14:35 944次阅读

    linux恢复远端备份文件

    文件的步骤。 一、准备工作 在开始恢复远端备份文件之前,我们需要进行一些准备工作。首先,我们需要确保我们有足够的权限来访问远端备份文件。其次,我们需要知道远端
    的头像 发表于 11-23 10:08 451次阅读

    linux系统备份与还原工具

    Linux系统备份与还原工具是用于备份恢复Linux操作系统的工具。在日常使用中,备份和还原是非常重要的操作,可以帮助我们保护数据并快速
    的头像 发表于 11-23 10:04 2479次阅读

    iSulad Sandbox API简化容器调用链

    Kubernetes 的最小编排调度单元 Pod Sandbox 实际上是一个沙箱,为其中的容器提供了资源共享和安全隔离的运行环境。
    的头像 发表于 11-20 17:08 582次阅读
    iSulad Sandbox <b class='flag-5'>API</b>简化<b class='flag-5'>容器</b>调用链

    如何在HarmonyOS对数据库进行备份恢复与加密

    出现问题,开发者可以使用恢复功能,将数据库恢复到之前的状态,重新对数据库进行操作。 在数据库被篡改、删除、或者设备断电场景下,数据库可能会因为数据丢失、数据损坏、脏数据等而不可用,可以通过数据库的
    发表于 11-07 08:57