使用回收站功能恢复NAS文件数据

容器网络文件系统CNFS支持NAS文件回收站功能,避免文件误删除。本文以公网可访问的Nginx应用为例,介绍如何通过CNFS回收站恢复被删除的NAS文件。

背景信息

通过使用CNFS的StorageClass创建示例目录并绑定Nginx,然后在示例目录上删除index.html文件,此时Nginx无法访问欢迎页。然后可以通过控制台的回收站功能恢复index.html文件,同时也恢复了Nginx的欢迎页。

使用说明

  • 费用说明

    回收站功能本身不收取任何费用,但是暂存在回收站中的文件将按照删除前的存储类型收取存储费用。为节省不必要的存储费用,请您合理配置文件保留时间。计费详情,请参见通用型NAS计费低频介质计费说明

  • 权限说明

    只有文件系统的拥有者及授予了文件系统回收站使用权限的RAM用户才能使用回收站功能。更多信息,请参见授予RAM用户对文件系统回收站的管理权限

前提条件

  • 已创建Kubernetes集群,且存储插件选择为CSI。具体操作,请参见创建Kubernetes托管版集群

    • 若需要新建集群,选择CSI存储插件时请同时选中创建默认NAS文件系统和CNFS容器网络文件系统动态存储类型

    • 若已创建集群,但未选中创建默认NAS文件系统和CNFS容器网络文件系统动态存储类型,请使用CNFS托管NAS文件系统。具体操作,请参见通过CNFS方式使用NAS文件系统

  • 集群已开启公网访问。

  • csi-plugin和csi-provisioner组件版本不低于v1.20.5-ff6490f-aliyun。关于如何升级CSI-Plugin和CSI-Provisioner组件,请参见升级CSI-Plugin和CSI-Provisioner

  • storage-operator组件版本不低于v1.18.8.56-2aa33ba-aliyun。关于如何升级storage-operator组件,请参见管理组件

步骤一:创建PVC并绑定到公网可访问的Nginx

  1. 查看CNFS对象的状态。

    需要确保CNFS对象的状态为Available

    1. 执行以下命令查看CNFS对象。

      kubectl get cnfs

      预期输出:

      NAME                                      AGE
      default-cnfs-nas-7938cef-20210907193713   21h
    2. 执行以下命令查看CNFS对象的状态。

      kubectl get cnfs default-cnfs-nas-7938cef-20210907193713 -o yaml | grep Available

      预期输出:

      status: Available
  2. 使用以下YAML示例创建PVC。

    重要

    PVC对象的storageClassName引用CNFS的StorageClass。本例中PVC名称为cnfs-nas-pvcstorageClassNamealibabacloud-cnfs-nas

    cat << EOF | kubectl apply -f -
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: cnfs-nas-pvc
    spec:
      accessModes:
        - ReadWriteMany
      storageClassName: alibabacloud-cnfs-nas
      resources:
        requests:
          storage: 30Gi
    EOF
  3. 使用以下YAML示例创建Deployment。

    重要

    Deployment对象引用上个步骤创建的PVC。本示例Deployment名称为cnfs-nas-deployment,引用的PVC名称为cnfs-nas-pvc,映射到容器的路径为/app,并开启名称为http的容器端口8080。

    cat << EOF | kubectl apply -f -
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: cnfs-nas-deployment
      labels:
        app: nginx
    spec:
      selector:
        matchLabels:
          app: nginx
      template:
        metadata:
          labels:
            app: nginx
        spec:
          securityContext:
            runAsUser: 0
          containers:
          - name: nginx
            image: docker.io/bitnami/nginx:1.16.1-debian-9-r56
            volumeMounts:
            - mountPath: "/app"
              name: cnfs-nas-pvc
            ports:
            - containerPort: 8080
              name: http
          volumes:
          - name: cnfs-nas-pvc
            persistentVolumeClaim:
              claimName: cnfs-nas-pvc
    EOF
  4. 使用以下YAML示例为Deployment对象创建Service。

    说明

    创建Loadbalancer类型的Service,SLB会暴露公网IP,可通过SLB的公网IP访问Deployment。本示例创建名为nginx-default的Service,类型为LoadBalancer,该Service将公网暴露的HTTP请求转发到labelapp:nginx的Pod上。

    cat << EOF | kubectl apply -f -
    apiVersion: v1
    kind: Service
    metadata:
      name: nginx-default
      labels:
        app: nginx
    spec:
      type: LoadBalancer
      externalTrafficPolicy: "Cluster"
      ports:
        - name: http
          port: 80
          targetPort: http
      selector:
        app: nginx
    EOF
  5. 将Nginx的欢迎页加入到启动状态的Pod的/app路径下。

    1. 执行以下命令查看Pod。

      kubectl get pod 

      预期输出:

      NAME                                   READY   STATUS    RESTARTS   AGE
      cnfs-nas-deployment-597bc9fb45-cmkss   1/1     Running   0          3h23m
    2. 执行以下命令进入Pod cnfs-nas-deployment-597bc9fb45-cmkss的/app路径。

      kubectl exec cnfs-nas-deployment-597bc9fb45-cmkss -ti sh
      cd /app
    3. 执行以下命令将index.html写入到/app路径下。

      cat << EOF >> index.html
      <!DOCTYPE html>
      <html>
      <head>
      <title>Welcome to nginx!</title>
      <style>
      html { color-scheme: light dark; }
      body { width: 35em; margin: 0 auto;
      font-family: Tahoma, Verdana, Arial, sans-serif; }
      </style>
      </head>
      <body>
      <h1>Welcome to nginx!</h1>
      <p>If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.</p>
      
      <p>For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br/>
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.</p>
      
      <p><em>Thank you for using nginx.</em></p>
      </body>
      </html>
      EOF
    4. 执行以下命令退出Pod。

      exit
  6. 执行以下命令获取SLB的公网IP。

    kubectl get svc

    预期输出:

    NAME            TYPE           CLUSTER-IP        EXTERNAL-IP      PORT(S)        AGE
    nginx-default   LoadBalancer   192.168.XX.XX     47.115.XX.XX     80:30989/TCP   20h
  7. 在浏览器地址栏输入公网IP,可以看到Nginx的欢迎页。

    本示例中公网IP为47.115.XX.XX访问nginx

步骤二:验证CNFS回收站的恢复功能

以下示例介绍在删除文件的场景下,如何通过CNFS托管的NAS存储卷的回收站恢复文件。

  1. 执行以下命令删除index.html文件。

    kubectl exec cnfs-nas-deployment-597bc9fb45-cmkss -- rm -rf /app/index.html

    刷新浏览器再次查看Nginx的欢迎页,可以看到页面提示403 Forbiddennginx403

  2. 登录容器服务管理控制台,在左侧导航栏选择集群

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择存储 > 存储卷

  4. 存储卷页面,在目标存储卷右侧操作列单击回收站

    CNFS托管的NAS默认开启回收站,可以在控制台恢复Nginx的index.html文件。

    本示例的PV名称为nas-ecaf6018-5250-4e19-b570-5d9e657d23bcNAS存储卷Nginx

  5. 在目标文件系统回收站页签,单击已删除文件和目录页签,在目标删除路径的右侧操作列单击恢复

    恢复删除文件

    选择恢复至原路径,并单击确定恢复至原路径

  6. 刷新浏览器可以看到Nginx的欢迎页已恢复正常。

    表示Nginx的index.html文件已恢复。访问nginx

相关文档

如需关闭并清空回收站,请参见更多操作