Kasten Kanister Blueprints 详解

本文重要章节

Kasten Kanister Blueprints 详解
1.Kubernetes 原生备份
2.Kanister vs K10
3.Kasten Kanister blurpint 核心概念
3.1 Kanister blurpint 动作集
3.2 Kanister blurpint 核心元素
4.Kasten Kanister Blueprint 备份最佳实践
4.1 Kasten K10 安装
4.2 访问 K10 的仪表盘
4.3 配置数据应用的存储类
4.4 配置 MinIO 对象存储
4.5 在 K10 中配置 Location Profile 备份存储库
4.6 安装 MySQL 建立 Demo 数据库
4.7 在 Mysql 应用中定义 Blueprint 以实现逻辑备份
4.8 创建与运行 K10 备份策略
4.9 模拟灾难 删除 MySQL 数据
4.10 恢复 Mysql 数据
4.11 验证 Mysql 数据恢复效果
5.总结
6.参考链接

1.Kubernetes 原生备份

Kubernetes 作为最快增长的基础架构平台,正在迅速成为所有应用程序的基础,它的部署方式非常灵活,从物理到虚拟再到云都可以适配,这使其成为下一个企业平台的首选。,可以说 Kubernetes 已经成为企业的核心基础架构。

20230601100914

Kubernetes 原生应用的备份是以 Kubernetes 作为基础架构的企业面临的关键问题之一。Kubernetes 平台与以往所有的计算基础架构有着本质的不同,它使用独特的放置与部署策略来在所有服务器上分布应用程序组件,以实现容错和性能。因此,不同应用程序的部署位置可能位于集群的任何地方。此外,云原生环境的动态性也很重要,即容器可以在不同节点上动态重新调度或缩扩容,以实现更好的负载平衡。时时刻刻发生的新部署可能涉及滚动升级,并且新的应用程序组件可以随时添加或删除。简而言之,云原生应用程序的定义不断变化。数据管理解决方案需要了解这种云原生架构模式,能够处理缺乏IP地址稳定性的情况,并能够处理持续的变化。

专为 Kubernetes 而建的 Kasten K10 为企业运维团队提供了一个易于使用、可扩展的应用与数据安全的保护系统,用于 Kubernetes 应用程序的备份/恢复、灾难恢复和迁移等。

2.Kanister vs K10

对于有状态的云原生应用,数据操作通常需要由具有对数据语义理解的工具来执行,其实现效果就是使用数据厂家的原生工具,来执行数据操作,以保证数据的一致性。而在云原生平台有状态的应用。借用是来自于 Dynatrace 的报告 Kubernetes in the wild report 2023 从报告中可以发现,以数据库和数据服务的增长非常快速的。

20230601101453

而 Kubernetes 编排器提供的卷级备份,不足以支持像复杂的分布式数据库的备份/恢复等数据工作流。K10 支持多种社区数据库,包括 MySQL、PostgreSQL、MongoDB 和 Cassandra 等。

为了弥合这些应用程序的操作要求和 Kubernetes 之间的差距,开源项目 Kanister 应运而生。Kanister 是一个框架,用于支持 Kubernetes 中的应用程序级数据管理。它允许开发人员定义工具和应用程序之间的关系,然后使在 Kubernetes 中运行这些工具变得简单。

Kasten 的 K10 平台使用 Kanister 提供的 Kubernetes 自定义资源进行数据管理。这使数据服务领域专家能够在蓝图(Blueprint)中捕获特定于应用程序的数据管理任务,如 数据的备份、恢复、删除,这些任务可以轻松共享和扩展。该框架负责处理在 Kubernetes 上执行的繁琐细节,并在应用程序规模上呈现均匀的操作体验。此外,它为用户提供了一种自然的框架机制,通过添加个人代码来修改执行数据生命周期管理的任何所需步骤,从而扩展 K10 平台。

3.Kasten Kanister blurpint 核心概念

3.1 Kanister blurpint 动作集

数据处理动作(Actions) API 资源是用于启动 Kasten K10 数据管理操作的。这些操作可以与备份策略(Policy)相关联,也可以作为独立的按需操作。操作还允许跟踪所请求操作的执行状态。

Kasten K10平台公开了许多不同的操作类型。

BackupAction
备份操作用于启动应用程序的备份处理过程。备份操作可以作为策略的一部分或作为独立操作提交。

RestoreAction
还原操作用于从还原点将应用程序还原到已知的良好状态。

ExportAction
导出操作用于使用现有还原点将应用程序导出到外部数据存储,例如 S3 兼容的对象存储。

BackupClusterAction
备份集群操作用于启动集群范围资源的备份操作。备份集群操作可以作为策略的一部分或作为独立操作提交。

RestoreClusterAction
还原集群操作用于从 ClusterRestorePoint 还原集群范围资源。还原集群操作可以作为策略的一部分或作为独立操作提交。

RunAction
RunActions 用于手动执行和监视与策略运行相关的操作。

CancelAction
CancelActions 用于停止另一个操作的进度并防止任何剩余的重试。取消是最佳尝试,不是每个操作的每个阶段都可以取消。当操作被取消时,其状态变为已取消。

ReportAction
创建 ReportAction 资源以生成 K10 报告并提供有关系统性能和状态的见解。成功的ReportAction会产生一个K10报告,其中包含在ReportAction时收集的信息。

Kasten Action 定义
https://docs.kasten.io/latest/api/actions.html

3.2 Kanister blurpint 核心元素

Policies - 策略

策略用于自动化数据管理工作流程。策略自定义资源(CR)用于执行 K10 策略的操作。K10 策略允许您在规模上管理应用程序保护和迁移。

K10策略的信息
https://docs.kasten.io/latest/usage/protect.html#protect

Policy Scheduling - 策略时间表

在策略API类型中,K10可控制以下内容:

  • 主快照或导入操作应执行的频率
  • 快照应导出到备份的频率
  • 要保留哪些和多少个快照和备份
  • 主快照或导入操作应在何时执行

Profiles - 备份存储库配置

用于从快照创建备份,将应用程序及其数据在不同集群之间或不同云之间移动,并随后将这些备份或导出导入到另一个集群中。为了启用跨任何一个集群的生命周期的这些操作,需要配置 K10 以访问外部对象存储或外部 NFS 文件存储。这是通过创建

备份存储库配置文件
https://docs.kasten.io/latest/usage/configuration.html#location-profiles

Profile 备份存储库配置,在 K8S 中属于客户自定义资源(CR)用于对 K10 Profiles 执行操作。您可以在备份存储库配置中完成,您可以通过以下的 K10 Profiles 文档了解更多信息。

备份存储库配置
https://docs.kasten.io/latest/usage/configuration.html#k10-config

Kanister-Enabled Applications

在捕获数据服务时,K10 默认使用卷快照操作,但有些情况下需要进行定制。例如,保护应用程序数据的最佳方法可能是对数据库进行逻辑转储。这需要使用特定于该数据库的工具。

Kanister 使用 蓝图 Blueprint 来定义这些特定于数据库的工作流程,并且为多个流行应用程序提供开源蓝图。同时,也可以轻松定制现有的蓝图或添加新的蓝图。
当配置为这样做时,K10 将自动使用 Kanister 蓝图并管理生成的应用程序级别的 Kanister Artifect。

Kanister 开源的蓝图开以从以下 Github 站点中找到。

在 Github 上的 Kanister 开源的蓝图
https://github.com/kanisterio/kanister/tree/master/examples

插入 Kanister 蓝图

若要请求 K10 使用自定义 Kanister Blueprint 来管理工作负载(例如 Deployment 或 StatefulSet ),请按照以下步骤:
(1)在 K10 Namespace ,默认为 kasten-io 中创建 Blueprint
(2)使用已创建的 Blueprint 的名称注释工作负载,如下所示:

$ kubectl --namespace=<app-namespace> annotate <workload>/<workload-name> \
    kanister.kasten.io/blueprint=<blueprint-name>

最后,请注意所使用的 Blueprint 必须定义了 backup 和 restore 等操作,并最好也定义了 delete 操作以便进行数据清理与退役操作。

使用测试用例

安装应用程序后,您将能够使用 K10 仪表板 通过创建一个或多个策略来使应用程序符合规定并保护它。您还可以随后将应用程序及其数据恢复到之前的版本。您可以在本文档的 保护应用程序 和 恢复应用程序 部分中找到更详细的说明。

静默应用

静默是指暂停或更改设备或应用程序以达到一致状态,通常是为了备份或其他维护而进行。如果需要在卷快照启动之前使数据服务静默,则可以启用应用程序一致的备份。

为了获得应用程序一致的备份,首先调用应用程序蓝图中定义的 quiescing function,然后进行卷快照。

为了缩短应用程序暂停的时间,一旦存储系统表明已经开始对底层卷进行时点拷贝,就根据蓝图定义unquiesced。备份将在卷快照完成后异步完成,换句话说,在 unquiescing 应用程序后,K10 等待快照完成。这种方法的优点是在整个卷快照过程中不会锁定数据库。

4.Kasten Kanister Blueprint 备份最佳实践

4.1 Kasten K10 安装

安装 Kasten K10, 安装 Kasten K10 的文章很多,并不是本文的重点,如果希望更多的了解 Kasten K10 的安装,请关注以往的文章。

$ helm install k10 kasten/k10 --namespace=kasten-io --create-namespace
NAME: k10
LAST DEPLOYED: Sat May 13 00:14:07 2023
NAMESPACE: kasten-io
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Thank you for installing Kasten’s K10 Data Management Platform 5.5.10!

Documentation can be found at https://docs.kasten.io/.

How to access the K10 Dashboard:

To establish a connection to it use the following `kubectl` command:

`kubectl --namespace kasten-io port-forward service/gateway 8080:8000`

The Kasten dashboard will be available at: `http://127.0.0.1:8080/k10/#/`

为了保证 Kasten K10 已经正常的运行起来,我们在这里用 watch命令每 2 秒检查一次每个 Pod 的运行状态,直至所有的 Pod 都已经达到 Running 的状态

$ watch -n 2 "kubectl -n kasten-io get pods"
Every 2.0s: kubectl -n kasten-io get pods                         kubernetes: Sat May 13 00:16:55 2023

NAME                                    READY   STATUS    RESTARTS   AGE
aggregatedapis-svc-7644455fbf-szrmc     1/1     Running   0          2m46s
auth-svc-7ff97f77fb-rx2sd               1/1     Running   0          2m46s
catalog-svc-778544bf69-zdsl6            2/2     Running   0          2m45s
controllermanager-svc-cdc99b667-hkt2n   1/1     Running   0          2m47s
crypto-svc-c4fddb596-t55kl              4/4     Running   0          2m46s
dashboardbff-svc-b4b59cf49-985tg        2/2     Running   0          2m46s
executor-svc-7b59bb5597-5nglj           2/2     Running   0          2m45s
executor-svc-7b59bb5597-l9lmg           2/2     Running   0          2m45s
executor-svc-7b59bb5597-xj69k           2/2     Running   0          2m46s
frontend-svc-56cb4f756c-4jnpx           1/1     Running   0          2m46s
gateway-594c5c8966-s2fgx                1/1     Running   0          2m47s
jobs-svc-65fd8dc85-xwdvs                1/1     Running   0          2m46s
k10-grafana-59cd57f6fc-8lfgb            1/1     Running   0          2m47s
kanister-svc-569d9448b4-rnzrh           1/1     Running   0          2m46s
logging-svc-548c678d7b-vdvhk            1/1     Running   0          2m45s
metering-svc-5c664859d5-fh95f           1/1     Running   0          2m46s
prometheus-server-6884f544d-659lh       2/2     Running   0          2m47s
state-svc-7774c468b6-76266              2/2     Running   0          2m46s

一旦我们确定所有的 Pod 都已经达到运行的状态,我们可以按 CTRL + C 退出 watch

4.2 访问 K10 的仪表盘

我们通过以下命令,创建 NodePort 通过这个方法,使 K10 的仪表盘暴露出来,以供用户在图形界面上操作。

首先,我们来撰写 nodeport 的 yaml 文件。

cat > k10-nodeport-svc.yaml << EOF
apiVersion: v1
kind: Service
metadata:
  name: gateway-nodeport
  namespace: kasten-io
spec:
  selector:
    service: gateway
  ports:
  - name: http
    port: 8000
    nodePort: 32000
  type: NodePort
EOF

然后,通过这个 yaml 文件我们来创建 NodePort 服务。

$ kubectl apply -f k10-nodeport-svc.yaml
service/gateway-nodeport created

$ kubectl get svc -n kasten-io
NAME                    TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                               AGE
aggregatedapis-svc      ClusterIP   10.96.201.26    <none>        443/TCP                               6m36s
auth-svc                ClusterIP   10.96.251.83    <none>        8000/TCP                              6m36s
catalog-svc             ClusterIP   10.96.192.220   <none>        8000/TCP                              6m36s
controllermanager-svc   ClusterIP   10.96.99.78     <none>        8000/TCP,18000/TCP                    6m36s
crypto-svc              ClusterIP   10.96.187.71    <none>        8000/TCP,8003/TCP,8001/TCP,8002/TCP   6m36s
dashboardbff-svc        ClusterIP   10.96.253.141   <none>        8000/TCP,8001/TCP                     6m36s
executor-svc            ClusterIP   10.96.118.49    <none>        8000/TCP                              6m36s
frontend-svc            ClusterIP   10.96.139.164   <none>        8000/TCP                              6m36s
gateway                 ClusterIP   10.96.158.239   <none>        8000/TCP                              6m36s
gateway-admin           ClusterIP   10.96.166.35    <none>        8877/TCP                              6m36s
gateway-nodeport        NodePort    10.96.34.25     <none>        8000:32000/TCP                        33s
jobs-svc                ClusterIP   10.96.141.248   <none>        8000/TCP                              6m36s
k10-grafana             ClusterIP   10.96.144.85    <none>        80/TCP                                6m36s
kanister-svc            ClusterIP   10.96.117.135   <none>        8000/TCP                              6m36s
logging-svc             ClusterIP   10.96.214.208   <none>        8000/TCP,24224/TCP,24225/TCP          6m36s
metering-svc            ClusterIP   10.96.206.50    <none>        8000/TCP                              6m36s
prometheus-server       ClusterIP   10.96.50.196    <none>        80/TCP                                6m36s
prometheus-server-exp   ClusterIP   10.96.168.237   <none>        80/TCP                                6m36s
state-svc               ClusterIP   10.96.76.63     <none>        8000/TCP,8001/TCP                     6m36s

这样, 我们通过 NodePort:32000/#/k10 就可以查看 K10 的 Dashboard 了。

4.3 配置数据应用的存储类

K10 部署完毕开始运行后,用以下的命令配置应用程序使用的存储快照类,使 K10 可以方便利用存储级别的快照进行保护

$ kubectl annotate volumesnapshotclass csi-hostpath-snapclass k10.kasten.io/is-snapshot-class=true
volumesnapshotclass.snapshot.storage.k8s.io/csi-hostpath-snapclass annotated

4.4 配置 MinIO 对象存储

在本次最佳实践的步骤中,我将利用 MinIO 对象存储来搭建备份存储库,并用它来进行备份数据的存储。

MinIO是一个高性能的对象存储解决方案, 遵从 Apache License v2.0 的使用规则. 它的 API 与 Amazon S3 云存储高度一致。

创建 MinIO 的 namespace

$ kubectl create namespace minio
$ kubectl get ns 
NAME                 STATUS   AGE
default              Active   92d
kasten-io            Active   8m57s
kube-node-lease      Active   92d
kube-public          Active   92d
kube-system          Active   92d
local-path-storage   Active   92d
minio                Active   25s

配置 MinIO Helm repo

$ helm repo add minio https://helm.min.io
$ helm repo list
NAME    URL                      
kasten  https://charts.kasten.io/
minio   https://helm.min.io

安装 MinIO Chart

$ helm install minio minio/minio --namespace=minio --version=8.0.0 --set accessKey="AKIAIOSFODNN7EXAMPLE",secretKey="wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY",defaultBucket.enabled=true,defaultBucket.name=kanister --wait --timeout 5m

NAME: minio
LAST DEPLOYED: Sat May 13 00:33:22 2023
NAMESPACE: minio
STATUS: deployed
REVISION: 1
TEST SUITE: None
NOTES:
Minio can be accessed via port 9000 on the following DNS name from within your cluster:
minio.minio.svc.cluster.local

To access Minio from localhost, run the below commands:

  1. export POD_NAME=$(kubectl get pods --namespace minio -l "release=minio" -o jsonpath="{.items[0].metadata.name}")

  2. kubectl port-forward $POD_NAME 9000 --namespace minio

Read more about port forwarding here: http://kubernetes.io/docs/user-guide/kubectl/kubectl_port-forward/

You can now access Minio server on http://localhost:9000. Follow the below steps to connect to Minio server with mc client:

  1. Download the Minio mc client - https://docs.minio.io/docs/minio-client-quickstart-guide

  2. Get the ACCESS_KEY=$(kubectl get secret minio -o jsonpath="{.data.accesskey}" | base64 --decode) and the SECRET_KEY=$(kubectl get secret minio -o jsonpath="{.data.secretkey}" | base64 --decode)

        3. mc alias set minio-local http://<External-IP>:9000 "$ACCESS_KEY" "$SECRET_KEY" --api s3v4

  4. mc ls minio-local

Alternately, you can use your browser or the Minio SDK to access the server - https://docs.minio.io/categories/17

4.5 在 K10 中配置 Location Profile 备份存储库

接下来,我们将在 K10 仪表盘中配置 Location Profile。

  • 点击 K10 Dashboard
  • 点击 Settings
  • 点击 Locations
  • 点击 New Profile
  • 输入 profile 名称 k10
  • 选择 S3 Compatible
  • 填入如下信息

20230531114039

当这个 Location Profile 创建完成时,点击 Check 以确保它的成功。

20230531114421

4.6 安装 MySQL 建立 Demo 数据库

为了体验云原生数据库的备份与恢复,我们安装 MySQL并建立数据库。

首先, 使用如下命令安装 MySQL

$ kubectl create namespace mysql
$ helm install mysql bitnami/mysql --namespace=mysql

为了保证 MySQL 已经正常的运行起来,我们在这里用 watch命令每 2 秒检查一次每个 Pod 的运行状态,直至所有的 Pod 都已经达到 Running 的状态

$ watch -n 2 "kubectl -n mysql get pods"
Every 2.0s: kubectl -n mysql get pods                            kubernetes: Sat May 13 00:30:59 2023
NAME      READY   STATUS    RESTARTS   AGE
mysql-0   1/1     Running   0          66s

一旦我们确定所有的 Pod 都已经达到运行的状态,我们可以按 CTRL + C 退出 watch ,然后运行如下命令,以创建数据库。

$ MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)

$ kubectl exec -it --namespace=mysql $(kubectl --namespace=mysql get pods -o jsonpath='{.items[0].metadata.name}') \
  -- env MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql -u root -e "CREATE DATABASE k10demo"

4.7 在 Mysql 应用中定义 Blueprint 以实现逻辑备份

以下命令将安装 MySQL Blueprint 在 K10 的 namespace 并在 MySQL 的 Deployment 中加上 annotation, 以使 K10 使用 Blueprint 中 定义的 ActionSet 来完成对数据的备份。

$ kubectl --namespace mysql annotate statefulset/mysql \
    kanister.kasten.io/blueprint=mysql-blueprint
statefulset.apps/mysql annotated

4.8 创建与运行 K10 备份策略

我们将创建 Policy 来对 MySQL 进行备份,并将备份的数据集传送了之前创建的对象存储 MinIO 中。
登录 K10 仪表盘, 点击 Policies.

点击 Create New Policy:

  • 输入 Policy 名称: mysql-backup
  • Action 处,选择 Snapshot 
  • 在 Action Frequency 处,选择 Hourly 
  • 选择 By Name for Select Applications 然后, 选择 mysql
  • 选择 Location Profile k10
  • 点击 Create Policy

运行策略
以上策略会在预定时间运行。首先我们要手动运行策略第一次,点击策略页面上的 “Run Once”。,然后返回主仪表板以查看作业运行情况。请验证作业已成功完成。

20230531120353

此时上我们 点击 “View Action YAML” 查看并理解一下这个 BackupAction

kind: BackupAction
apiVersion: actions.kio.kasten.io/v1alpha1
metadata:
  name: scheduled-4fvcv
  namespace: mysql
  uid: c0a78908-f126-11ed-b0a8-deea831af3eb
  resourceVersion: "41"
  creationTimestamp: 2023-05-13T00:40:26Z
  labels:
    k10.kasten.io/appName: mysql
    k10.kasten.io/appNamespace: mysql
    k10.kasten.io/isRunNow: "true"
    k10.kasten.io/policyName: mysql-backup
    k10.kasten.io/policyNamespace: kasten-io
    k10.kasten.io/runActionName: policy-run-95447
status:
  state: Complete
  startTime: 2023-05-13T00:40:26Z
  endTime: 2023-05-13T00:41:05Z
  restorePoint:
    name: scheduled-4fvcv
    namespace: mysql
  result:
    name: ""
  progress: 100
spec:
  subject:
    name: mysql
    namespace: mysql
  scheduledTime: 2023-05-13T00:40:25Z
  filters: {}
  profile:
    name: k10
    namespace: kasten-io

通过查看 Restore Point 我们来确认已经建立了还原点

20230531120829

4.9 模拟灾难 删除 MySQL 数据

$ MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
$ kubectl exec -it --namespace=mysql $(kubectl --namespace=mysql get pods -o jsonpath='{.items[0].metadata.name}') -- env MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql -u root -e "SHOW DATABASES;"

+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mysql              |
| performance_schema |
| sys                |
| k10demo            |
+--------------------+
6 rows in set (0.00 sec)

$ kubectl exec -it --namespace=mysql $(kubectl --namespace=mysql get pods -o jsonpath='{.items[0].metadata.name}') -- env MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql -u root -e "DROP DATABASE k10demo;"

$ kubectl exec -it --namespace=mysql $(kubectl --namespace=mysql get pods -o jsonpath='{.items[0].metadata.name}') -- env MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql -u root -e "SHOW DATABASES;"

+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

4.10 恢复 Mysql 数据

要恢复 Mysql 数据库,我们登录到 K10 控制台,单击 Applications,然后在MySQL卡上选择 Restore

还原点按计划执行时间显示和排序。选择我们刚刚创建的还原点。选择默认的Application Name选项以还原到原始的 Namespace。保留其它可选项不变,单击 Restore并确认操作。

20230531122609

让我们观察 Activity 确认还原任务已经完成。

20230531122937

此时上我们 点击 “View Action YAML” 查看并理解一下这个 RestoreAction

kind: RestoreAction
apiVersion: actions.kio.kasten.io/v1alpha1
metadata:
  name: mysql-m9gd9
  namespace: mysql
  uid: f9dab81d-f127-11ed-b0a8-deea831af3eb
  resourceVersion: "47"
  creationTimestamp: 2023-05-13T00:49:11Z
  labels:
    k10.kasten.io/appName: mysql
    k10.kasten.io/appNamespace: mysql
status:
  state: Complete
  startTime: 2023-05-13T00:49:11Z
  endTime: 2023-05-13T00:50:02Z
  restorePoint:
    name: ""
  result:
    name: ""
  actionDetails:
    phases:
      - attempt: 1
        endTime: 2023-05-13T00:50:02Z
        name: Restoring Application Components
        startTime: 2023-05-13T00:49:15Z
        state: succeeded
        updatedTime: 2023-05-13T00:50:02Z
  progress: 100
spec:
  subject:
    apiVersion: apps.kio.kasten.io/v1alpha1
    kind: RestorePoint
    name: scheduled-4fvcv
    namespace: mysql
  targetNamespace: mysql

4.11 验证 Mysql 数据恢复效果

要验证我们的数据已恢复,请在终端中运行以下命令以查看已恢复的数据库:

$ MYSQL_ROOT_PASSWORD=$(kubectl get secret --namespace mysql mysql -o jsonpath="{.data.mysql-root-password}" | base64 --decode; echo)
$ kubectl exec -it --namespace=mysql $(kubectl --namespace=mysql get pods -o jsonpath='{.items[0].metadata.name}') -- env MYSQL_PWD=$MYSQL_ROOT_PASSWORD mysql -u root -e "SHOW DATABASES;"

+--------------------+
| Database           |
+--------------------+
| information_schema |
| my_database        |
| mysql              |
| performance_schema |
| sys                |
| k10demo            |
+--------------------+
6 rows in set (0.00 sec)

5.总结

Kubernetes 已经成为有效部署应用程序和微服务的首选平台,而有状态应用的备份已经成为 Kubernetes 运维过程中不可或缺的重要组成部分。Kanister 的能力可以帮助集群管理员集中管理 Kubernetes 资源,并自动部署应用的备份并执行数据管理操作,使运维更加简单。在本文中,学习了有关 Kanister Blueprint 的知识,我们鼓励您亲自下载软件并试用,快来试一试吧!

6.参考链接

Kasten 官方文档
https://docs.kasten.io/latest/
Kanister 官方文档
https://docs.kanister.io/
Kasten k10 实战系列 07 - Kanister 应用感知框架的使用
https://www.data2clouds.com/?p=77
B站视频-使用 Kanister 为你的云原生应用数据保驾护航
https://www.bilibili.com/video/BV19b4y1H7pa/?vd_source=057f1951cfaa4472f2abecc567d773f9
在 Github 上的 Kanister 开源的蓝图
https://github.com/kanisterio/kanister/tree/master/examples