基于Kubernetes的框架和应用系列之二:在Kubernetes部署NFS作为Persistent Volume

 

一、前言

Kubernetes支持NFS作为外部永久存储分配给容器使用,这种简易方式适用于小范围低强度的文件共享和持久化。

为了使得NFS能够和Kubernetes进行云原生的结合,需要一个nfs-provisioner来进行粘合,比如nfs-client-provisioner

转载自https://blog.csdn.net/cloudvtech

二、安装NFS服务器

2.1 安装软件 

mkdir /home/nfs
cd /home/nfs/
yum install nfs-utils
systemctl enable rpcbind
systemctl enable nfs
systemctl start rpcbind
systemctl start nfs
firewall-cmd --zone=public --permanent --add-service=rpc-bind
firewall-cmd --zone=public --permanent --add-service=mountd
firewall-cmd --zone=public --permanent --add-service=nfs
firewall-cmd --reload
chmod 755  /home/nfs/

2.2 配置 /etc/exports

/home/nfs *(insecure,rw,sync,no_root_squash,no_all_squash)

systemctl restart nfs

showmount -e localhost
Export list for localhost:
/home/nfs *

2.3 在客户端测试

 yum install nfs-utils
 systemctl enable rpcbind
 systemctl start rpcbind
 showmount -e 172.2.2.13
 mkdir /mnt/nfs
 mount -t nfs 172.2.2.13:/home/nfs /mnt/nfs/
 mount
 touch /mnt/nfs/test
 ls /mnt/nfs/test  -l

转载自https://blog.csdn.net/cloudvtech

三、安装nfs-client-provisioner

通过helm安装

helm install stable/nfs-client-provisioner --set nfs.server=172.2.2.13 --set nfs.path=/home/nfs 
NAME:   quiet-toucan
LAST DEPLOYED: Wed Oct 10 09:21:19 2018
NAMESPACE: default
STATUS: DEPLOYED
RESOURCES:
==> v1/StorageClass
NAME        PROVISIONER                                        AGE
nfs-client  cluster.local/quiet-toucan-nfs-client-provisioner  31s
==> v1/ServiceAccount
NAME                                 SECRETS  AGE
quiet-toucan-nfs-client-provisioner  1        31s
==> v1/ClusterRole
NAME                                        AGE
quiet-toucan-nfs-client-provisioner-runner  31s
==> v1/ClusterRoleBinding
NAME                                     AGE
run-quiet-toucan-nfs-client-provisioner  31s
==> v1/Role
NAME                                                AGE
leader-locking-quiet-toucan-nfs-client-provisioner  31s
==> v1/RoleBinding
NAME                                                AGE
leader-locking-quiet-toucan-nfs-client-provisioner  31s
==> v1/Deployment
NAME                                 DESIRED  CURRENT  UP-TO-DATE  AVAILABLE  AGE
quiet-toucan-nfs-client-provisioner  1        1        1           0          31s
==> v1/Pod(related)
NAME                                                 READY  STATUS             RESTARTS  AGE
quiet-toucan-nfs-client-provisioner-88d4c9564-vccgr  0/1    ContainerCreating  0         31s

确认POD和StorageClass

[root@k8s-master-01 nfs-client]# kubectl get pod | grep nfs
quiet-toucan-nfs-client-provisioner-88d4c9564-vccgr   1/1       Running     0          18m

[root@k8s-master-01 nfs-client]# kubectl get sc
NAME                  PROVISIONER                                         AGE
nfs-client            cluster.local/quiet-toucan-nfs-client-provisioner   18m

转载自https://blog.csdn.net/cloudvtech

四、使用StorageClass based NFS

PVC文件:test-claim.yaml

kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: test-claim
  annotations:
    volume.beta.kubernetes.io/storage-class: "nfs-client"
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 1Mi

使用PVC:test-pod.yaml

kind: Pod
apiVersion: v1
metadata:
  name: test-pod
spec:
  containers:
  - name: test-pod
    image: gcr.io/google_containers/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: test-claim

创建PVC和POD

kubectl create -f deploy/test-claim.yaml -f deploy/test-pod.yaml

查看在NFS共享目录下由Kubernetes自动创建的PVC目录

ls /home/nfs//default-test-claim-pvc-879d441b-cc70-11e8-9135-fa163ebda1b8/
SUCCESS
kubectl describe pv pvc-879d441b-cc70-11e8-9135-fa163ebda1b8
Name:            pvc-879d441b-cc70-11e8-9135-fa163ebda1b8
Labels:          <none>
Annotations:     pv.kubernetes.io/provisioned-by=cluster.local/quiet-toucan-nfs-client-provisioner
Finalizers:      [kubernetes.io/pv-protection]
StorageClass:    nfs-client
Status:          Bound
Claim:           default/test-claim
Reclaim Policy:  Delete
Access Modes:    RWX
Capacity:        1Mi
Node Affinity:   <none>
Message:         
Source:
    Type:      NFS (an NFS mount that lasts the lifetime of a pod)
    Server:    172.2.2.13
    Path:      /home/nfs/default-test-claim-pvc-879d441b-cc70-11e8-9135-fa163ebda1b8
    ReadOnly:  false
Events:        <none>
kubectl describe pvc test-claim
Name:          test-claim
Namespace:     default
StorageClass:  nfs-client
Status:        Bound
Volume:        pvc-879d441b-cc70-11e8-9135-fa163ebda1b8
Labels:        <none>
Annotations:   pv.kubernetes.io/bind-completed=yes
               pv.kubernetes.io/bound-by-controller=yes
               volume.beta.kubernetes.io/storage-class=nfs-client
               volume.beta.kubernetes.io/storage-provisioner=cluster.local/quiet-toucan-nfs-client-provisioner
Finalizers:    [kubernetes.io/pvc-protection]
Capacity:      1Mi
Access Modes:  RWX
Events:
  Type    Reason                 Age              From                                                                                                                                        Message
  ----    ------                 ----             ----                                                                                                                                        -------
  Normal  Provisioning           7m               cluster.local/quiet-toucan-nfs-client-provisioner_quiet-toucan-nfs-client-provisioner-88d4c9564-vccgr_52eca4e7-cc6d-11e8-a267-8a77c6fda26c  External provisioner is provisioning volume for claim "default/test-claim"
  Normal  ProvisioningSucceeded  7m               cluster.local/quiet-toucan-nfs-client-provisioner_quiet-toucan-nfs-client-provisioner-88d4c9564-vccgr_52eca4e7-cc6d-11e8-a267-8a77c6fda26c  Successfully provisioned volume pvc-879d441b-cc70-11e8-9135-fa163ebda1b8
  Normal  ExternalProvisioning   4m (x3 over 4m)  persistentvolume-controller                                                                                                                 waiting for a volume to be created, either by external provisioner "cluster.local/quiet-toucan-nfs-client-provisioner" or manually created by system administrator

在POD内查看

kubectl exec -it test-pod sh

/ # mount | grep nfs

172.2.2.13:/home/nfs/default-test-claim-pvc-27b0d062-8cda-11e9-b430-fa163ebda1b8 on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=172.2.2.11,local_lock=none,addr=172.2.2.13)

/ # ls -l /mnt/

total 0

-rw-r--r--    1 root     root             0 Jun 12 06:21 SUCCESS

转载自https://blog.csdn.net/cloudvtech

 

 

 

 

 

03-21
### Kubernetes 使用 NFS 配置存储卷的最佳实践 #### 1. 动态配置 NFS 存储卷 为了在 Kubernetes 中动态配置 NFS 存储卷,通常会使用 `NFS-Subdir-External-Provisioner` 或类似的工具来实现自动化的 PV(Persistent Volume)创建过程。这种方案允许用户基于现有的 NFS 共享资源,在不手动干预的情况下完成存储分配。 以下是具体的操作流程: - **安装 NFS-Subdir-External-Provisioner**: 用户可以通过 Helm Chart 或 YAML 文件部署该组件到 Kubernetes 集群中[^2]。 - **定义 StorageClass**: 创建一个自定义的 `StorageClass` 对象,用于指定 NFS 提供程序的相关参数以及默认选项。例如: ```yaml apiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: managed-nfs-storage provisioner: example.com/nfs-subdir-external-provisioner parameters: archiveOnDelete: "false" ``` - **验证部署状态**: 确认 `nfs-client-provisioner` 是否正常运行,可通过命令检查 Pod 的健康状况[^3]: ```bash kubectl get pods -n nfs-client-provisioner ``` #### 2. 手动挂载 NFS 卷 如果不需要动态配置功能,则可以选择静态方式绑定 NFS 资源至容器实例。这种方式适合于固定不变的工作负载或者测试环境下的简单集成需求。 操作步骤如下所示: - **准备 PersistentVolume (PV)**: 编写一份描述目标路径服务地址的 YAML 定义文档并应用之: ```yaml apiVersion: v1 kind: PersistentVolume metadata: name: manual-nfs-pv spec: capacity: storage: 5Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /exports/data server: nfsserver.example.com ``` - **关联 PersistentVolumeClaim (PVC)**: 接下来声明 PVC 请求对应大小的空间并与上述 PV 进行匹配连接: ```yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: manual-nfs-pvc spec: accessModes: - ReadWriteMany resources: requests: storage: 5Gi ``` 最后一步是在工作负载模板里引用这个 PVC 实现数据持久化支持。 --- ### 结合 Spark Kubernetes 场景中的最佳实践 当涉及到像 Apache Spark 这样的大数据处理框架时,合理规划分布式计算节点之间的共享文件访问机制尤为重要。借助 NFS 可以为临时中间结果保存区域提供统一视图从而提升整体性能表现[^1]。 推荐做法包括但不限于以下几个方面: - 尽量减少单次读写的块尺寸以适应频繁的小规模 I/O 操作模式; - 利用多副本冗余策略增强可靠性防止因单一磁盘故障引发的任务失败风险; - 根据实际业务特点调整缓存命中率优化算法降低延迟开销; ```python from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("K8s-NFSSample") \ .config("spark.hadoop.fs.defaultFS", "file:///mnt/nfsshare/") \ .getOrCreate() ``` 以上代码片段展示了如何设置 Hadoop FileSystem 属性指向已挂接好的 NFS 目录位置作为输入/输出基址。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值