K8S环境中NAS卷添加noresvport方法

34次阅读

共计 4235 个字符,预计需要花费 11 分钟才能阅读完成。

通过 K8S 使用 NAS 卷,请区分以下场景:

静态存储卷:

  • 使用阿里云 ACK,PV、PVC 方式,nfs 驱动;
  • 使用阿里云 ACK,PV、PVC 方式,Flexvolume 驱动;
  • 使用阿里云 ACK,Volume 方式,nfs 驱动;
  • 使用阿里云 ACK,Volume 方式,Flexvolume 驱动;
  • 自建 K8S,PV、PVC 方式,nfs 驱动;
  • 自建 K8S,Volume 方式,nfs 驱动;

动态存储卷:

  • 使用阿里云 ACK
  • 使用自建 K8S

静态卷 - 使用阿里云 Kubernetes(ACK)时

1. 使用 PV、PVC 方式(nfs 驱动)

首先确认当前的挂载是否配置了 noresvport 参数,参考 NAS 团队提供的方式;

例如当前的 pv 如下面 yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nas
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: 2Gi
  mountOptions:
  - vers=3
  nfs:
    path: /default
    server: 2564f49129-ggu23.cn-shenzhen.nas.aliyuncs.com
  persistentVolumeReclaimPolicy: Retain

编辑 PV:

kubectl edit pv pv-nas
更新 mountOptions:

mountOptions:
  - vers=4.0
  - noresvport

或者:

mountOptions:
  - vers=3
  - nolock,tcp,noresvport

重启使用这个 pv 的 pod;

需要注意:

由于一个节点上,如果已经有某个挂载点挂载在一个目录下了,其他的挂载 (相同挂载点) 即使配置了 noresvport 参数,还是会 follow 以前的挂载参数。即 noresvport 不生效;

解决方法:
方法 1:修改 pv 参数后,把所有使用这个挂载点的 pod 掉离这个节点,然后再调回来。
方法 2:使用新的挂载点创建新的 pv 使用(一个 nas 文件系统可以有 2 个挂载点);

示例方法 1:

集群中有 2 个 worker 节点,部署一个 deploy 包含 3 个 Pod;# kubectl get node | grep -v master
NAME                                 STATUS   ROLES    AGE   VERSION
cn-shenzhen.i-wz9c9m0m4oldr6mt89rd   Ready    <none>   55d   v1.12.6-aliyun.1
cn-shenzhen.i-wz9gvy73m4qyk03xzg1y   Ready    <none>   60d   v1.12.6-aliyun.1

# kubectl get pod
NAME                          READY   STATUS    RESTARTS   AGE
nas-static-784496fbb9-cqr97   1/1     Running   0          63m
nas-static-784496fbb9-gljbq   1/1     Running   0          63m
nas-static-784496fbb9-ngzkq   1/1     Running   0          63m

编辑 pv,添加 - nolock,tcp,noresvport Options;编辑 deploy,把这个 deploy 的 pod 都调度到节点:cn-shenzhen.i-wz9c9m0m4oldr6mt89rd 上;> 在 deploy 中添加 nodeName: cn-shenzhen.i-wz9c9m0m4oldr6mt89rd
> 如果您的集群节点较多,可以给一批节点添加 label,然后通过 nodeSelector 把 pod 调度到这写节点;> 参考:https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-pods-nodes/

注意:如果您用的时候 statefulset 的应用,需要把 updateStrategy.type 配置为 RollingUpdate;然后再把 pod 调度到其他节点:cn-shenzhen.i-wz9gvy73m4qyk03xzg1y

到节点 cn-shenzhen.i-wz9gvy73m4qyk03xzg1y 上验证 noresport,已经生效。2564f49129-ggu23.cn-shenzhen.nas.aliyuncs.com:/default on /var/lib/kubelet/pods/aa79e380-9bdb-11e9-a545-00163e0eff42/volumes/kubernetes.io~nfs/pv-nas type nfs (rw,relatime,vers=3,rsize=1048576,wsize=1048576,namlen=255,hard,nolock,noresvport,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=192.168.0.11,mountvers=3,mountport=4002,mountproto=tcp,local_lock=all,addr=192.168.0.11)

最后,由于当前使用 nas 的 pod 是有 nodeName 标签的,可以编辑 deploy,把 nodeName(nodeSelector)去掉。

2. 使用 PV、PVC 方式(Flexvolume 驱动)

首先确认当前的挂载是否配置了 noresvport 参数,参考 NAS 团队提供的方式;

例如当前的 pv 如下面 yaml:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-nas
spec:
  capacity:
    storage: 5Gi
  storageClassName: nas
  accessModes:
    - ReadWriteMany
  flexVolume:
    driver: "alicloud/nas"
    options:
      server: "0cd8b4a576-uih75.cn-hangzhou.nas.aliyuncs.com"
      path: "/k8s"
      vers: "3"

重启使用这个 pv 的 pod(升级 flexvolume 版本到最新);

需要注意:

由于一个节点上,如果已经有某个挂载点挂载在一个目录下了,其他的挂载 (相同挂载点) 即使配置了 noresvport 参数,还是会 follow 以前的挂载参数。即 noresvport 不生效;

解决方法:
方法 1:修改 pv 参数后,把所有使用这个挂载点的 pod 掉离这个节点,然后再调回来。
方法 2:使用新的挂载点创建新的 pv 使用(一个 nas 文件系统可以有 2 个挂载点);

参考示例方法 1

3. 使用 Volume 方式挂载(nfs 驱动)

不支持添加 noresvport 参数,请使用 pv、pvc 方式;

apiVersion: v1
kind: Pod
metadata:
  name: "flexvolume-nas-example"
spec:
  containers:
    - name: "nginx"
      image: "nginx"
      volumeMounts:
        - name: "nas1"
          mountPath: "/data"
  volumes:
    - name: "nas1"
      nfs:
        path: /
        server: 0cd8b4a576-grs79.cn-hangzhou.nas.aliyuncs.com

4. 使用 Volume 方式挂载(flexvolume 驱动)

apiVersion: v1
kind: Pod
metadata:
  name: "flexvolume-nas-example"
spec:
  containers:
    - name: "nginx"
      image: "nginx"
      volumeMounts:
        - name: "nas1"
          mountPath: "/data"
  volumes:
    - name: "nas1"
      flexVolume:
        driver: "alicloud/nas"
        options:
          server: "0cd8b4a576-grs79.cn-hangzhou.nas.aliyuncs.com"
          path: "/k8s"
          vers: "3"

重启使用这个 pv 的 pod(升级 flexvolume 版本到最新);

需要注意:

由于一个节点上,如果已经有某个挂载点挂载在一个目录下了,其他的挂载 (相同挂载点) 即使配置了 noresvport 参数,还是会 follow 以前的挂载参数。即 noresvport 不生效;

解决方法:
方法 1:修改 pv 参数后,把所有使用这个挂载点的 pod 掉离这个节点,然后再调回来。

方法 2:使用新的挂载点创建新的 pv 使用(一个 nas 文件系统可以有 2 个挂载点);

参考示例方法 1

静态卷 - 不使用 ACK,自建 K8S

参考上面 ACK 集群中使用 nfs 驱动的解决方案;

动态存储卷:

自建集群和 ACK 同下面方式;

对于使用下面 storageclass 创建的 pv,如果没有添加 noresvport 参数,其生成的 pv 也没有添加 noresvport:

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: alicloud-nas
mountOptions:
- vers=3
provisioner: alicloud/nas
reclaimPolicy: Retain

处理动态卷分为两个部分:

1. 更新 storageclass:

这样后续生成的 pv 会默认添加 noresvport 参数;编辑 stroageclass:

# kubectl edit sc alicloud-nas

mountOptions:
- nolock,tcp,noresvport
- vers=3

2. 更新存量 pv 的挂载

# kubectl get pv
pvc-b56f185a-9be4-11e9-a545-00163e0eff42   2Gi        RWO            Retain           Bound    default/html-web-0                                 alicloud-nas                   5h14m
pvc-bc6b1f8d-9be4-11e9-a545-00163e0eff42   2Gi        RWO            Retain           Bound    default/html-web-1                                 alicloud-nas                   5h14m
pvc-bf949736-9be4-11e9-a545-00163e0eff42   2Gi        RWO            Retain           Bound    default/html-web-2                                 alicloud-nas                   5h14m

同方法:使用 PV、PVC 方式(nfs 驱动)
在 pv 中添加 noresvport,
调度 pod 到其他节点;


本文作者:阚俊宝

阅读原文

本文为云栖社区原创内容,未经允许不得转载。

正文完
 0