K8S環境中NAS卷添加noresvport方法

通過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到其他節點;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章