容器网络文件系统CNFS支持文件回收站功能,避免文件误删除。本文以公网可访问的Nginx应用为例,介绍如何通过CNFS的回收站恢复被删除的文件。
背景信息
通过使用CNFS的StorageClass创建示例目录并绑定Nginx,然后在示例目录删除index.html文件,此时Nginx无法访问欢迎页。然后可通过控制台回收站功能恢复index.html文件,同时也恢复了Nginx欢迎页。
前提条件
- 已创建Kubernetes集群,且存储插件选择为CSI。具体操作,请参见创建Kubernetes托管版集群。
- 若需要新建集群,选择CSI存储插件时请同时选中创建默认NAS文件系统和CNFS容器网络文件系统动态存储类型。
- 若已创建集群,但未选中创建默认NAS文件系统和CNFS容器网络文件系统动态存储类型,请使用CNFS托管NAS文件系统。具体操作,请参见使用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
- 查看CNFS对象的状态。
需要确保CNFS对象的状态为Available。
- 执行以下命令查看CNFS对象。
kubectl get cnfs
预期输出:
NAME AGE
default-cnfs-nas-7938cef-20210907193713 21h
- 执行以下命令查看CNFS对象的状态。
kubectl get cnfs default-cnfs-nas-7938cef-20210907193713 -o yaml | grep Available
预期输出:
status: Available
- 使用以下YAML示例创建PVC。
注意 PVC对象的storageClassName引用CNFS的StorageClass。本例中PVC名称为cnfs-nas-pvc,storageClassName为alibabacloud-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
- 使用以下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
- 使用以下YAML示例为Deployment对象创建Service。
说明 创建Loadbalancer类型的Service,SLB会暴露公网IP,可通过SLB的公网IP访问Deployment。本示例创建名为nginx-default的Service,类型为LoadBalancer,该Service将公网暴露的HTTP请求转发到label为app: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
- 将Nginx的欢迎页加入到启动状态的Pod的/app路径下。
- 执行以下命令查看Pod。
kubectl get pod
预期输出:
NAME READY STATUS RESTARTS AGE
cnfs-nas-deployment-597bc9fb45-cmkss 1/1 Running 0 3h23m
- 执行以下命令进入Pod
cnfs-nas-deployment-597bc9fb45-cmkss
的/app路径。kubectl exec cnfs-nas-deployment-597bc9fb45-cmkss -ti sh
cd /app
- 执行以下命令将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
- 执行以下命令退出Pod。
- 执行以下命令获取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
- 在浏览器地址栏输入公网IP,可以看到Nginx的欢迎页。
本示例中公网IP为
47.115.XX.XX
。

步骤二:验证CNFS回收站的恢复功能
以下示例介绍在删除文件的场景下,如何通过CNFS托管的NAS存储卷的回收站恢复文件。
- 执行以下命令删除index.html文件。
kubectl exec cnfs-nas-deployment-597bc9fb45-cmkss -- rm -rf /app/index.html
刷新浏览器再次查看Nginx的欢迎页,可以看到页面提示
403 Forbidden。

- 登录容器服务管理控制台。
- 在控制台左侧导航栏中,单击集群。
- 在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
- 在集群管理页左侧导航栏中,选择。
- 在存储卷页面,在目标存储卷右侧操作列单击回收站。
CNFS托管的NAS默认开启回收站,可以在控制台恢复Nginx的
index.html文件。
本示例的PV名称为
nas-ecaf6018-5250-4e19-b570-5d9e657d23bc。

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

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

- 刷新浏览器可以看到Nginx的欢迎页已恢复正常。
表示Nginx的
index.html文件已恢复。
