专栏首页云原生技术社区Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版

Kubernetes 1.17 特性:Kubernetes卷快照移至Beta版

Kubernetes 卷快照功能现在Kubernetes v1.17中处于beta版。它在Kubernetes v1.12中作为Alpha引入,在Kubernetes v1.13中是作为第二个Alpha版,并作了很大的改动。本文总结了beta版本中的变化。

什么是卷快照?

许多存储系统(如GoogleCloud持久磁盘、Amazon弹性块存储和许多本地存储系统)提供了创建持久卷的“快照”的能力。快照,即卷的时间点副本,可用于提供新卷(预填充快照数据)或将现有卷还原到先前状态(由快照数据还原)。

为什么要将卷快照添加到Kubernetes?

Kubernetes卷插件系统已经提供了强大的抽象功能,可以自动配置,附加和安装块和文件存储。

所有这些特性都是为了支持Kubernetes的工作负载可移植性目标:Kubernetes旨在在分布式系统应用程序和基础集群之间创建一个抽象层,以便应用程序可以与它们所运行的集群的具体情况隔离,并且应用程序部署不需要“特定于集群”的知识。

Kubernetes Storage SIG将快照操作确定为许多有状态工作负载的关键功能。例如,数据库管理员可能希望在数据库操作之前对数据库卷进行快照。

通过提供一种在KubernetesAPI中触发快照操作的标准方式,Kubernetes用户现在可以处理这样的用例,而不必使用Kubernetes API(并手动执行存储系统特定的操作)。

Kubernetes用户现在可以使用与群集无关的方式,将快照操作合并到他们的工具和策略中,并轻松知道它将在任意Kubernetes群集生效,而与基础存储无关。

此外,这些Kubernetes快照作为基本的构建块,可释放为Kubernetes开发高级企业级存储管理功能的能力:包括应用程序或集群级备份解决方案。

Beta版有什么新功能?

随着卷快照升级到beta版,该功能现在在标准Kubernetes部署上默认启用,而不是选择性启用。

将Kubernetes卷快照功能移至beta版还意味着:

  • 改进卷快照API。
  • CSI外部快照sidecar分为两个控制器,一个通用快照控制器和一个CSI外部快照sidecar控制器。
  • 删除密钥将作为注释添加到卷快照内容。
  • 将新的终结器添加到卷快照 API对象,以防止在将其绑定到卷快照内容API对象时将其删除。

Kubernetes卷快照要求

如上所述,随着卷快照升级到beta版,该功能现在在标准Kubernetes部署上默认启用,而不是选择性加入。

要使用Kubernetes卷快照功能,必须确保在Kubernetes群集上部署了以下组件:

  • Kubernetes 卷快照 CRDs
  • 卷快照控制器
  • 支持Kubernetes卷快照 beta的CSI驱动程序

哪些驱动程序支持Kubernetes卷快照?

Kubernetes支持三种类型的批量插件:in-tree、Flex和CSI。有关详细信息,请参阅KubernetesVolume Plugin FAQ。

仅CSI驱动程序支持快照(in-tree或Flex不支持)。要使用Kubernetes快照功能,请确保在集群上部署了实现快照的CSI驱动程序。

在发布此博客时,已更新以下CSI驱动程序以支持Beta版的卷快照:

  • GCE永久磁盘CSI驱动程序
  • Portworx CSI驱动程序
  • NetApp Trident CSI驱动程序

其他CSI驱动程序的Beta级别卷快照支持正在挂起,应该很快就会提供。

Kubernetes 卷快照 Beta API

alpha 到 beta 这个阶段对Kubernetes卷快照 API 进行了许多更改。这些更改不向后兼容。更改的目的是使API定义清晰且易于使用。

进行了以下更改:

DeletionPolicy--是VolumeSnapshotClass和VolumeSnapshotContent中的必选字段。这样,用户就必须明确地指定它,不会留下混淆的空间。

VolumeSnapshotSpec-有一个新的必填Source字段。源可以是PersistentVolumeClaimName(如果动态设置快照)或VolumeSnapshotContentName(如果预设置快照)。

VolumeSnapshotContentSpec-还有一个新的必填Source字段。此源可以是VolumeHandle(如果动态设置快照)或SnapshotHandle(如果预设置卷快照)。

VolumeSnapshotStatus-现在包含BoundVolumeSnapshotContentName,以指示VolumeSnapshot对象已绑定到VolumeSnapshotContent。

VolumeSnapshotContentnow-包含一个Status,用于指示内容的当前状态。它有一个字段SnapshotHandle,指示VolumeSnapshotContent表示存储系统上的快照。

Beta版 Kubernetes VolumeSnapshot API对象:

type VolumeSnapshot struct {
        metav1.TypeMeta
        metav1.ObjectMeta

        Spec VolumeSnapshotSpec
        Status *VolumeSnapshotStatus
}
type VolumeSnapshotSpec struct {
	Source VolumeSnapshotSource
	VolumeSnapshotClassName *string
}
// Exactly one of its members MUST be specified
type VolumeSnapshotSource struct {
	// +optional
	PersistentVolumeClaimName *string
	// +optional
	VolumeSnapshotContentName *string
}
type VolumeSnapshotStatus struct {
	BoundVolumeSnapshotContentName *string
	CreationTime *metav1.Time
	ReadyToUse *bool
	RestoreSize *resource.Quantity
	Error *VolumeSnapshotError
}

Beta版 KubernetesVolumeSnapshot 内容API对象:

type VolumeSnapshotContent struct {
        metav1.TypeMeta
        metav1.ObjectMeta

        Spec VolumeSnapshotContentSpec
        Status *VolumeSnapshotContentStatus
}
type VolumeSnapshotContentSpec struct {
         VolumeSnapshotRef core_v1.ObjectReference
         Source VolumeSnapshotContentSource
         DeletionPolicy DeletionPolicy
         Driver string
         VolumeSnapshotClassName *string
}
type VolumeSnapshotContentSource struct {
	// +optional
	VolumeHandle *string
	// +optional
	SnapshotHandle *string
}
type VolumeSnapshotContentStatus struct {
	CreationTime *int64
	ReadyToUse *bool
	RestoreSize *int64
	Error *VolumeSnapshotError
           SnapshotHandle *string
}

Beta版KubernetesVolumeSnapshot Class API对象:

type VolumeSnapshotClass struct {
        metav1.TypeMeta
        metav1.ObjectMeta

        Driver string
        Parameters map[string]string
        DeletionPolicy DeletionPolicy
}

如何在Kubernetes集群上部署对卷快照的支持?

请注意,除了卷快照CRD之外,卷快照功能现在还依赖于新的通用卷快照控制器。卷快照控制器和CRD都独立于任何CSI驱动程序。无论集群上部署了多少CSI驱动程序,每个集群都只能运行一个卷快照控制器实例和一组卷快照 crd。

因此,强烈建议Kubernetes发行商捆绑和部署控制器和CRD,作为其Kubernetes集群管理过程的一部分(独立于任何CSI驱动程序)。

如果集群没有预装正确的组件,可以通过执行以下步骤手动安装这些组件。

安装Beta版 Snapshot CRDs

  • kubectlcreate -f config/crd
  • https://github.com/kubernetes-csi/external-snapshotter/tree/master/config/crd
  • 每个集群执行一次

安装通用Snapshot控制器

  • kubectlcreate -f deploy/kubernetes/snapshot-controller
  • https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/snapshot-controller
  • 每个集群执行一次

安装CSI驱动程序

遵循CSI驱动程序供应商提供的说明。

如何使用Kubernetes卷快照?

假设所有必需的组件(包括CSI驱动程序)都已部署并在集群上运行,则可以使用卷快照 API对象创建卷快照,并通过在PVC上指定卷快照数据源来还原它们。

使用Kubernetes创建新的卷快照

通过创建指向支持卷快照的CSI驱动程序的卷快照Class API对象,可以在Kubernetes集群中启用卷快照的创建/删除。

例如,下面的卷快照Class告诉Kubernetes集群,CSI驱动程序testdriver.csi.k8s.io可以处理卷快照,创建这些Snapshot时,策略应该是删除。

apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshotClass
metadata:
  name:test-snapclass
driver:testdriver.csi.k8s.io
deletionPolicy:Delete
parameters:
  csi.storage.k8s.io/snapshotter-secret-name:mysecret
  csi.storage.k8s.io/snapshotter-secret-namespace:mysecretnamespace

通用Snapshot控制器保留参数键csi.storage.k8s.io/snapshotter-secret-name和csi.storage.k8s.io/snapshotter-secret-namespace。如果指定,它将获取引用的Kubernetes密钥,并将其设置为卷快照内容对象上的注释。CSI外部snapshotter sidecar从内容注释中检索它,并将其在snapshot创建过程中传递给CSI驱动程序。

卷快照的创建由卷快照 API对象的创建触发。

卷快照对象必须指定以下源类型:persistent Volume Claim Name-快照的PVC名称。请注意,卷快照对象的源PVC、PV和Volume SnapshotClass必须指向同一CSI驱动程序。

例如,下面的卷快照使用上面的Volume Snapshot Class触发了一个名为test -PVC的PVC快照创建。

apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshot
metadata:
  name:test-snapshot
spec:
  volumeSnapshotClassName:test-snapclass
  source:
    persistentVolumeClaimName:test-pvc

调用卷快照创建时,通用快照控制器首先创建一个VolumeSnapshotContent对象,其中包含volumeSnapshotRef、source volumeHandle、volumeSnapshotClassName(如果指定)、驱动程序和删除策略。

然后,CSI外部快照sidecar工具通过CSI Create Snapshot调用将VolumeSnapshotClass参数、源卷ID和任何引用的密钥传递给CSI驱动程序(在本例中为testdriver.CSI.k8s.io)。作为响应,CSI驱动程序为指定卷创建一个新快照,并返回该快照的ID。之后,CSI外部快照管理器sidecar会更新代表新快照的Volume Snapshot Content对象的状态字段中的snapshotHandle、creationTime、restoreSize和readyToUse。对于在快照被剪切后需要上载快照的存储系统,CSI外部快照管理器sidecar将继续调用CSI Create Snapshot以检查状态,直到上载完成且readyToUse为真。

如果未指定VolumeSnapshotClassName,则会自动选择一个,如下所示:从源卷的PVC或PV获取StorageClass。如果可用,将获取默认的VolumeSnapshotClass。默认的VolumeSnapshotClass是管理员使用snapshot.storage.kubernetes.io/is-default-class注释创建的快照类。如果默认卷快照类的驱动程序字段与StorageClass中的Provisioner字段相同,则使用默认Volume Snapshot Class。如果快照没有默认的一个或多个VolumeSnapshotClass,则将返回错误。

请注意,Kubernetes快照API不提供任何一致性保证。您必须先准备好应用程序(暂停应用程序、冻结文件系统等),然后再手动或使用其他一些更高级别的API/控制器获取快照以保持数据一致性。

你可以通过运行kubectldescribe volumenapshot来验证是否已创建VolumeSnapshot对象,并与VolumeSnapshotContent绑定。

Bound VolumeSnapshot Content Name -状态中的字段指示该卷已绑定到指定的卷快照内容。 Ready To Use -状态中的字段指示此卷快照已准备好使用。Creation Time -状态中的字段指示实际创建(剪切)快照的时间。Restore Size -状态中的字段指示从该快照还原卷时所需的最小卷大小。

Name:         test-snapshot
Namespace:    default
Labels:       <none>
Annotations:  <none>
API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshot
Metadata:
  Creation Timestamp:  2019-11-16T00:36:04Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshot-as-source-protection
    snapshot.storage.kubernetes.io/volumesnapshot-bound-protection
  Generation:        1
  Resource Version:  1294
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/namespaces/default/volumesnapshots/new-snapshot-demo
  UID:               32ceaa2a-3802-4edd-a808-58c4f1bd7869
Spec:
  Source:
    Persistent Volume Claim Name:  test-pvc
  Volume Snapshot Class Name:      test-snapclass
Status:
  Bound Volume Snapshot Content Name:  snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
  Creation Time:                       2019-11-16T00:36:04Z
  Ready To Use:                        true
  Restore Size:                        1Gi

提醒所有使用卷快照API构建控制器的开发人员:在使用VolumeSnapshot API对象之前,请验证卷快照与其绑定的卷快照内容之间的双向绑定,以确保绑定完整且正确(不这样做可能会导致安全问题)。

kubectl describe volumesnapshotcontent
Name:         snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
Namespace:
Labels:       <none>
Annotations:  <none>
API Version:  snapshot.storage.k8s.io/v1beta1
Kind:         VolumeSnapshotContent
Metadata:
  Creation Timestamp:  2019-11-16T00:36:04Z
  Finalizers:
    snapshot.storage.kubernetes.io/volumesnapshotcontent-bound-protection
  Generation:        1
  Resource Version:  1292
  Self Link:         /apis/snapshot.storage.k8s.io/v1beta1/volumesnapshotcontents/snapcontent-32ceaa2a-3802-4edd-a808-58c4f1bd7869
  UID:               7dfdf22e-0b0c-4b71-9ddf-2f1612ca2aed
Spec:
  Deletion Policy:  Delete
  Driver:           testdriver.csi.k8s.io
  Source:
    Volume Handle:             d1b34a5f-0808-11ea-808a-0242ac110003
  Volume Snapshot Class Name:  test-snapclass
  Volume Snapshot Ref:
    API Version:       snapshot.storage.k8s.io/v1beta1
    Kind:              VolumeSnapshot
    Name:              test-snapshot
    Namespace:         default
    Resource Version:  1286
    UID:               32ceaa2a-3802-4edd-a808-58c4f1bd7869
Status:
  Creation Time:    1573864564608810101
  Ready To Use:     true
  Restore Size:     1073741824
  Snapshot Handle:  127c5798-0809-11ea-808a-0242ac110003
Events:             <none>

用Kubernetes导入现有卷快照

你可以通过手动创建一个卷快照内容对象来表示现有的卷快照,从而在Kubernetes中暴露一个预先存在的卷快照。因为卷快照内容是一个非命名空间API对象,所以只有集群管理员才有权创建它。通过指定volumeSnapshotRef,集群管理员可以确切指定哪些用户可以使用快照。

例如,以下卷快照内容公开了一个名为7bdd0de3-aaeb-11e8-9aae-0242ac110002的卷快照,该卷快照属于名为testdriver.CSI.k8s.io的CSI驱动程序。

集群管理员应该使用以下字段创建卷快照内容对象,表示现有快照:

driver-用于处理该卷的CSI驱动程序。此字段为必填。

source-快照标识信息

snapshotHandle—快照名称/标识符。此字段为必填。

volumeSnapshotRef-指向此内容应绑定到的卷快照对象的指针。

name and namespace-指定内容绑定到的卷快照对象的名称和命名空间。

deletionPolicy-有效值为“删除”和“保留”。如果删除策略为“删除”,则基础存储快照将与卷快照内容对象一起删除。如果删除策略为“保留”,则基础快照和卷快照内容都将保留。

apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshotContent
metadata:
name:manually-created-snapshot-content
spec:
deletionPolicy:Delete
driver:testdriver.csi.k8s.io
source:
snapshotHandle:7bdd0de3-aaeb-11e8-9aae-0242ac110002
volumeSnapshotRef:
name:test-snapshot
namespace:default

创建卷快照内容对象后,用户可以创建指向卷快照内容对象的卷快照对象。卷快照对象的名称和命名空间必须与卷快照内容的volumeSnapshotRef中指定的名称/命名空间匹配。它指定以下字段:volumeSnapshotContentName-上面指定的卷快照内容的名称。此字段必填。volumeSnapshotClassName—卷快照类的名称。此字段是可选的。

apiVersion:snapshot.storage.k8s.io/v1beta1
kind:VolumeSnapshot
metadata:
  name:manually-created-snapshot
spec:
  source:
        volumeSnapshotContentName:test-content

一旦创建了这两个对象,通用快照控制器将验证卷快照和卷快照内容对象之间的绑定是否正确,并将卷快照标记为就绪(如果CSI驱动程序支持卷快照调用,控制器也将验证所引用的快照是否存在)。如果调用了CSI中的 list snapshot方法,CSI外部快照sidecar将检查快照是否存在,否则假定快照已存在。在卷快照内容的状态字段中,外部快照sidecar将readyToUse设置为true。通用快照控制器会相应地将快照标记为就绪。

从快照创建卷

一旦有了绑定的就绪卷快照对象,就可以使用该对象设置一个新卷,新卷预先填充了快照中的数据。

要设置预填充快照数据的新卷,请使用PVC中的dataSource字段。它有三个参数:name-表示要用作源类型的快照的卷快照对象的名称-必须是卷快照 apiGroup-必须是snapshot.storage.k8s.io。

假定源卷快照对象的命名空间与PVC对象的命名空间相同。

apiVersion:v1
kind:PersistentVolumeClaim
metadata:
  name:pvc-restore
  namespace:demo-namespace
spec:
  storageClassName:testdriver.csi.k8s.io
  dataSource:
    name:manually-created-snapshot
    kind:VolumeSnapshot
    apiGroup:snapshot.storage.k8s.io
  accessModes:
    -ReadWriteOnce
  resources:
    requests:
      storage:1Gi

当创建持久卷声明对象时,它将触发一个新卷的设置,该卷预先填充了来自指定快照的数据。作为存储供应商,如何将快照支持添加到CSI驱动程序中?要实现快照功能,CSI驱动程序必须添加对其他控制器功能的支持CREATE_DELETE_snapshot和LIST_snapshot,并实现其他控制器RPC: CreateSnapshot、DeleteSnapshot和ListSnapshots。有关详细信息,请参阅CSI规范和Kubernetes CSI驱动程序开发指南。

尽管Kubernetes对CSI卷驱动程序的打包和部署的规定尽可能少,但它为在Kubernetes上部署任意容器化CSI驱动程序提供了一种建议的机制,以简化与容器化CSI兼容的卷驱动程序的部署。

作为推荐部署过程的一部分,Kubernetes团队提供了许多sidecar(辅助)容器,包括外部快照sidecar容器。

外部快照程序监视KubernetesAPI服务器上的卷快照内容对象,并针对CSI终结点触发CreateSnapshot和DeleteSnapshot操作。CSI外部供应程序sidecar容器也已更新,以支持使用新的数据源 PVC字段从快照恢复卷。

为了支持快照特性,建议存储供应商除了部署外部供应程序外,还将外部快照sidecar容器及其CSI驱动程序部署到一个状态集中,如下图所示。

Beta版有什么限制?

Kubernetes卷快照的beta版实现有以下限制:

  • 不支持将现有卷还原为快照所表示的较早状态(Beta只支持从快照提供新卷)。
  • 快照一致性保证不能超出存储系统提供的任何保证(例如崩溃一致性)。这些是高级API /控制器的职责。

接下来做什么?

根据反馈和采用情况,Kubernetes团队计划在1.18或1.19版本中将CSI快照实现推送到GA。我们希望支持的某些特性包括一致性组、应用程序一致性快照、工作负载静止、就地恢复、卷备份等。

参考文档:

https://kubernetes.io/blog/page/2/

作者:XingYang (VMware)、Xiangqian Yu (Google)

本文分享自微信公众号 - 云原生技术社区(cloudnative_pro),作者:小灵

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-12-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Kubernetes v1.17正式发布,22个增强功能,4个Beta版,2019年最后一次发布!

    我们很高兴宣布Kubernetes 1.17的交付,这是2019年的第四次,也是最后一次发布!Kubernetes v1.17包含22个增强功能:14个增强功能...

    灵雀云
  • Kubernetes 1.14发布重大功能更新,支持Windows节点的云原生平台

    3月25日,开源Kubernetes云原生平台1.14版本正式亮相,这也是Kubernetes在2019年的首次发布。按照Kubernetes的发布节奏,Ku...

    灵雀云
  • 一文看懂Kubernetes v1.16!

    9月18日,Kubernetes v1.16重磅发布!这是2019年以来发布的第三个版本! Kubernetes 1.16包含31个增强功能:8个增强趋于稳定,...

    灵雀云
  • linux-创建/使用快照/克隆(类似windows中备份还原)

    小小咸鱼YwY
  • 快照是什么?揭秘存储快照的实现

    存储网络行业协会SNIA(StorageNetworking Industry Association)快照的定义:关于指定数据集合的一个完全可用拷贝,该拷贝包...

    BH8ANK
  • 创建快照操作文档

    前言:快照是腾讯云提供的一种数据备份方式,通过在指定时间点对指定云硬盘进行完全可用的拷贝,使该备份独立于云硬盘的生命周期。在某些变更导致数据错误或数据丢失时,可...

    cdc
  • 工程师笔记 | 为什么说SC系列存储的快照是性能无损的?

    作为最常用的本地数据保护手段,快照已经成为企业级存储阵列上的必备功能之一,主要用于在线数据备份与恢复,可防范逻辑故障风险,比如病毒攻击、文件格式损坏、系统崩溃以...

    用户6543014
  • 云快照的2种存储机制

    云计算是庞大的IT技术的结合,例如我们经常在云主机ECS中使用的快照功能,仔细研究起来,每一个功能实现都沉淀着“攻城狮的智慧”。今天我们来看一下云快照的两种不同...

    希望的田野
  • Git命令集十三——快照操作 原

        Git工具中提供了一个stash命令,这个命令的作用是创建快照。快照主要的用途是将当前未更新到缓存区的修改进行入栈保存,创建快照后,Git的状态会变回上...

    珲少
  • Stream 分布式数据流的轻量级异步快照

    分布式有状态流处理支持在云中部署和执行大规模连续计算,主要针对低延迟和高吞吐量。这种模式的一个最根本的挑战就是在可能的失败情况下提供处理保证。现有方法依赖于可用...

    smartsi

扫码关注云+社区

领取腾讯云代金券