通过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
Swarm存储卷:
静态卷-使用阿里云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:在NAS控制台上新建一个挂载点,然后按照文档 添加NAS挂载点 新建pv、新建pod,将业务逐渐迁到使用新挂载点的新建pod上。最后逐渐淘汰使用老挂载点的容器,删除老挂载点。(请注意,每个NAS实例最多只能创建两个挂载点)
方法2:修改pv参数后,把所有使用这个挂载点的pod调离这个节点,然后再调回来。(需要重启所有pod,请在业务低峰期一台一台变更,避免同时变更。pod调度方法请参考文档 Pod调度文档 )
示例方法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:在NAS控制台上新建一个挂载点,然后按照文档 添加NAS挂载点 新建pv、新建pod,将业务逐渐迁到使用新挂载点的新建pod上。最后逐渐淘汰使用老挂载点的容器,删除老挂载点。(请注意,每个NAS实例最多只能创建两个挂载点)
方法2:修改pv参数后,把所有使用这个挂载点的pod调离这个节点,然后再调回来。(需要重启所有pod,请在业务低峰期一台一台变更,避免同时变更。pod调度方法请参考文档 Pod调度文档 )
参考示例方法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:在NAS控制台上新建一个挂载点,然后按照文档 添加NAS挂载点 新建pv、新建pod,将业务逐渐迁到使用新挂载点的新建pod上。最后逐渐淘汰使用老挂载点的容器,删除老挂载点。(请注意,每个NAS实例最多只能创建两个挂载点)
方法2:修改pv参数后,把所有使用这个挂载点的pod调离这个节点,然后再调回来。(需要重启所有pod,请在业务低峰期一台一台变更,避免同时变更。pod调度方法请参考文档 Pod调度文档 )
静态卷-不使用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到其他节点;
Swarm环境存储卷:
Swarm已经停止更新,不支持配置noresvport参数,建议逐渐迁移到K8S上面,然后按照本文中对应的K8S场景操作。暂时无法迁移并不要紧,不使用noresvport连接也可以恢复,但恢复时间需要好几分钟。使用noresvport则可以很快恢复。