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

背景信息

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

前提条件

  • 已创建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. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情
  5. 在集群管理页左侧导航栏中,选择存储 > 存储卷
  6. 存储卷页面,在目标存储卷右侧操作列单击回收站
    CNFS托管的NAS默认开启回收站,可以在控制台恢复Nginx的index.html文件。
    本示例的PV名称为nas-ecaf6018-5250-4e19-b570-5d9e657d23bcNAS存储卷Nginx
  7. 在目标文件系统回收站页签,单击已删除文件和目录页签,在目标删除路径的右侧操作列单击恢复
    恢复删除文件
    选择恢复至原路径,并单击确定恢复至原路径
  8. 刷新浏览器可以看到Nginx的欢迎页已恢复正常。
    表示Nginx的index.html文件已恢复。访问nginx