{"id":50578,"date":"2023-01-22T18:39:02","date_gmt":"2022-12-09T22:32:32","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/"},"modified":"2024-04-29T10:55:28","modified_gmt":"2024-04-29T02:55:28","slug":"%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/","title":{"rendered":"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u5728\u672c\u9a8c\u8bc1\u4e2d\uff0c\u6211\u4eec\u5c06\u8fdb\u884cKubernetes Native\u5907\u4efd\u5de5\u5177Kanister\u7684\u64cd\u4f5c\u9a8c\u8bc1\u3002<br \/>\nKanister\u662f\u57fa\u4e8eVeeam\u516c\u53f8\u7684Kasten(K10)\u5f00\u53d1\u7684\u5f00\u6e90\u8f6f\u4ef6\u3002Kanister\u53ef\u4ee5\u5c06\u5728Kubernetes\u4e0a\u8fd0\u884c\u7684\u5e94\u7528\u7a0b\u5e8f\u7684\u6570\u636e\u5907\u4efd\u5230\u5bf9\u8c61\u5b58\u50a8\u4e2d\u3002<br \/>\nKanister\u7684\u7279\u70b9\u4e4b\u4e00\u662f\u4ee5\u5e94\u7528\u7a0b\u5e8f\u4e3a\u4e2d\u5fc3\uff0c\u56e0\u6b64\u4e3a\u6bcf\u4e2a\u5e94\u7528\u7a0b\u5e8f\u51c6\u5907\u4e86\u6a21\u677f(Blueprint)\u3002\u6a21\u677f\u4e2d\u5305\u542b\u4e86\u6bcf\u4e2a\u5e94\u7528\u7a0b\u5e8f\u5907\u4efd\u7684\u524d\u671f\u51c6\u5907\u548c\u540e\u671f\u5904\u7406\u7b49\u64cd\u4f5c\uff0c\u56e0\u6b64\u53ef\u4ee5\u4e3a\u5e94\u7528\u7a0b\u5e8f\u63d0\u4f9b\u53cb\u597d\u7684\u5907\u4efd\u670d\u52a1\u3002<br \/>\n\u622a\u81f32020\u5e7412\u6708\uff0c\u5df2\u7ecf\u4e3a\u4ee5\u4e0b\u5e94\u7528\u7a0b\u5e8f\u51c6\u5907\u4e86\u6a21\u677f\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Cassandra<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Couchbase<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Elasticsearch<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">FoundationDB<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MongoDB<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL on OpenShift using DeploymentConfig<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">MySQL<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">PostgreSQL with Point In Time Recovery (PITR)<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">ETCD<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">PostgreSQL<\/ul>\n<h1>\u6821\u9a8c\u73af\u5883<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">minikube<\/ul>\n<\/li>\n<\/ul>\n<p>Kubernetes v1.19.4<\/p>\n<p>MinIO RELEASE.2020-12-10T01-54-29Z<br \/>\nMySQL 5.7<br \/>\nKanister 0.44.0<\/p>\n<h1>\u4e8b\u524d\u7b79\u5907<\/h1>\n<p>\u4f5c\u4e3a\u4e8b\u524d\u51c6\u5907\uff0c\u6211\u4eec\u5c06\u51c6\u5907\u7528\u4e8e\u5b58\u50a8\u5907\u4efd\u6570\u636e\u7684\u5bf9\u8c61\u5b58\u50a8\uff08MinIO\uff09\u548c\u5907\u4efd\u76ee\u6807 MySQL\u3002<\/p>\n<h2>MinIO\u7684\u5b89\u88c5\u3002<\/h2>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u5e76\u5207\u6362\u5230MinIO\u7684\u540d\u79f0\u7a7a\u95f4\uff08minio\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl create ns minio\r\n$ kubens minio\r\n<\/code><\/pre>\n<p>\u4e0b\u9762\u5c06\u4f7f\u7528Manifest\uff08minio.yaml\uff09\u6765\u8bbe\u7f6eMinIO\u3002<\/p>\n<ul class=\"post-ul\">minio.yaml<\/ul>\n<pre class=\"post-pre\"><code><span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">9000<\/span>\r\n    <span class=\"na\">targetPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">9000<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n<span class=\"nn\">---<\/span>\r\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">PersistentVolumeClaim<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio-pvc<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">accessModes<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">ReadWriteOnce<\/span>\r\n  <span class=\"na\">resources<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">requests<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">storage<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1Gi<\/span>\r\n<span class=\"nn\">---<\/span>\r\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">StatefulSet<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">serviceName<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">minio\"<\/span>\r\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"m\">1<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">data<\/span>\r\n        <span class=\"na\">persistentVolumeClaim<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">claimName<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio-pvc<\/span>\r\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio<\/span>\r\n        <span class=\"na\">volumeMounts<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">data<\/span> \r\n          <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">\/data\"<\/span>\r\n        <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">minio\/minio:RELEASE.2020-12-10T01-54-29Z<\/span>\r\n        <span class=\"na\">args<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">server<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"s\">\/data<\/span>\r\n        <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">MINIO_ACCESS_KEY<\/span>\r\n          <span class=\"na\">value<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">minio\"<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">MINIO_SECRET_KEY<\/span>\r\n          <span class=\"na\">value<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">minio123\"<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">9000<\/span>\r\n          <span class=\"na\">hostPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">9000<\/span>\r\n<\/code><\/pre>\n<p>\u90e8\u7f72minio.yaml\uff0c\u5e76\u786e\u8ba4MinIO\u7684\u542f\u52a8\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl apply -f minio.yaml\r\n\r\n$ kubectl get svc,pod,pvc,pv\r\nNAME            TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE\r\nservice\/minio   ClusterIP   10.106.197.201   &lt;none&gt;        9000\/TCP   2m57s\r\n\r\nNAME          READY   STATUS    RESTARTS   AGE\r\npod\/minio-0   1\/1     Running   0          2m57s\r\n\r\nNAME                              STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE\r\npersistentvolumeclaim\/minio-pvc   Bound    pvc-f1016d2e-2fc5-48a0-befb-8a7304281b16   1Gi        RWO            standard       2m57s\r\n\r\nNAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM             STORAGECLASS   REASON   AGE\r\npersistentvolume\/pvc-f1016d2e-2fc5-48a0-befb-8a7304281b16   1Gi        RWO            Delete           Bound    minio\/minio-pvc   standard                2m57s\r\n<\/code><\/pre>\n<p>\u5b8c\u6210Portward\u4e4b\u540e\uff0c\u5c1d\u8bd5\u8bbf\u95eeMinIO\u7684WebUI\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl port-forward -n minio svc\/minio 9000:9000 &amp;\r\n<\/code><\/pre>\n<p>\u4f7f\u7528\u6d4f\u89c8\u5668\u8bbf\u95eeURL(http:\/\/localhost:9000)\u3002<br \/>\n\u80fd\u591f\u4f7f\u7528AccessKey(minio)\u548cSecret Key(mino123)\u8bbf\u95ee\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/18-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-12-12 14.19.22.png\" \/><\/div>\n<p>\u6211\u4f1a\u51c6\u5907\u4e00\u4e2a\u7528\u4e8e\u6b64\u9a8c\u8bc1\u7684Bucket\u3002<br \/>\n\u70b9\u51fbWebUI\u53f3\u4e0b\u89d2\u7684&#8221;+&#8221;\uff0c\u9009\u62e9\u521b\u5efaBucket\uff0c\u7136\u540e\u5728Bucket\u540d\u79f0\u4e2d\u8f93\u5165&#8221;kanister&#8221;\u6765\u521b\u5efaBucket\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/20-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-12-12 14.21.20.png\" \/><\/div>\n<p>\u4ee5\u4e0a\u662fMinIO\u51c6\u5907\u5b8c\u6210\u7684\u90e8\u5206\u3002<\/p>\n<h2>MySQL\u7684\u5b89\u88c5\u8bbe\u7f6e<\/h2>\n<p>\u4e3a\u4e86\u8fdb\u884cKanister\u64cd\u4f5c\u7684\u9a8c\u8bc1\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u5355\u4e00\u5b9e\u4f8b\u7684MySQL\u4ee5\u7528\u4f5c\u52a8\u4f5c\u9a8c\u8bc1\u3002MySQL\u5c06\u88ab\u8bbe\u7f6e\u5728\u547d\u540d\u7a7a\u95f4\uff08\u9ed8\u8ba4\uff09\u4e2d\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubens default\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4f7f\u7528Manifest(mysql.yaml)\u6765\u8bbe\u7f6eMySQL\u3002<\/p>\n<ul class=\"post-ul\">mysql.yaml<\/ul>\n<pre class=\"post-pre\"><code><span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">v1<\/span>\r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">Service<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">port<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3306<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n  <span class=\"na\">clusterIP<\/span><span class=\"pi\">:<\/span> <span class=\"s\">None<\/span>\r\n<span class=\"nn\">---<\/span>\r\n<span class=\"na\">apiVersion<\/span><span class=\"pi\">:<\/span> <span class=\"s\">apps\/v1<\/span> \r\n<span class=\"na\">kind<\/span><span class=\"pi\">:<\/span> <span class=\"s\">StatefulSet<\/span>\r\n<span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n  <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"s\">app.kubernetes.io\/name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n    <span class=\"s\">app.kubernetes.io\/instance<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n<span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">serviceName<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">mysql\"<\/span>\r\n  <span class=\"na\">replicas<\/span><span class=\"pi\">:<\/span> <span class=\"m\">1<\/span>\r\n  <span class=\"na\">selector<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">matchLabels<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n  <span class=\"na\">template<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">labels<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">app<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">containers<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql:5.7<\/span>\r\n        <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n        <span class=\"na\">env<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">MYSQL_ROOT_PASSWORD<\/span>\r\n          <span class=\"na\">valueFrom<\/span><span class=\"pi\">:<\/span>\r\n            <span class=\"na\">secretKeyRef<\/span><span class=\"pi\">:<\/span>\r\n              <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n              <span class=\"na\">key<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql-root-password<\/span>\r\n        <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">containerPort<\/span><span class=\"pi\">:<\/span> <span class=\"m\">3306<\/span>\r\n          <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">mysql<\/span>\r\n        <span class=\"na\">volumeMounts<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"pi\">-<\/span> <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">data<\/span>\r\n          <span class=\"na\">mountPath<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/var\/lib\/mysql<\/span>\r\n  <span class=\"na\">volumeClaimTemplates<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"pi\">-<\/span> <span class=\"na\">metadata<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">name<\/span><span class=\"pi\">:<\/span> <span class=\"s\">data<\/span>\r\n    <span class=\"na\">spec<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"na\">accessModes<\/span><span class=\"pi\">:<\/span> <span class=\"pi\">[<\/span><span class=\"s2\">\"<\/span><span class=\"s\">ReadWriteOnce\"<\/span><span class=\"pi\">]<\/span>\r\n      <span class=\"na\">resources<\/span><span class=\"pi\">:<\/span>\r\n        <span class=\"na\">requests<\/span><span class=\"pi\">:<\/span>\r\n          <span class=\"na\">storage<\/span><span class=\"pi\">:<\/span> <span class=\"s\">1Gi<\/span>\r\n<\/code><\/pre>\n<p>\u521b\u5efaMySQL\u7684root\u5bc6\u7801\u4e3aSecret\uff08mysql\uff09\u4e4b\u540e\uff0c\u90e8\u7f72Manifest(mysql.yaml)\u4ee5\u786e\u8ba4MySQL\u7684\u542f\u52a8\u3002<\/p>\n<p>\u5728\u672c\u6b21\u9a8c\u8bc1\u4e2d\u4f7f\u7528\u7684Kanister\u7684Blueprint(mysql-blueprint)\uff0c\u4ee5Label app.kubernetes.io\/instance: \u7684\u503c\u4f5c\u4e3aSecret\u540d\u79f0\u4f7f\u7528\uff08\u539f\u56e0\u4e0d\u660e\uff09\uff0c\u56e0\u6b64\u9700\u8981\u8fdb\u884c\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl create secret generic mysql \\\r\n  --from-literal=mysql-root-password='password'\r\n\r\n$ kubectl apply -f mysql.yaml \r\n\r\n$ kubectl get svc,pod,pvc,pv\r\nNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE\r\nservice\/kubernetes   ClusterIP   10.96.0.1    &lt;none&gt;        443\/TCP    67m\r\nservice\/mysql        ClusterIP   None         &lt;none&gt;        3306\/TCP   2m26s\r\n\r\nNAME          READY   STATUS    RESTARTS   AGE\r\npod\/mysql-0   1\/1     Running   0          2m26s\r\n\r\nNAME                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE\r\npersistentvolumeclaim\/data-mysql-0   Bound    pvc-cbbb914b-6911-477c-b77a-1adc3c849d1a   1Gi        RWO            standard       2m26s\r\n\r\nNAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE\r\npersistentvolume\/pvc-cbbb914b-6911-477c-b77a-1adc3c849d1a   1Gi        RWO            Delete           Bound    default\/data-mysql-0   standard                2m26s\r\npersistentvolume\/pvc-f1016d2e-2fc5-48a0-befb-8a7304281b16   1Gi        RWO            Delete           Bound    minio\/minio-pvc        standard                24m\r\n<\/code><\/pre>\n<p>\u6211\u5c06\u5c1d\u8bd5\u8bbf\u95eeMySQL\u3002<br \/>\n\u7531\u4e8e\u5728mysql.yaml\u4e2d\u8bbe\u7f6e\u4e86MySQL\u7684root\u5bc6\u7801\u4e3apassword\uff0c\u6211\u5c06\u4f7f\u7528\u5b83\u6267\u884cSELECT 1\u4ee5\u786e\u8ba4\u80fd\u591f\u6210\u529f\u8bbf\u95ee\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl run mysql-client --image=mysql:5.7 -it --rm --restart=Never -- mysql -h mysql -uroot -ppassword -e 'SELECT 1'\r\nmysql: [Warning] Using a password on the command line interface can be insecure.\r\n+---+\r\n| 1 |\r\n+---+\r\n| 1 |\r\n+---+\r\npod \"mysql-client\" deleted\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u4e3a\u4e86\u8fdb\u884c\u672c\u6b21\u9a8c\u8bc1\uff0c\u9700\u8981\u521b\u5efa\u4e00\u4e2a\u9002\u5f53\u7684\u8868\u5e76\u6dfb\u52a0\u8bb0\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl exec -ti mysql-0 -- bash\r\nroot@mysql-0:\/# mysql -p    \r\nEnter password:    # MySQL\u306eroot\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\r\n...\r\nmysql&gt; CREATE DATABASE test;\r\nmysql&gt; USE test;\r\nmysql&gt; CREATE TABLE pets (name VARCHAR(20), species VARCHAR(20));\r\nmysql&gt; INSERT INTO pets VALUES ('flare', 'dog');\r\nmysql&gt; INSERT INTO pets VALUES ('reno', 'dog');\r\nmysql&gt; SELECT * FROM pets;\r\n+-------+---------+\r\n| name  | species |\r\n+-------+---------+\r\n| flare | dog     |\r\n| reno  | dog     |\r\n+-------+---------+\r\n2 rows in set (0.00 sec)\r\n\r\nmysql&gt; exit\r\nroot@mysql-0:\/# exit\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\uff0c\u51c6\u5907\u5de5\u4f5c\u5df2\u7ecf\u5b8c\u6210\u3002<\/p>\n<h1>\u884c\u52a8\u9a8c\u8bc1<\/h1>\n<h2>Kanister\u7684\u5b89\u88c5<\/h2>\n<p>\u6e96\u5099\u5de5\u4f5c\u82b1\u8d39\u4e86\u5f88\u957f\u65f6\u95f4\uff0c\u4f46\u662f\u73b0\u5728\u6211\u4eec\u7ec8\u4e8e\u8981\u5f00\u59cb\u5b89\u88c5\u4e3b\u9898\u4e2d\u7684Kanister\u4e86\u3002<br \/>\n\u9996\u5148\uff0c\u6211\u4eec\u521b\u5efa\u5e76\u5207\u6362\u5230Kanister\u7684\u547d\u540d\u7a7a\u95f4\uff08kanister\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl create ns kanister\r\n$ kubens kanister\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u4f7f\u7528Helm\u6765\u5b89\u88c5Kanister Operator\u3002<\/p>\n<pre class=\"post-pre\"><code>$ helm repo add kanister http:\/\/charts.kanister.io\r\n\r\n$ helm install myrelease --namespace kanister kanister\/kanister-operator --set image.tag=0.44.0\r\n<\/code><\/pre>\n<p>\u786e\u8ba4\u542f\u52a8kanister operator\u3002<\/p>\n<pre class=\"post-pre\"><code>$ $ kubectl get deploy,pod\r\nNAME                                          READY   UP-TO-DATE   AVAILABLE   AGE\r\ndeployment.apps\/myrelease-kanister-operator   1\/1     1            1           53s\r\n\r\nNAME                                               READY   STATUS    RESTARTS   AGE\r\npod\/myrelease-kanister-operator-6f97fd58f6-dqt8g   1\/1     Running   0          53s\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0a\u3067\u3001Kanister Operator\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002<br \/>\nKanister\u3067\u306f\u4ee5\u4e0b\u306e3\u3064\u306eCRD\u3082\u5c55\u958b\u3055\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl get crd |grep kanister\r\nactionsets.cr.kanister.io   2020-12-12T05:52:57Z\r\nblueprints.cr.kanister.io   2020-12-12T05:52:57Z\r\nprofiles.cr.kanister.io     2020-12-12T05:52:57Z\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u5bf9\u5404 CR \u8fdb\u884c\u7b80\u8981\u8bf4\u660e\u7684\u5185\u5bb9\u3002<\/p>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">Actionset<\/ul>\n<\/li>\n<\/ul>\n<p>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3084\u30ea\u30b9\u30c8\u30a2\u306e\u5b9f\u884c\u3059\u308b\u30bf\u30b9\u30af(\u30a2\u30af\u30b7\u30e7\u30f3)\u3092\u793a\u3059\u30ea\u30bd\u30fc\u30b9<\/p>\n<p>Blueprint<\/p>\n<p>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u3084\u30ea\u30b9\u30c8\u30a2\u306a\u3069\u306e\u51e6\u7406\u3092\u5b9a\u7fa9\u3059\u308b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ea\u30bd\u30fc\u30b9<\/p>\n<p>Profile<\/p>\n<p>\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u5148\u3068\u306a\u308b\u30aa\u30d6\u30b8\u30a7\u30af\u30c8\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u30ed\u30b1\u30fc\u30b7\u30e7\u30f3\u60c5\u5831\u306a\u3069\u3092\u5b9a\u7fa9\u3059\u308b\u30ea\u30bd\u30fc\u30b9<\/p>\n<p>\u5728Kanister\u4e2d\uff0c\u4f7f\u7528\u4e0a\u8ff0\u7684\u4e09\u4e2aCR\u6267\u884c\u5907\u4efd\/\u6062\u590d\u64cd\u4f5c\u3002\u4ee5\u4e0b\u662fKanister\u7684\u5de5\u4f5c\u6d41\u7a0b\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/49-0.png\" alt=\"kanister workflow\" \/><\/div>\n<h2>\u521b\u5efa\u4e2a\u4eba\u8d44\u6599<\/h2>\n<p>\u9996\u5148\uff0c\u4f7f\u7528\u4e4b\u524d\u51c6\u5907\u597d\u7684MinIO\u4fe1\u606f\u4f5c\u4e3a\u5907\u4efd\u5b58\u50a8\u4f4d\u7f6e\uff0c\u521b\u5efa\u4e00\u4e2aProfile\u3002<br \/>\n\u4ee5\u4e0b\u662fProfile\u7684\u6e05\u5355(profile.yaml)\u3002<\/p>\n<ul class=\"post-ul\">profile.yaml<\/ul>\n<pre class=\"post-pre\"><code>apiVersion: cr.kanister.io\/v1alpha1\r\nkind: Profile\r\nmetadata:\r\n  name: s3-profile\r\n  namespace: kanister\r\nlocation:\r\n  type: s3Compliant\r\n  bucket: kanister\r\n  endpoint: http:\/\/minio.minio.svc:9000\r\ncredential:\r\n  type: keyPair\r\n  keyPair:\r\n    idField: minio_access_key_id\r\n    secretField: minio_secret_access_key\r\n    secret:\r\n      apiVersion: v1\r\n      kind: Secret\r\n      name: minio-secret\r\n      namespace: kanister\r\nskipSSLVerify: true\r\n<\/code><\/pre>\n<p>\u56e0\u6b64\uff0c\u5728\u8fd9\u6b21\u521b\u5efa\u7684MinIO\u4e2d\u6ca1\u6709\u8bbe\u7f6eTLS\uff0c\u56e0\u6b64\u5c06skipSSLVerify\u8bbe\u4e3atrue\u3002<br \/>\n\u6211\u4eec\u5c06\u90e8\u7f72profile.yaml\u6587\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl apply -f profile.yaml\r\n<\/code><\/pre>\n<p>\u63a5\u4e0b\u6765\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aminio-secret\u7684\u5bc6\u94a5\uff08Secret\uff09\uff0c\u5176\u4e2d\u5305\u542bMinIO\u7684AccessKey\u548cSecret Key\u3002<\/p>\n<p>\u4e0b\u4e00\u6b65\uff0c\u6211\u4eec\u5c06\u521b\u5efa\u4e00\u4e2a\u540d\u4e3aminio-secret\u7684\u5bc6\u94a5\uff08Secret\uff09\uff0c\u5176\u4e2d\u5305\u542bMinIO\u7684AccessKey\u548cSecret Key\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl create secret -n kanister generic minio-secret \\\r\n --from-literal=minio_access_key_id='minio' \\\r\n --from-literal=minio_secret_access_key='minio123'\r\n<\/code><\/pre>\n<h2>\u51c6\u5907MySQL\u84dd\u56fe\u3002<\/h2>\n<p>\u63a5\u4e0b\u6765\uff0c\u90e8\u7f72MySQL\u5907\u4efd\u6062\u590d\u5904\u7406\u7684\u84dd\u56fe\u6e05\u5355\uff08mysql-blueprint.yaml\uff09\uff0c\u5176\u4e2d\u5305\u542b\u4e86\u76f8\u5173\u64cd\u4f5c\u7684\u8bb0\u5f55\u3002<\/p>\n<pre class=\"post-pre\"><code>$ git clone git@github.com:kanisterio\/kanister.git\r\n\r\n$ kubectl apply -f kanister\/examples\/stable\/mysql\/mysql-blueprint.yaml \r\n\r\n$ kubectl get blueprint\r\nNAME              AGE\r\nmysql-blueprint   11m\r\n<\/code><\/pre>\n<h2>\u6267\u884c\u5907\u4efd<\/h2>\n<p>\u7ec8\u4e8e\u8981\u6267\u884c\u5907\u4efd\u4e86\u3002<br \/>\n\u5728Kanister\u4e2d\uff0c\u901a\u8fc7\u521b\u5efaActionsets\u8d44\u6e90\u6765\u6267\u884c\u5907\u4efd\u548c\u6062\u590d\u64cd\u4f5c\u3002<br \/>\n\u4e0b\u9762\u662f\u5907\u4efdActionset\u7684\u6e05\u5355(backup.yaml)\u3002<\/p>\n<pre class=\"post-pre\"><code>apiVersion: cr.kanister.io\/v1alpha1\r\nkind: ActionSet\r\nmetadata:\r\n  name: backup\r\n  namespace: kanister\r\nspec:\r\n  actions:\r\n  - blueprint: mysql-blueprint\r\n    name: backup\r\n    object:\r\n      kind: statefulset\r\n      name: mysql\r\n      namespace: default\r\n    profile:\r\n      name: s3-profile\r\n      namespace: kanister\r\n<\/code><\/pre>\n<p>\u5728\u5907\u4efd\u5b8c\u6210\u4e4b\u524d\uff0c\u8bf7\u7a0d\u7b49\u4e00\u4f1a\u3002<br \/>\n\u53ef\u4ee5\u901a\u8fc7\u67e5\u770bActionset\uff08\u5907\u4efd\uff09\u7684\u4e8b\u4ef6\u6765\u786e\u8ba4\u5907\u4efd\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl describe actionset -n kanister backup \r\n...\r\nEvents:\r\n  Type    Reason           Age    From                 Message\r\n  ----    ------           ----   ----                 -------\r\n  Normal  Started Action   3m18s  Kanister Controller  Executing action backup\r\n  Normal  Started Phase    3m18s  Kanister Controller  Executing phase dumpToObjectStore\r\n  Normal  Ended Phase      35s    Kanister Controller  Completed phase dumpToObjectStore\r\n  Normal  Update Complete  35s    Kanister Controller  Updated ActionSet 'backup' Status-&gt;complete\r\n<\/code><\/pre>\n<p>\u72b6\u6001\u5df2\u66f4\u6539\u4e3a\u5b8c\u6210\uff0c\u5907\u4efd\u5df2\u5b8c\u6210\u3002<br \/>\n\u8ba9\u6211\u4eec\u4eceMinIO\u7684WebUI\u4e2d\u786e\u8ba4\u5907\u4efd\u7684\u6570\u636e\u3002<\/p>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/67-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2020-12-12 17.33.50.png\" \/><\/div>\n<p>\u5728\u7528\u4e8e\u9a8c\u8bc1\u7684Buket\uff08\u575a\u5c3c\u65af\u7279\uff09\u4e0b\u9762\uff0c\u901a\u8fc7\u547d\u540d\u7a7a\u95f4\u540d\u79f0\u3001StatefulSet\u540d\u79f0\u548c\u65e5\u671f\u521b\u5efa\u4e86\u5c42\u7ea7\uff0c\u5e76\u5728\u5176\u4e0b\u9762\u5b58\u50a8\u4e86\u540d\u4e3adump.sql.gz\u7684\u5907\u4efd\u6570\u636e\u3002<\/p>\n<h2>\u6267\u884c\u8fd8\u539f\u64cd\u4f5c<\/h2>\n<p>\u4e3a\u4e86\u9a8c\u8bc1\u6062\u590d\u64cd\u4f5c\uff0c\u63a5\u4e0b\u6765\u6211\u4eec\u5c06\u5220\u9664MySQL\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubens default\r\n$ kubectl delete -f mysql.yaml \r\n$ kubectl delete pvc data-mysql-0\r\n<\/code><\/pre>\n<p>\u518d\u6b21\u90e8\u7f72MySQL\u7684Manifest(mysql.yaml)\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl apply -f mysql.yaml \r\n\r\n$ kubectl get svc,pod,pvc,pv\r\nNAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)    AGE\r\nservice\/kubernetes   ClusterIP   10.96.0.1    &lt;none&gt;        443\/TCP    4h3m\r\nservice\/mysql        ClusterIP   None         &lt;none&gt;        3306\/TCP   68s\r\n\r\nNAME          READY   STATUS    RESTARTS   AGE\r\npod\/mysql-0   1\/1     Running   0          68s\r\n\r\nNAME                                 STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE\r\npersistentvolumeclaim\/data-mysql-0   Bound    pvc-cc959139-bf18-465d-a17c-e1727b4c1ac2   1Gi        RWO            standard       68s\r\n\r\nNAME                                                        CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                  STORAGECLASS   REASON   AGE\r\npersistentvolume\/pvc-cc959139-bf18-465d-a17c-e1727b4c1ac2   1Gi        RWO            Delete           Bound    default\/data-mysql-0   standard                68s\r\npersistentvolume\/pvc-f1016d2e-2fc5-48a0-befb-8a7304281b16   1Gi        RWO            Delete           Bound    minio\/minio-pvc        standard                3h21m\r\n<\/code><\/pre>\n<p>\u4f7f\u7528Kanister\u5c06\u5907\u4efd\u6570\u636e\u6062\u590d\u5230\u521d\u59cb\u72b6\u6001\u7684MySQL\u3002<br \/>\n\u7136\u540e\uff0c\u6211\u4eec\u5c06\u5f00\u59cb\u6062\u590d\u5907\u4efd\u6570\u636e\u3002<br \/>\n\u6211\u4eec\u5c06\u521b\u5efa\u5e76\u6267\u884c\u4e00\u4e2a\u7528\u4e8e\u6062\u590d\u7684Actionset\u3002<br \/>\n\u4e3a\u4e86\u521b\u5efa\u6062\u590d\u7528\u7684Actionset\u6e05\u5355\uff0c\u6211\u4eec\u9700\u8981\u83b7\u53d6\u4fe1\u606f\uff08artifacts.mysqlCloudDump.keyValue.s3path\uff09\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl get actionsets backup -o yaml |grep -A 3 artifacts\r\n  - artifacts:\r\n      mysqlCloudDump:\r\n        keyValue:\r\n          s3path: \/mysql-backups\/default\/mysql\/2020-12-12T08-26-08\/dump.sql.gz\r\n<\/code><\/pre>\n<p>\u4ee5\u4e0b\u662f\u4f7f\u7528\u4e0a\u8ff0\u503c\u521b\u5efa\u7684\u7528\u4e8e\u5217\u8868\u8fd8\u539f\u7684Actionset\u7684\u6e05\u5355\uff08restore.yaml\uff09\u3002<\/p>\n<ul class=\"post-ul\">restore.yaml<\/ul>\n<pre class=\"post-pre\"><code>apiVersion: cr.kanister.io\/v1alpha1\r\nkind: ActionSet\r\nmetadata:\r\n  name: restore\r\n  namespace: kanister\r\nspec:\r\n  actions:\r\n  - name: restore\r\n    artifacts:\r\n      mysqlCloudDump:\r\n        keyValue:\r\n          s3path: \/mysql-backups\/default\/mysql\/2020-12-12T08-26-08\/dump.sql.gz\r\n    blueprint: mysql-blueprint\r\n    object:\r\n      kind: statefulset\r\n      name: mysql\r\n      namespace: default\r\n    profile:\r\n      name: s3-profile\r\n      namespace: kanister\r\n<\/code><\/pre>\n<p>\u90e8\u7f72\u5e76\u6267\u884c\u6062\u590d\u64cd\u4f5c (restore.yaml)\u3002<br \/>\n\u8bf7\u7a0d\u7b49\uff0c\u76f4\u5230\u6062\u590d\u64cd\u4f5c\u5b8c\u6210\u3002<br \/>\n\u53ef\u901a\u8fc7\u67e5\u770b\u5907\u4efd\u64cd\u4f5c\u7684\u4e8b\u4ef6 (Actionset backup) \u6765\u786e\u8ba4\u6062\u590d\u64cd\u4f5c\u7684\u72b6\u6001\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubectl describe actionset -n kanister restore\r\n...\r\nEvents:\r\n  Type    Reason           Age   From                 Message\r\n  ----    ------           ----  ----                 -------\r\n  Normal  Started Action   85s   Kanister Controller  Executing action restore\r\n  Normal  Started Phase    85s   Kanister Controller  Executing phase restoreFromBlobStore\r\n  Normal  Ended Phase      83s   Kanister Controller  Completed phase restoreFromBlobStore\r\n  Normal  Update Complete  83s   Kanister Controller  Updated ActionSet 'restore' Status-&gt;complete\r\n<\/code><\/pre>\n<p>\u72b6\u6001\u5df2\u8bbe\u7f6e\u4e3a\u5b8c\u6210\uff0c\u5e76\u5df2\u5b8c\u6210\u8fd8\u539f\u3002<br \/>\n\u8fde\u63a5\u5230MySQL\u5e76\u786e\u8ba4\u8fd8\u539f\u662f\u5426\u6b63\u786e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kubens default\r\n\r\n$ kubectl exec -ti mysql-0 -- bash\r\nroot@mysql-0:\/# mysql -p\r\nEnter password: \r\n...\r\nmysql&gt; SHOW DATABASES;\r\n+--------------------+\r\n| Database           |\r\n+--------------------+\r\n| information_schema |\r\n| mysql              |\r\n| performance_schema |\r\n| sys                |\r\n| test               |\r\n+--------------------+\r\n5 rows in set (0.00 sec)\r\n\r\nmysql&gt; USE test\r\n...\r\nDatabase changed\r\n\r\nmysql&gt; SHOW TABLES;\r\n+----------------+\r\n| Tables_in_test |\r\n+----------------+\r\n| pets           |\r\n+----------------+\r\n1 row in set (0.00 sec)\r\n\r\nmysql&gt; SELECT * FROM pets;\r\n+-------+---------+\r\n| name  | species |\r\n+-------+---------+\r\n| flare | dog     |\r\n| reno  | dog     |\r\n+-------+---------+\r\n2 rows in set (0.00 sec)\r\n\r\nmysql&gt; exit\r\nBye\r\nroot@mysql-0:\/# exit\r\n<\/code><\/pre>\n<p>\u6211\u786e\u8ba4\u53ef\u4ee5\u6b63\u786e\u8fdb\u884c\u6062\u590d\u64cd\u4f5c\u3002<\/p>\n<h2>\u8865\u5145\uff1a\u4f7f\u7528kanctl\u547d\u4ee4\u5feb\u901f\u90e8\u7f72Actionset\u3002<\/h2>\n<p>\u4f60\u53ef\u4ee5\u5728\u4ee5\u4e0b\u4f4d\u7f6e\u5b89\u88c5kanctl\u547d\u4ee4\u3002<\/p>\n<pre class=\"post-pre\"><code>$ curl https:\/\/raw.githubusercontent.com\/kanisterio\/kanister\/master\/scripts\/get.sh | bash\r\n<\/code><\/pre>\n<p>\u4f8b\u5982\uff0c\u5373\u4f7f\u4e0d\u521b\u5efa\u4e00\u4e2aActionset\u7684Mainfest\uff0c\u4ecd\u7136\u53ef\u4ee5\u901a\u8fc7\u4ee5\u4e0b\u7684kanctl\u547d\u4ee4\u6267\u884c\u4e0a\u8ff0\u7684\u9a8c\u8bc1\u6062\u590d\u3002<\/p>\n<pre class=\"post-pre\"><code>$ kanctl --namespace kanister create actionset --action restore --from backup\r\n<\/code><\/pre>\n<h1>\u89e6\u52a8\u5185\u5fc3\u611f\u53d7<\/h1>\n<p>\u672c\u6b21\u6211\u4eec\u5bf9Kanister\u8fdb\u884c\u4e86Kubernetes\u539f\u751f\u5907\u4efd\/\u8fd8\u539f\u7684\u6d4b\u8bd5\u9a8c\u8bc1\u3002Kanister\u662f\u4e00\u4e2a\u5de5\u5177\uff0c\u901a\u8fc7\u4e3a\u6bcf\u4e2a\u5e94\u7528\u7a0b\u5e8f\u63d0\u4f9b\u540d\u4e3aBlueprint\u7684\u6a21\u677f\u6765\u5b9e\u73b0\u6309\u7167\u5e94\u7528\u7a0b\u5e8f\u7684\u65b9\u5f0f\u8fdb\u884c\u5907\u4efd\/\u8fd8\u539f\u3002\u53ea\u8981Blueprint\u5df2\u7ecf\u51c6\u5907\u597d\u4e86\uff0c\u5c31\u53ef\u4ee5\u8f7b\u677e\u4f7f\u7528\u3002\u4f46\u662f\u8bf7\u6ce8\u610f\uff0c\u867d\u7136Blueprint\u5df2\u7ecf\u51c6\u5907\u597d\uff0c\u4f46\u8fc7\u4e8e\u4f9d\u8d56\u5b83\u53ef\u80fd\u662f\u5371\u9669\u7684\u3002\u5728\u4f7f\u7528\u4e4b\u524d\uff0c\u8bf7\u52a1\u5fc5\u68c0\u67e5Blueprint\u7684\u5185\u5bb9\uff0c\u5e76\u786e\u8ba4\u5176\u4e2d\u6b63\u5728\u6267\u884c\u7684\u64cd\u4f5c\u3002\u4f8b\u5982\uff0c\u672c\u6b21\u4f7f\u7528\u7684Blueprint\uff08mysql-blueprint\uff09\u53ea\u662f\u901a\u8fc7mysqldump\u547d\u4ee4\u5c06\u5907\u4efd\u6587\u4ef6\u590d\u5236\u5230\u5bf9\u8c61\u5b58\u50a8\u4e2d\uff0c\u975e\u5e38\u7b80\u5355\u3002\u9057\u61be\u7684\u662f\uff0c\u5b83\u6ca1\u6709\u5305\u542b\u50cf\u5728\u6570\u636e\u5e93\u5907\u4efd\u4e2d\u5e38\u89c1\u7684\u5904\u7406\uff0c\u5982\u5728\u5907\u4efd\u671f\u95f4\u9501\u5b9a\u5199\u5165\u4ee5\u9632\u6b62\u8bb0\u5f55\u88ab\u4fee\u6539\u3002\u5982\u679c\u9700\u8981\uff0c\u60a8\u9700\u8981\u81ea\u884c\u6dfb\u52a0\u5230Blueprint\u4e2d\u3002\u4eceGitHub\u9875\u9762\u6765\u770b\uff0cKanister\u88ab\u63cf\u8ff0\u4e3a\u4e00\u4e2a\u7528\u4e8eKubernetes\u4e2d\u6570\u636e\u7ba1\u7406\u7684\u6846\u67b6\u3002\u6362\u53e5\u8bdd\u8bf4\uff0c\u5b83\u662f\u7528\u4e8e\u8fdb\u884c\u5e94\u7528\u7a0b\u5e8f\u4e2d\u5fc3\u7684\u5907\u4efd\/\u8fd8\u539f\u7684\u6846\u67b6\u3002\u53ef\u80fd\u8fd9\u662f\u4e0e\u63d0\u4f9b\u5907\u4efd\/\u8fd8\u539f\u8f6f\u4ef6Kasten(K10)\u7684\u5dee\u5f02\u5316\u4e4b\u5904\u3002<\/p>\n<p>\u53e6\u5916\uff0c\u9084\u6709\u4e00\u500b\u985e\u4f3c\u7684Kubernetes Native\u7684\u5099\u4efd\/\u9084\u539f\u5de5\u5177\u53eb\u505aVelero\u3002\uff08Velero\u7684\u9a57\u8b49\u5831\u544a\u5728\u9019\u88e1\uff09\u73fe\u5728\u53ef\u80fd\u6709\u4eba\u5c0dVelero\u548cKanister\u7684\u5340\u5225\u611f\u5230\u597d\u5947\u3002\u7c21\u55ae\u8aaa\uff0cVelero\u975e\u5e38\u9069\u5408\u5099\u4efd\/\u9084\u539f\u5728Kubernetes\u4e0a\u90e8\u7f72\u7684\u8cc7\u6e90\uff08\u4f8b\u5982Pod\u3001PVC\u3001PV\u7b49\uff09\u3002\u800cKanister\u5247\u5c08\u6ce8\u65bc\u4ee5\u9069\u5408\u61c9\u7528\u7a0b\u5e8f\u7684\u65b9\u5f0f\u5099\u4efd\/\u9084\u539f\u61c9\u7528\u7a0b\u5e8f\u7684\u6578\u64da\u3002\u6839\u64da\u4f7f\u7528\u5834\u666f\uff0c\u53ef\u4ee5\u6839\u64da\u662f\u8981\u5099\u4efd\u6574\u500bKubernetes\u8cc7\u6e90\u9084\u662f\u53ea\u5099\u4efd\u7279\u5b9a\u61c9\u7528\u7a0b\u5e8f\u7684\u6578\u64da\u7b49\u9032\u884c\u9078\u64c7\uff0c\u9019\u662f\u503c\u5f97\u63a8\u85a6\u7684\u3002<\/p>\n<h1>\u8bf7\u63d0\u4f9b\u53c2\u8003\u4fe1\u606f\u3002<\/h1>\n<ul class=\"post-ul\">\n<li style=\"list-style-type: none;\">\n<ul class=\"post-ul\">GitHub kanisterio\/kanister<\/ul>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<ul class=\"post-ul\">Kanister docs<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u5728\u672c\u9a8c\u8bc1\u4e2d\uff0c\u6211\u4eec\u5c06\u8fdb\u884cKubernetes Native\u5907\u4efd\u5de5\u5177Kanister\u7684\u64cd\u4f5c\u9a8c\u8bc1\u3002 Kanis [&hellip;]<\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-50578","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u539f\u751f\u4e8e-kubernetes-\u7684\u5907\u4efd\u5de5\u5177-kanister-\u7684\u9a8c\u8bc1\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u5728\u672c\u9a8c\u8bc1\u4e2d\uff0c\u6211\u4eec\u5c06\u8fdb\u884cKubernetes Native\u5907\u4efd\u5de5\u5177Kanister\u7684\u64cd\u4f5c\u9a8c\u8bc1\u3002 Kanis [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u539f\u751f\u4e8e-kubernetes-\u7684\u5907\u4efd\u5de5\u5177-kanister-\u7684\u9a8c\u8bc1\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2022-12-09T22:32:32+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T02:55:28+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/18-0.png\" \/>\n<meta name=\"author\" content=\"\u6587, \u7fd4\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u6587, \u7fd4\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/\",\"name\":\"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2022-12-09T22:32:32+00:00\",\"dateModified\":\"2024-04-29T02:55:28+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c\",\"name\":\"\u6587, \u7fd4\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g\",\"caption\":\"\u6587, \u7fd4\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u539f\u751f\u4e8e-kubernetes-\u7684\u5907\u4efd\u5de5\u5177-kanister-\u7684\u9a8c\u8bc1\/","og_locale":"zh_CN","og_type":"article","og_title":"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1","og_description":"\u9996\u5148 \u5728\u672c\u9a8c\u8bc1\u4e2d\uff0c\u6211\u4eec\u5c06\u8fdb\u884cKubernetes Native\u5907\u4efd\u5de5\u5177Kanister\u7684\u64cd\u4f5c\u9a8c\u8bc1\u3002 Kanis [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u539f\u751f\u4e8e-kubernetes-\u7684\u5907\u4efd\u5de5\u5177-kanister-\u7684\u9a8c\u8bc1\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2022-12-09T22:32:32+00:00","article_modified_time":"2024-04-29T02:55:28+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d92b3913a08637a6e3b3c\/18-0.png"}],"author":"\u6587, \u7fd4","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u6587, \u7fd4","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"7 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/","name":"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2022-12-09T22:32:32+00:00","dateModified":"2024-04-29T02:55:28+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u539f\u751f\u4e8e Kubernetes \u7684\u5907\u4efd\u5de5\u5177 Kanister \u7684\u9a8c\u8bc1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/64d5cc7727fffbff2f9a2a8da1de3e5c","name":"\u6587, \u7fd4","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/920c3d673e0bccacc98e5e6b7149bb3c22edd8d39cb753e5d7d7e471498118a1?s=96&d=mm&r=g","caption":"\u6587, \u7fd4"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/wenxiang\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e5%8e%9f%e7%94%9f%e4%ba%8e-kubernetes-%e7%9a%84%e5%a4%87%e4%bb%bd%e5%b7%a5%e5%85%b7-kanister-%e7%9a%84%e9%aa%8c%e8%af%81\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50578","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=50578"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50578\/revisions"}],"predecessor-version":[{"id":84851,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/50578\/revisions\/84851"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=50578"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=50578"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=50578"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}