Kubernetes环境中使用NAS动态存储卷

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 介绍 K8S在应用中经常会用到nas共享存储卷,通常的使用方法是通过一个pv、pvc进行挂载,但当需要pv、pvc数量很大的时候,手动创建显得非常繁琐,这时动态数据卷的功能可以满足您的需求。 以下场景: 当为不同的用户提供不同的nas子目录进行挂载的时候,可以考虑使用nas动态存储卷; 当使用S.

介绍

K8S在应用中经常会用到nas共享存储卷,通常的使用方法是通过一个pv、pvc进行挂载,但当需要pv、pvc数量很大的时候,手动创建显得非常繁琐,这时动态数据卷的功能可以满足您的需求。

以下场景:

当为不同的用户提供不同的nas子目录进行挂载的时候,可以考虑使用nas动态存储卷;

当使用SatefulSet部署应用,每个pod配置使用不同nas数据卷的时候;

本方案中实现的动态nas卷,是在某个nas文件系统下通过创建子目录、并把子目录映射为一个动态pv提供给应用;

部署详解

1. 部署Controller

kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: alicloud-nas-controller
  namespace: kube-system
spec:
  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
      priorityClassName: system-node-critical
      serviceAccount: admin
      hostNetwork: true
      containers:
        - name: nfs-provisioner
          image: registry.cn-hangzhou.aliyuncs.com/acs/alicloud-nas-controller:v1.14.3.8-58bf821-aliyun
          env:
          - name: PROVISIONER_NAME
            value: alicloud/nas
          securityContext:
            privileged: true
          volumeMounts:
          - mountPath: /var/log
            name: log
      volumes:
      - hostPath:
          path: /var/log
        name: log

2. StorageClass配置:

Nas Controller支持两种挂载驱动,flexvolume、nfs方式;

flexvolume:表示使用阿里云提供的flexvolume(alicloud/nas)作为挂载驱动,集群中需要部署flexvolume;

nfs:表示用时Kubernetes提供的标准挂载驱动;

Flexvolume方式:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
  server: "23a9649583-iaq37.cn-shenzhen.nas.aliyuncs.com:/nasroot1/,23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com:/nasroot2/"
  driver: flexvolume
provisioner: alicloud/nas
reclaimPolicy: Delete

mountOptions:

表示生成的pv option 配置,挂载nas卷时使用这个option挂载;

server:

表示生成目标pv所使用nas挂载点列表;格式为 nfsurl1:/path1,nfsurl2:/path2;

当配置多个server的时候,通过此storageclass创建的pv会轮询使用上述server作为配置参数;

driver:

支持flexvolume、nfs,默认为nfs;

reclaimPolicy:

pv的回收策略,建议配置为Retain;当配置为Delete时,删除pv后nas文件系统中的对应目录会默认修改名字(path-name ==> archived-path-name);

如果需要删除文件系统中对应的存储目录,可在storageclass中配置archiveOnDelete为false;

NFS 方式:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- noresvport
- vers=4.0
parameters:
  server: "23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com:/nasroot2/"
  driver: nfs
provisioner: alicloud/nas
reclaimPolicy: Delete

应用示例

1. 创建Flexvolume驱动数据卷

创建存储类:# kubectl create -f -

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- nolock,tcp,noresvport
- vers=3
parameters:
  server: "23a9649583-iaq37.cn-shenzhen.nas.aliyuncs.com:/nasroot1/,23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com:/nasroot2/"
  driver: flexvolume
provisioner: alicloud/nas
reclaimPolicy: Delete

创建statefulset应用,配置动态存储卷:

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---
apiVersion: apps/v1beta1
kind: StatefulSet
metadata:
  name: web
spec:
  serviceName: "nginx"
  replicas: 5
  volumeClaimTemplates:
  - metadata:
      name: html
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: alicloud-nas
      resources:
        requests:
          storage: 2Gi
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:alpine
        volumeMounts:
        - mountPath: "/data"
          name: html

检查生成的pvc、pv;

# kubectl get pvc | grep web
html-web-0      Bound         default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        96s
html-web-1      Bound         default-html-web-1-pvc-6b108a5b-b9e0-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        8m14s
html-web-2      Bound         default-html-web-2-pvc-661ebd73-b9e1-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        73s
html-web-3      Bound         default-html-web-3-pvc-69569748-b9e1-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        68s
html-web-4      Bound         default-html-web-4-pvc-6c52a277-b9e1-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        63s

下面看到使用了flexvolume驱动创建的pv:
# kubectl get pv default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf -oyaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: alicloud/nas
  creationTimestamp: "2019-08-08T13:35:20Z"
  finalizers:
  - kubernetes.io/pv-protection
  labels:
    createdby.aliyun.com: alicloud-nas-controller
    version.controller.aliyun.com: v1.14.3-1173ac8
  name: default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf
  resourceVersion: "2241971"
  selfLink: /api/v1/persistentvolumes/default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf
  uid: 5da7280c-b9e1-11e9-91a9-00163e10b7cf
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: html-web-0
    namespace: default
    resourceVersion: "2241962"
    uid: 58450866-b9e1-11e9-91a9-00163e10b7cf
  flexVolume:
    driver: alicloud/nas
    options:
      options: nolock,tcp,noresvport,vers=3
      path: /nasroot2/default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf
      server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
      vers: "3"
  persistentVolumeReclaimPolicy: Delete
  storageClassName: alicloud-nas
  volumeMode: Filesystem
status:
  phase: Bound

检查5个pv是否轮询使用server中的不同挂载点:

# for item in `kubectl get pv | grep web | awk '{print $1}'`; do  kubectl get pv $item -oyaml | grep server; done
      server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
      server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
      server: 23a9649583-iaq37.cn-shenzhen.nas.aliyuncs.com
      server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
      server: 23a9649583-iaq37.cn-shenzhen.nas.aliyuncs.com
      
# for item in `kubectl get pv | grep web | awk '{print $1}'`; do  kubectl get pv $item -oyaml | grep path; done
      path: /nasroot2/default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf
      path: /nasroot2/default-html-web-1-pvc-6b108a5b-b9e0-11e9-91a9-00163e10b7cf
      path: /nasroot1/default-html-web-2-pvc-661ebd73-b9e1-11e9-91a9-00163e10b7cf
      path: /nasroot2/default-html-web-3-pvc-69569748-b9e1-11e9-91a9-00163e10b7cf
      path: /nasroot1/default-html-web-4-pvc-6c52a277-b9e1-11e9-91a9-00163e10b7cf

nas文件系统中生成不同的子目录:

# ls nasroot1
default-html-web-2-pvc-661ebd73-b9e1-11e9-91a9-00163e10b7cf  default-html-web-4-pvc-6c52a277-b9e1-11e9-91a9-00163e10b7cf
# ls nasroot2
default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf  default-html-web-3-pvc-69569748-b9e1-11e9-91a9-00163e10b7cf
default-html-web-1-pvc-6b108a5b-b9e0-11e9-91a9-00163e10b7cf

删除应用pv、pvc,nas文件系统中目录名字改为archived-**

# ls nasroot1
archived-default-html-web-2-pvc-661ebd73-b9e1-11e9-91a9-00163e10b7cf.2019-08-08-13:38:37
archived-default-html-web-4-pvc-6c52a277-b9e1-11e9-91a9-00163e10b7cf.2019-08-08-13:38:37
# ls nasroot2
archived-default-html-web-0-pvc-58450866-b9e1-11e9-91a9-00163e10b7cf.2019-08-08-13:38:37
archived-default-html-web-1-pvc-6b108a5b-b9e0-11e9-91a9-00163e10b7cf.2019-08-08-13:38:37
archived-default-html-web-3-pvc-69569748-b9e1-11e9-91a9-00163e10b7cf.2019-08-08-13:38:37

2. 创建NFS驱动数据卷

创建存储类:# kubectl create -f -

archiveOnDelete: 配置为false,表示pv回收策略为Delete时,删除pv会把文件系统中的目录一起删除;

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- noresvport
- vers=4.0
parameters:
  server: "23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com:/nasroot2/"
  driver: nfs
  archiveOnDelete: "false"
provisioner: alicloud/nas
reclaimPolicy: Delete

创建statefulset,检查pv、pvc:

# kubectl get pvc | grep web
html-web-0      Bound         default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        2m4s
html-web-1      Bound         default-html-web-1-pvc-015441f5-b9e2-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        2m
html-web-2      Bound         default-html-web-2-pvc-3edcb47b-b9e2-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        17s
html-web-3      Bound         default-html-web-3-pvc-420f9bd8-b9e2-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        11s
html-web-4      Bound         default-html-web-4-pvc-4843579f-b9e2-11e9-91a9-00163e10b7cf   2Gi        RWO            alicloud-nas        1s

下面信息显示,pv使用的驱动为NFS:
# kubectl get pv default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf -oyaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: alicloud/nas
  creationTimestamp: "2019-08-08T13:39:50Z"
  finalizers:
  - kubernetes.io/pv-protection
  labels:
    createdby.aliyun.com: alicloud-nas-controller
    version.controller.aliyun.com: v1.14.3-1173ac8
  name: default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf
  resourceVersion: "2243033"
  selfLink: /api/v1/persistentvolumes/default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf
  uid: fef7e4d1-b9e1-11e9-91a9-00163e10b7cf
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  claimRef:
    apiVersion: v1
    kind: PersistentVolumeClaim
    name: html-web-0
    namespace: default
    resourceVersion: "2243017"
    uid: fed53a89-b9e1-11e9-91a9-00163e10b7cf
  mountOptions:
  - noresvport
  - vers=4.0
  nfs:
    path: /nasroot2/default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
  persistentVolumeReclaimPolicy: Delete
  storageClassName: alicloud-nas
  volumeMode: Filesystem
status:
  phase: Bound

检查5个pv的挂载点:

# for item in `kubectl get pv | grep web | awk '{print $1}'`; do  kubectl get pv $item -oyaml | grep server; done
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
    server: 23a9649583-ajv79.cn-shenzhen.nas.aliyuncs.com
# for item in `kubectl get pv | grep web | awk '{print $1}'`; do  kubectl get pv $item -oyaml | grep path; done
    path: /nasroot2/default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf
    path: /nasroot2/default-html-web-1-pvc-015441f5-b9e2-11e9-91a9-00163e10b7cf
    path: /nasroot2/default-html-web-2-pvc-3edcb47b-b9e2-11e9-91a9-00163e10b7cf
    path: /nasroot2/default-html-web-3-pvc-420f9bd8-b9e2-11e9-91a9-00163e10b7cf
    path: /nasroot2/default-html-web-4-pvc-4843579f-b9e2-11e9-91a9-00163e10b7cf

nas文件系统中生成不同的子目录:

# ls nasroot2/
default-html-web-0-pvc-fed53a89-b9e1-11e9-91a9-00163e10b7cf  default-html-web-3-pvc-420f9bd8-b9e2-11e9-91a9-00163e10b7cf
default-html-web-1-pvc-015441f5-b9e2-11e9-91a9-00163e10b7cf  default-html-web-4-pvc-4843579f-b9e2-11e9-91a9-00163e10b7cf
default-html-web-2-pvc-3edcb47b-b9e2-11e9-91a9-00163e10b7cf

删除应用pv、pvc,nas文件系统中目录同时被删除;(StorageClass中配置了archiveOnDelete: "false")

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
8月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
针对本地存储和 PVC 这两种容器存储使用方式,我们对 ACK 的容器存储监控功能进行了全新升级。此次更新完善了对集群中不同存储类型的监控能力,不仅对之前已有的监控大盘进行了优化,还针对不同的云存储类型,上线了全新的监控大盘,确保用户能够更好地理解和管理容器业务应用的存储资源。
540 264
|
6月前
|
存储 运维 Kubernetes
容器数据保护:基于容器服务 Kubernetes 版(ACK)备份中心实现K8s存储卷一键备份与恢复
阿里云ACK备份中心提供一站式容器化业务灾备及迁移方案,减少数据丢失风险,确保业务稳定运行。
|
6月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
124 0
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
|
7月前
|
存储 监控 对象存储
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
ACK 容器监控存储全面更新:让您的应用运行更稳定、更透明
111 1
|
8月前
|
存储 监控 对象存储
ACK容器监控存储全面更新:让您的应用运行更稳定、更透明
介绍升级之后的ACK容器监控体系,包括各大盘界面展示和概要介绍。
|
8月前
|
存储 Kubernetes 安全
k8s存储类型:emptyDir、hostPath、nfs、pvc及存储类storageclass的静态/动态创建pv
Kubernetes提供了多种存储类型,满足不同的应用需求。`emptyDir`和 `hostPath`适用于临时和宿主机存储需求,`nfs`适用于共享存储,`PersistentVolumeClaim`和 `StorageClass`实现了持久存储的灵活管理。通过理解和配置这些存储类型,可以有效提升Kubernetes集群的存储管理能力。
304 13
|
存储 Kubernetes 容器
k8s创建NFS动态存储
k8s创建NFS动态存储
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
本文介绍如何利用阿里云的分布式云容器平台ACK One的多集群应用分发功能,结合云效CD能力,快速将单集群CD系统升级为多集群CD系统。通过增加分发策略(PropagationPolicy)和差异化策略(OverridePolicy),并修改单集群kubeconfig为舰队kubeconfig,可实现无损改造。该方案具备多地域多集群智能资源调度、重调度及故障迁移等能力,帮助用户提升业务效率与可靠性。
|
4月前
|
资源调度 Kubernetes 调度
从单集群到多集群的快速无损转型:ACK One 多集群应用分发
ACK One 的多集群应用分发,可以最小成本地结合您已有的单集群 CD 系统,无需对原先应用资源 YAML 进行修改,即可快速构建成多集群的 CD 系统,并同时获得强大的多集群资源调度和分发的能力。
131 9
|
6月前
|
存储 Kubernetes 监控
K8s集群实战:使用kubeadm和kuboard部署Kubernetes集群
总之,使用kubeadm和kuboard部署K8s集群就像回归童年一样,简单又有趣。不要忘记,技术是为人服务的,用K8s集群操控云端资源,我们不过是想在复杂的世界找寻简单。尽管部署过程可能遇到困难,但朝着简化复杂的目标,我们就能找到意义和乐趣。希望你也能利用这些工具,找到你的乐趣,满足你的需求。
539 33

相关产品

  • 容器服务Kubernetes版
  • 推荐镜像

    更多