传统存储方案访问路径层级多、延迟高,会造成一定的I/O性能损耗。安全沙箱NAS直接挂载可以通过优化存储路径实现在容器内直接读写NAS,从而有效提升性能。本文介绍安全沙箱NAS直接挂载的实现原理,以及如何将NAS直接挂载到安全沙箱容器中。
背景信息
virtio-fs是一个共享的文件系统,可以将Volume、Secret、ConfigMap等共享到虚拟机GuestOS内,从而以原生的方式通过Volume挂载NAS。但这种方式下,NAS是挂载到主机上的,在容器内要经过virtio-fs读写主机上的NAS,由此会带来一些性能损耗。
安全容器提供了安全沙箱NAS直接挂载的功能。该功能会先卸载主机上的NAS挂载点,然后在GuestOS内挂载NAS,最后把NAS Bind Mount到容器内,从而能够在容器内直接读写NAS,达到接近原生的性能。
实现原理
实现安全沙箱的NAS直接挂载功能的流程如下:
kubelet请求CSI-Plugin挂载NAS卷。
CSI-Plugin在主机挂载NAS。
kubelet请求Kangaroo-Runtime创建容器。
Kangaroo-Runtime解析NAS挂载信息并传入GuestOS,同时卸载主机上的NAS。
Kangaroo-Runtime请求Agent创建容器。
Agent把NAS挂载到GuestOS内。
Agent把GuestOS上的NAS Bind Mount到容器内。
前提条件
- 重要
NAS实例的VPC需要和ACK集群的VPC一致。
操作步骤
创建静态PV。
将以下示例YAML内容保存为
nas-pv-csi.yaml
文件。apiVersion: v1 kind: PersistentVolume metadata: labels: alicloud-pvname: nas-pv-csi name: nas-pv-csi spec: accessModes: - ReadWriteMany capacity: storage: 5Gi csi: driver: nasplugin.csi.alibabacloud.com volumeAttributes: options: noresvport,nolock path: /csi server: ${nas-server-address} #填写为您实际获取的NAS挂载点地址。 vers: "3" volumeHandle: nas-pv-csi persistentVolumeReclaimPolicy: Retain
执行以下命令创建静态PV。
kubectl create -f nas-pv-csi.yaml
创建NAS存储声明PVC,使用
selector.matchLabels
筛选PV标签,精确配置PVC和PV的绑定关系。将以下示例YAML内容保存为
nas-pvc-csi.yaml
文件。apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nas-pvc-csi namespace: default spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi selector: matchLabels: alicloud-pvname: nas-pv-csi
执行以下命令创建静态PVC。
kubectl create -f nas-pvc-csi.yaml
创建示例应用,并挂载PVC。
将以下示例YAML内容保存为
deploy-nas-csi.yaml
文件。apiVersion: apps/v1 kind: Deployment metadata: name: deploy-nas-csi spec: replicas: 2 selector: matchLabels: app: busybox template: metadata: labels: app: busybox annotations: storage.alibabacloud.com/enable_nas_passthrough: "true" spec: runtimeClassName: runv containers: - name: busybox image: registry.cn-hangzhou.aliyuncs.com/acs/busybox:v1.29.2 command: - tail - -f - /dev/null volumeMounts: - name: nas-pvc mountPath: "/data" restartPolicy: Always volumes: - name: nas-pvc persistentVolumeClaim: claimName: nas-pvc-csi #需要和上一步创建的PVC名称一致,用于绑定PVC。
默认Pod不启用NAS直接挂载功能,您需要在模板中添加Annotation开启NAS直通功能。
annotations: storage.alibabacloud.com/enable_nas_passthrough: "true"
执行以下命令创建应用。
kubectl create -f deploy-nas-csi.yaml
验证NAS挂载结果。
执行以下命令,查看Pod信息。
kubectl get pods
预期输出:
NAME READY STATUS RESTARTS AGE deploy-nas-csi-847f8b****-qmv2m 1/1 Running 0 47s deploy-nas-csi-847f8b****-wj8k5 1/1 Running 0 47s
执行以下命令,进入指定的Pod。
kubectl exec -it deploy-nas-csi-847f8b****-qmv2m -- sh
执行以下命令,查看挂载信息。
mount
如果执行命令后有内容,表明NAS已经挂载成功。预期输出如下: