Toggle navigation
主页
English
K8S
Golang
Guitar
About Me
归档
标签
Welcome to Sanger's Blog!
k8s存储卷-基于nfs
K8S
2024-01-10 17:34:36
21
0
0
sanger
K8S
[TOC] # 1. nfs > nfs作为存储的后端,搭建比较容易,但不支持pvc扩容 https://kubernetes.io/zh/docs/concepts/storage/volumes nfs-client-provisioner 是一个Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有的NFS服务器提供存储 PV以 ${namespace}-${pvcName}-${pvName}的命名格式提供(在NFS服务器上) PV回收的时候以 archieved-${namespace}-${pvcName}-${pvName} 的命名格式(在NFS服务器上) ## 1.1 测试服务是否ok showmount -e 10.3.xxx.xxx ## 1.2 测试挂载 mkdir -p /mnt/dev mount -t nfs 10.3.xxx.xxx:/data/share/dev /mnt/dev -o proto=tcp -o nolock 以上都测试ok,就可以开始K8S做PVC的测试了 ## 1.3 基于k8s的使用 统一格式,namespace-pvc 这类名称,如有相关需求可以找sanger开通(原则上一个namespace一个pvc)。 > 参考 deployment ``` apiVersion: extensions/v1beta1 kind: Deployment metadata: annotations: labels: app: xxx name: xxx namespace: xxx spec: replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: xxx strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: creationTimestamp: null labels: app: xxx namespace: xxx spec: containers: - args: - xxx >> /etc/hosts&& cp ../../config/default.json default.json && nohup ./xxx -conf default command: - /bin/sh - -c image: reg.sanger.cc/xxx/xxx:v1 imagePullPolicy: Always name: xxx resources: limits: cpu: "0" memory: "0" requests: cpu: "0" memory: "0" terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /data/logs name: logs - mountPath: /data/exportFile # Notice name: pvc-xxx-dev - mountPath: /config name: config dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - hostPath: path: /data/logs type: "" name: logs - name: pvc-xxx-dev persistentVolumeClaim: # Notice claimName: xxx-pvc - configMap: defaultMode: 420 items: - key: dev.json path: default.json name: xxx-config name: config ``` # 2. 基于nfs的pvc pvc.yaml ``` kind: PersistentVolumeClaim apiVersion: v1 metadata: name: data-claim #namespace: test annotations: volume.beta.kubernetes.io/storage-class: "maizuo-nfs-storage" spec: accessModes: - ReadWriteMany #persistentVolumeReclaimPolicy: Retain resources: requests: storage: 5Gi ``` demo-nfs-pod.yaml ``` kind: Pod apiVersion: v1 metadata: name: demo-nfs-pod #namespace: share-storage spec: containers: - name: test-pod image: busybox:1.24 command: - "/bin/sh" args: - "-c" - "touch /mnt/SUCCESS && exit 0 || exit 1" volumeMounts: - name: nfs-pvc mountPath: "/mnt" restartPolicy: "Never" volumes: - name: nfs-pvc persistentVolumeClaim: claimName: data-claim ``` demo-deployment.yaml ``` apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: app: xxx name: xxx namespace: ns spec: minReadySeconds: 5 progressDeadlineSeconds: 600 replicas: 1 revisionHistoryLimit: 10 selector: matchLabels: app: xxx strategy: rollingUpdate: maxSurge: 1 maxUnavailable: 1 type: RollingUpdate template: metadata: creationTimestamp: null labels: app: xxx namespace: ns spec: containers: - args: - echo xxx command: - /bin/sh - -c image: reg.maizuo.com/ns/xxx:v3.7-20200903160958 imagePullPolicy: Always name: xxx resources: limits: cpu: 500m memory: 1000Mi requests: cpu: 300m memory: 500Mi terminationMessagePath: /dev/termination-log terminationMessagePolicy: File volumeMounts: - mountPath: /data/logs name: logs - mountPath: /data/exportFile name: pvc-data-test # 指定要挂载的路径(pod中的) - mountPath: /config name: config dnsPolicy: ClusterFirst restartPolicy: Always schedulerName: default-scheduler securityContext: {} terminationGracePeriodSeconds: 30 volumes: - hostPath: path: /data/logs type: "" name: logs - name: pvc-data-test # 指定pvc persistentVolumeClaim: # PVC claimName: data-claim # 指定pvc name - configMap: defaultMode: 420 items: - key: test.json path: default.json name: xxx-config name: config ``` # 3. NFS各版本通用参数 ``` 1.1 soft/hard 【参数说明】软挂载方式挂载系统,若NFS请求超时,则客户端向调用程序返回错误;如果使用硬连接方式则客户端一直重新请求直至成功。默认为hard。 【使用建议】对于关键数据业务,不希望业务由于网络延迟或服务器服务重启或短暂的过载等情况而中断,建议挂载时使用hard参数;对于非关键数据业务,希望客户端程序能尽快响应,可以使用soft参数。 1.2 timeo=n 【参数说明】客户端重传请求前等待时间。对于基于TCP的NFS服务,默认等待重传时间为60s。使用TCP协议时,NFS Client不执行任何超时backoff。对于UDP协议,client使用一个合适的算法,为常用的请求类型estimate合适的超时时间。但对不常用的请求类型使用timeo设置。如果timeo没有设置,不常用的请求类型1.1秒以后重试。在每次重发后,NFS Client会将timeout时间加倍,直到最大的60秒。 retrans=n:客户端返回错误前的重传次数。默认为重传3次。retrans与soft参数一起使用时才有效。 【使用建议】timeo、retrans这两个参数选择主要取决于网络性能。对于网络吞吐量小,延时高,抖动高,丢包率大的情况,建议将timeo,retrans两个参数值设置大一些。对于网络吞吐量大,延时低,抖动低,丢包率小的情况,建议将timeo,retrans两个参数值设置小一些。具体设置值因网络状况而定。 1.3 resize=n 【参数说明】每个READ命令字向服务器读取文件的最大字节数。实际数据小于或等于此值。resize必须是1024倍数的正整数,小于1024时自动设为4096,大于1048576时自动设为1048576。默认时,服务器和客户端进行协商后设置。 【使用建议】通常使用默认值,由客户端和服务器协商设置。对于拥塞的低速网络,可以将该值调小,向服务器发送较短的请求包来提高NFS性能。对于高速网络,可以将该值增大,减少向服务器发送的请求包,获得性能的提升。 1.4 wsize=n 【参数说明】每个WRITE命令字向服务器写入文件的最大字节数。实际数据小于或等于此值。resize必须是1024倍数的正整数,小于1024时自动设为4096,大于1048576时自动设为1048576。默认时,服务器和客户端进行协商后设置。 【使用建议】通常使用默认值,由客户端和服务器协商设置。对于拥塞的低速网络,可以将该值调小,向服务器发送较小的请求包来提高NFS性能。对于高速网络,可以将该值增大,减少向服务器发送的请求包,获得性能的提升。 1.5 async/sync 【参数说明】同步、异步挂载,客户端默认异步(async)。对于异步挂载,客户端下发的写数据会先缓存在内存中,达到一定大小或者其他条件(与客户端设置,状态有关),再一起发往服务端。而同步挂载,每次下发的写数据马上发到服务端。 【使用建议】建议用默认的异步挂载,可以提高业务性能。对于客户端应用层来说,完全感知不到数据是否发往服务端,只能感知数据已经写成功。同步挂载要求每个请求立即发到服务端,增加了请求连接、发送次数,对于小io场景性能差异很明显(io越小,差异越大,一般都能达到几倍甚至更大的差异)。 注:对于异步挂载,可能在查看io性能显现为性能波动。在客户端写入缓存期间iops可能就低,因为数据还未发到服务端。但是性能是完全正常的,应该说比同步更好。如果是要要追求界面上的平稳,那就建议改为同步挂载。(补充:追求一次小io的数据全部刷到服务端稳定存储时间小,不仅要求客户端同步挂载,还需要服务端共享也是同步导出,否则需要加上手动commit刷盘——flush)。 1.6 acregmin/acregmax 【参数说明】设置NFS客户端缓存普通文件属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短时间是3s,最长时间是60s。 1.7 acdirmin/acdirmax 【参数说明】设置NFS客户端缓存目录属性的最短时间和最长时间,单位为秒。超过此时间后对其进行更新。默认最短时间是3s,最长时间是60s。 1.8 ac/noac 【参数说明】设置是否缓存文件属性。为了提高性能,NFS客户端缓存文件属性(默认ac),然后每隔一段时间去检查文件属性后更新。在缓存有效期内,客户端不检测服务器上文件属性是否改变。默认为ac。 【使用建议】当服务器上共享文件的属性频繁地被多个客户端改变时,建议使用noac选项,或者使用ac并配合使用较小的acregmin/acregmax/acdirmin/acdirmax设置,这样就能获得较好的属性一致性。当服务器上共享文件的属性不会被频繁改变时,例如文件共享为只读,或者网络性能较好,建议使用默认的ac选项,然后根据实际的网络状况来调整acregmin/acregmax/acdirmin/acdirmax设置。 1.9 Actimeo 【参数说明】将acregmin/acregmax/acdirmin/acdirmax四个参数设置为相同时间,单位为秒。 1.10 bg/fg 【参数说明】设置挂载失败后的行为方式。默认的fg方式将立刻退出返回错误状态,bg方式是退出前将产生一个子进程在后台继续尝试挂载。 1.11 sharecache/nosharecache 【参数说明】设置客户端并发挂载同一文件系统时数据缓存和属性缓存的共享方式。设置为sharecache时,多个挂载共享共享同一缓存。设为nosharecache时,每个挂载各有一个缓存。默认为sharecache。 使用建议:该参数用于客户端多次挂载同一共享目录的情况,建议使用默认的sharecache选项。 1.12 resvport/noresvport 【参数说明】设置连接服务器是否使用保密源端口。默认的resvport设置保密端口,noresvport设置为非保密端口。内核2.6.28及以后版本支持。 1.13 lookupcache=mode 【参数说明】设置内核管理给定挂载点的目录项缓存方式。其中包括all/none/pos几种方式。客户端缓存LOOKUP命令字请求结果。如果请求的目录项在服务器上,则返回结果为正,否则为负。all的管理方式是在父目录缓存的属性失效前客户端缓存这两种目录项;pos是在父目录缓存的属性失效前客户端缓存结果为正的查询结果,总是重新验证结果为负的查询结果。none总是重新验证目录缓存项。默认为all管理方式,内核2.6.28及以后版本支持。 【使用建议】LOOKUP命令字的作用是将文件名转换文件句柄。对于多个客户端经常创建或删除文件的情况,建议使用none。其它情况选用all或者pos。 1.14 intr/nointr 【参数说明】设置是否允许信号中断挂载点的文件操作。如果指定intr,当NFS操作被信号中断时系统返回EINTR。指定nointr,信号不会中断NFS文件操作。默认为nointr。指定intr时,通常同时使用soft选项,防止数据损坏。内核2.6.25及以后不再支持。 1.15 cto/nocto 【参数说明】设置是否使用“关闭打开”缓存一致的特性。通常客户端打开文件时检查是否存在以及是否有权限,当关闭文件时刷新更改。当设置为nocto时,客户端使用非标准的试探来检查服务器上文件是否改变,对于只读和文件更改较少时情形有助于提高性能。 【使用建议】对于文件内容改变很少的情况,如服务器提供只读共享权限(文件系统以RO权限导出)给客户使用,建议使用nocto选项,这样可以提高性能。对于文件内容经常改变,客户端对文件缓存一致性要求较高,建议使用cto参数。 2 对NFS(NFS2/NFS3)有效的选项: 2.1 proto=transport 【参数说明】客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,mount命令选择服务器支持的协议。 2.2 tcp/udp 【参数说明】等价于proto=tcp和proto=udp选项。 【使用建议】在不稳定的复杂网络环境中建议使用tcp参数,在稳定的网络下可以使用udp参数。NFSv3/NFSv4支持tcp/udp,NFSv2只支持udp。 2.3 port=n 【参数说明】指定服务器NFS服务端口。如果NFS服务端口不在port上,则mount请求失败。未指定或设为0,mount命令根据服务器的rpcbind服务选择服务端口。 2.4 mountport=n 【参数说明】指定服务器上mountd的端口。如果mountd服务端口不在port上,则mount请求失败。未指定或设为0,mount命令根据服务器的rpcbind服务选择服务端口。该参数用于即使防火墙屏蔽rpcbind协议也能正常mount到服务器。 2.5 mountproto=transport 【参数说明】客户端向服务器发起MNT请求时和UMNT使用的协议,可以为udp或者tcp。该参数用于防火墙屏蔽特定的协议也能正常mount到服务器。 2.6 mounthost=name 【参数说明】设置开启mountd主机名。未指定时,mount命令认为mountd服务和NFS服务在同一主机上。 2.7 mountvers=n 【参数说明】设置连接服务器mountd时的RPC版本号。未指定时使用与请求的NFS版本相适应的版本号。该参数用于多个NFS服务运行于同一远程主机上。 2.8 namlen=n 【参数说明】设置挂载路径名的最大长度。未指定时,通过与服务器协商设定。大多数情况为255字节。 2.9 nfsvers/vers=n 【参数说明】设置使用NFS服务的NFS协议版本号。当文件系统为nfs时,Linux客户端支持NFS2和NFS3。如果不支持请求的版本,mount失败。未指定时,客户端先尝试使用NFS3,若失败再与服务器进行协商。 2.10 lock/nolock 【参数说明】选择是否使用NLM协议在服务器上锁文件。当选择nolock选项时,锁对于同一主机的应用有效,对不同主机不受锁的影响。默认为lock。 2.11 acl/noacl 【参数说明】设置是否在挂载时使用NFSACL协议。NFSACL协议不属于标准NFS协议,而是Solaris上的实现。未指定时,客户端与服务器协商检查服务器是否支持,如果支持则使用NFSACL。 2.12 rdirplus/nordirplus 【参数说明】设置是否使用NFS3的REAADDIRPLUS请求。默认为readdirplus。 3 对NFS4有效的选项: 3.1 proto=transpro 【参数说明】客户端向服务器发起传输请求使用的协议,可以为UDP或者TCP。未指定时,选用TCP。 3.2 port=n 【参数说明】指定服务器NFS服务端口。如果NFS服务端口不在port上,则mount请求失败。未指定时,客户端使用NFS标准的2049号端口。指定为0时,客户端选用服务器rpcbind服务支持的端口。 3.3 clientaddr=n.n.n.n 【参数说明】指定一个IPv4的主机地址使服务器能执行NFS4的回调请求。未指定时,mount命令尝试自己发现一个合适的回调地址。 ——注1:所有的参数说明都可以在linux系统用man nfs参看含义,对于有差异的客户端,请用此确认。 ——注2:为了描述简单明了,可能转义有差异,具体参见系统标准描述。 ——注3:没有“使用建议”的参数推荐使用默认参数。 ``` # 4. 附录 https://github.com/kubernetes-retired/external-storage/tree/master/nfs-client/deploy https://bbs.huaweicloud.com/blogs/114222
上一篇:
Ingress
下一篇:
ACK专有集群手动签发替换Apiserver证书指导
0
赞
21 人读过
新浪微博
微信
更多分享
腾讯微博
QQ空间
人人网
文档导航