挂载NAS
NAS是阿里云提供的一种可共享访问、弹性扩展、高可靠以及高性能的分布式文件系统。您可以通过FlexVolume在自建的Kubernetes集群使用阿里云NAS作为Volume。挂载NAS时,支持静态数据卷和动态数据卷,本文为您介绍如何使用PVC方式,挂载NAS到ECI Pod上。
前提条件
自建Kubernetes集群中已部署VNode。
如果您的Kubernetes集群部署在线下IDC,请确保已打通IDC与阿里云的网络。
注意事项
NAS为共享存储,一个NAS可以挂载到多个Pod上。此时,如果多个Pod同时修改相同数据,需要应用自行执行数据同步。
在卸载NAS前,请勿删除NAS挂载点,否则可能会造成操作系统无响应。
静态挂载NAS
创建NAS文件系统和挂载点。
创建PV。
参考参数说明表修改以下YAML内容,并保存为static-pv-nas.yaml。
apiVersion: v1 kind: PersistentVolume metadata: name: static-pv-nas spec: capacity: storage: 20Gi storageClassName: nas persistentVolumeReclaimPolicy: Recycle accessModes: - ReadWriteMany flexVolume: driver: "alicloud/nas" options: server: "1a93e496ef-****.cn-beijing.nas.aliyuncs.com" path: "/" vers: "3"
相关参数说明如下表所示:
参数
描述
driver
驱动类型。此处配置为
alicloud/nas
,表示使用阿里云NAS FlexVolume插件。server
NAS的挂载点地址。
path
挂载子目录。极速型NAS需要以
/share
为父目录,例如/share/path1
。vers
挂载NAS的NFS协议版本号。推荐使用v3,极速型NAS仅支持v3。
执行以下命令创建PV。
kubectl create -f static-pv-nas.yaml
创建PVC。
将以下内容保存为static-pvc-nas.yaml。
apiVersion: v1 kind: PersistentVolumeClaim metadata: name: static-pvc-nas spec: accessModes: - ReadWriteMany storageClassName: nas resources: requests: storage: 20Gi
执行以下命令创建PVC。
kubectl create -f static-pvc-nas.yaml
将NAS挂载到ECI Pod。
将以下内容保存为static-test-nas.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: static-test-nas labels: app: nginx spec: replicas: 2 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: nodeSelector: k8s.aliyun.com/vnode: "true" tolerations: - key: k8s.aliyun.com/vnode operator: "Equal" value: "true" effect: "NoSchedule" containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 ports: - containerPort: 80 volumeMounts: - name: pvc-nas mountPath: /data volumes: - name: pvc-nas persistentVolumeClaim: claimName: static-pvc-nas
执行以下命令创建Deployment。
kubectl create -f static-test-nas.yaml
查看结果。
kubectl get pods -o wide
预期返回:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES static-test-nas-79df5959d4-lvr4m 1/1 Running 0 26s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none> static-test-nas-79df5959d4-xdbwz 1/1 Running 0 26s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none>
查看Pod中的文件目录,可以看到已生成NAS对应的挂载目录
/data
,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用NAS存储。
动态挂载NAS
部署NAS-Controller组件
采用动态挂载的方式挂载NAS时,需要先部署阿里云NAS-Controller组件,该组件自动创建NAS类型的PV。
NAS-Controller组件必须部署在普通节点上,不支持部署在虚拟节点上。
创建用于部署NAS-Controller的YAML文件。
将以下内容保存为nas-controller.yaml。
apiVersion: v1 kind: ServiceAccount metadata: name: alicloud-nas-controller namespace: kube-system --- kind: ClusterRole apiVersion: rbac.authorization.k8s.io/v1 metadata: name: alicloud-nas-controller rules: - apiGroups: [""] resources: ["persistentvolumes"] verbs: ["get", "list", "watch", "create", "delete"] - apiGroups: [""] resources: ["persistentvolumeclaims"] verbs: ["get", "list", "watch", "update"] - apiGroups: ["storage.k8s.io"] resources: ["storageclasses"] verbs: ["get", "list", "watch"] - apiGroups: [""] resources: ["events"] verbs: ["list", "watch", "create", "update", "patch"] - apiGroups: [""] resources: ["endpoints"] verbs: ["get", "watch", "list", "delete", "update", "create"] --- kind: ClusterRoleBinding apiVersion: rbac.authorization.k8s.io/v1 metadata: name: alicloud-nas-controller subjects: - kind: ServiceAccount name: alicloud-nas-controller namespace: kube-system roleRef: kind: ClusterRole name: alicloud-nas-controller apiGroup: rbac.authorization.k8s.io --- kind: Deployment apiVersion: apps/v1 metadata: name: alicloud-nas-controller namespace: kube-system spec: selector: matchLabels: app: alicloud-nas-controller strategy: type: Recreate template: metadata: labels: app: alicloud-nas-controller spec: tolerations: - operator: Exists affinity: nodeAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: node-role.kubernetes.io/master operator: Exists requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: type operator: NotIn values: - virtual-kubelet priorityClassName: system-node-critical serviceAccount: alicloud-nas-controller hostNetwork: true containers: - name: nfs-provisioner image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.14.8.17-7b898e5-aliyun env: - name: PROVISIONER_NAME value: alicloud/nas securityContext: privileged: true volumeMounts: - mountPath: /var/log name: log volumes: - hostPath: path: /var/log name: log
部署组件。
kubectl create -f nas-controller.yaml
查看部署结果。
kubectl -n kube-system get pods
预期返回如下:
NAME READY STATUS RESTARTS AGE alicloud-nas-controller-6dccf695d5-zxkwg 1/1 Running 0 3m7s
挂载NAS
创建NAS文件系统和挂载点。
创建StorageClass。
参考参数说明表修改以下YAML内容,并保存为sc-nas.yaml。
apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: alicloud-nas-test mountOptions: - nolock,tcp,noresvport - vers=3 parameters: volumeAs: subpath server: "1e9064****-gk***.cn-beijing.nas.aliyuncs.com" provisioner: alicloud/nas reclaimPolicy: Retain
相关参数说明如下:
描述
mountOptions
配置NAS的options参数,包括NFS协议版本等。
volumeAs
PV类型。取值为subpath时,表示为子目录。NAS-Controller将自动创建NAS文件系统子目录。
server
创建子目录类型的PV时,NAS的挂载点地址。
provisioner
驱动类型。此处配置为
alicloud/nas
,表示使用阿里云NAS FlexVolume插件。reclaimPolicy
PV的回收策略,默认为Delete,支持Retain。
Delete:删除PVC时,PV和NAS文件系统会一起删除。
Retain:删除PVC时,PV和NAS文件系统不会被删除,需要您手动删除。
如果数据安全性要求高,推荐使用Retain方式以免误删数据。
执行以下命令创建StorageClass。
kubectl create -f sc-nas.yaml
创建NAS类型的PVC。
将以下内容保存为pvc-nas.yaml。
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: pvc-nas spec: accessModes: - ReadWriteMany storageClassName: alicloud-nas-test resources: requests: storage: 20Gi
执行以下命令创建PVC。
kubectl create -f pvc-nas.yaml
将NAS挂载到ECI实例。
将以下内容保存为test-nas.yaml。
apiVersion: apps/v1 kind: Deployment metadata: name: test-nas spec: replicas: 2 selector: matchLabels: app: uid template: metadata: labels: app: uid spec: nodeSelector: k8s.aliyun.com/vnode: "true" tolerations: - key: k8s.aliyun.com/vnode operator: "Equal" value: "true" effect: "NoSchedule" containers: - name: nginx image: registry-vpc.cn-beijing.aliyuncs.com/eci_open/nginx:1.14.2 volumeMounts: - mountPath: /data name: data volumes: - name: data persistentVolumeClaim: claimName: pvc-nas
执行以下命令创建Deployment。
kubectl create -f test-nas.yaml
查看结果。
kubectl get pods -o wide
预期返回:
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES test-nas-7cf4d9f796-4h2kj 1/1 Running 0 50s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none> test-nas-7cf4d9f796-dv5q2 1/1 Running 0 50s 172.16.XX.XX cn-beijing.vnd-2ze8nd8xcl33t4pa**** <none> <none>
查看Pod中的文件目录,可以看到已生成NAS对应的挂载目录
/data
,且第一个Pod中写入的文件可以在第二个Pod中查看,即两个Pod共享使用NAS存储。