K8S环境中NAS卷添加noresvport方法

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 通过K8S使用NAS卷,请区分以下场景: 静态存储卷:   使用阿里云ACK,PV、PVC方式,nfs驱动;   使用阿里云ACK,PV、PVC方式,Flexvolume驱动;   使用阿里云ACK,Volume方式,nfs驱动;   使用阿里云ACK,Volume方式,Flexvolume驱动;.

通过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调度文档

参考示例方法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到其他节点;

Swarm环境存储卷:

Swarm已经停止更新,不支持配置noresvport参数,建议逐渐迁移到K8S上面,然后按照本文中对应的K8S场景操作。暂时无法迁移并不要紧,不使用noresvport连接也可以恢复,但恢复时间需要好几分钟。使用noresvport则可以很快恢复。

相关实践学习
基于ECS和NAS搭建个人网盘
本场景主要介绍如何基于ECS和NAS快速搭建个人网盘。
阿里云文件存储 NAS 使用教程
阿里云文件存储(Network Attached Storage,简称NAS)是面向阿里云ECS实例、HPC和Docker的文件存储服务,提供标准的文件访问协议,用户无需对现有应用做任何修改,即可使用具备无限容量及性能扩展、单一命名空间、多共享、高可靠和高可用等特性的分布式文件系统。 产品详情:https://www.aliyun.com/product/nas
目录
相关文章
|
2月前
|
Kubernetes Cloud Native 容器
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
完全免费的K8S学习平台:在线集群环境助力你的云原生之路!
181 1
|
2月前
|
Kubernetes Ubuntu Shell
wsl Ubuntu环境 创建 k8s集群
wsl Ubuntu环境 创建 k8s集群
|
2月前
|
JSON Kubernetes Linux
Linux环境签发CA证书和K8s需要的证书
Linux环境签发CA证书和K8s需要的证书
54 0
|
2月前
|
Kubernetes Java 测试技术
ChaosBlade常见问题之在K8s环境下演练cpu满载报错如何解决
ChaosBlade 是一个开源的混沌工程实验工具,旨在通过模拟各种常见的硬件、软件、网络、应用等故障,帮助开发者在测试环境中验证系统的容错和自动恢复能力。以下是关于ChaosBlade的一些常见问题合集:
106 0
|
2月前
|
存储 数据采集 Kubernetes
一文详解K8s环境下Job类日志采集方案
本文介绍了K8s中Job和Cronjob控制器用于非常驻容器编排的场景,以及Job容器的特点:增删频率高、生命周期短和突发并发大。文章重点讨论了Job日志采集的关键考虑点,包括容器发现速度、开始采集延时和弹性支持,并对比了5种采集方案:DaemonSet采集、Sidecar采集、ECI采集、同容器采集和独立存储采集。对于短生命周期Job,建议使用Sidecar或ECI采集,通过调整参数确保数据完整性。对于突发大量Job,需要关注服务端资源限制和采集容器的资源调整。文章总结了不同场景下的推荐采集方案,并指出iLogtail和SLS未来可能的优化方向。
|
9天前
|
Prometheus 监控 Kubernetes
深入理解Prometheus: Kubernetes环境中的监控实践
Kubernetes简介 在深入Prometheus与Kubernetes的集成之前,首先简要回顾一下Kubernetes的核心概念。Kubernetes是一个开源的容器编排平台,用于自动化容器的部署、扩展和管理。它提供了高度的可扩展性和灵活性,使得它成为微服务和云原生应用的理想选择。 核心组件 • 控制平面(Control Plane):集群管理相关的组件,如API服务器、调度器等。 • 工作节点(Nodes):运行应用容器的机器。 • Pods:Kubernetes的基本运行单位,可以容纳一个或多个容器。
|
6天前
|
消息中间件 Kubernetes Android开发
消息队列 MQ产品使用合集之如何在kubernetes环境里面部署
消息队列(MQ)是一种用于异步通信和解耦的应用程序间消息传递的服务,广泛应用于分布式系统中。针对不同的MQ产品,如阿里云的RocketMQ、RabbitMQ等,它们在实现上述场景时可能会有不同的特性和优势,比如RocketMQ强调高吞吐量、低延迟和高可用性,适合大规模分布式系统;而RabbitMQ则以其灵活的路由规则和丰富的协议支持受到青睐。下面是一些常见的消息队列MQ产品的使用场景合集,这些场景涵盖了多种行业和业务需求。
|
8天前
|
前端开发 Devops 测试技术
阿里云云效产品使用问题之更换所部署的环境关联的ACK集群该如何实现
云效作为一款全面覆盖研发全生命周期管理的云端效能平台,致力于帮助企业实现高效协同、敏捷研发和持续交付。本合集收集整理了用户在使用云效过程中遇到的常见问题,问题涉及项目创建与管理、需求规划与迭代、代码托管与版本控制、自动化测试、持续集成与发布等方面。
|
2月前
|
域名解析 Kubernetes 网络协议
【域名解析DNS专栏】云原生环境下的DNS服务:Kubernetes中的DNS解析
【5月更文挑战第29天】本文探讨了Kubernetes中的DNS解析机制,解释了DNS如何将服务名转换为网络地址,促进集群内服务通信。Kubernetes使用kube-dns或CoreDNS作为内置DNS服务器,每个Service自动分配Cluster IP和DNS条目。通过示例展示了创建Service和使用DNS访问的流程,并提出了优化DNS解析的策略,包括使用高性能DNS解析器、启用DNS缓存及监控日志,以实现更高效、可靠的DNS服务。
|
2月前
|
Kubernetes Perl 容器
在 Kubernetes 中重启 pod 的 3 种方法
【4月更文挑战第25天】
1030 1
在 Kubernetes 中重启 pod 的 3 种方法

相关产品

  • 容器服务Kubernetes版