Kubernetes存储系统-NFS Server的Helm部署

原创
2018/05/29 12:09
阅读数 2.7W

Kubernetes存储系统-NFS Server的Helm部署

其它参考:

NFS Server Provisioner 是Kubernetes源码外部的动态存储提供者,底层是通过NFS(网络文件系统)来提供的。你可以通过它快速地部署一个几乎可以在任何地方使用的网络共享存储。

该Helm chart 将会部署一个Kubernetes的 external-storage projects nfs 提供者,包含一个内建的NFS server,但是不会连接到一个已经存在的NFS server上(可以通过PV直接使用)。连接到已有的 NFS Server可以通过 NFS Client Provisioner 来访问。

$ helm install stable/nfs-server-provisioner

警告:上面的命令按照缺省参数安装,这虽然能够工作,但是存储在该卷上的数据将不会被持久保存到磁盘上。

注意:在运行时上面的命令之前,建议运行helm repo update来更新charts库到最新版本。如果通过代理访问,可以使用如下的命令(修改https_proxy为自己的代理服务地址):

sudo https_proxy=http://192.168.199.99:9999 helm repo update

1、简介

本项目的chart启动了一个nfs-server-provisioner部署,在Kubernetes集群上使用Helm包管理器来安装。

2、安装Chart

安装 chart ,版本名称去为 my-release,如下:

$ helm install stable/nfs-server-provisioner --name my-release

该命令使用缺省配置在Kubernetes上安装nfs-server服务器。该 configuration 节的参数列表可以在安装期间进行配置。

3、卸载 Chart

为了卸载/删除 my-release deployment,运行:

$ helm delete my-release

该命令将删除所有安装到kuubernetes中的组件。

4、配置

下面的表格列出了可以配置的参数:

Parameter Description Default
imagePullSecrets Specify image pull secrets nil (does not add image pull secrets to deployed pods)
image.repository The image repository to pull from quay.io/kubernetes_incubator/nfs-provisioner
image.tag The image tag to pull from v1.0.8
image.pullPolicy Image pull policy IfNotPresent
service.type service type ClusterIP
service.nfsPort TCP port on which the nfs-server-provisioner NFS service is exposed 2049
service.mountdPort TCP port on which the nfs-server-provisioner mountd service is exposed 20048
service.rpcbindPort TCP port on which the nfs-server-provisioner RPC service is exposed 51413
service.nfsNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the NFS service nil
service.mountdNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the mountd service nil
service.rpcbindNodePort if service.type is NodePort and this is non-empty, sets the nfs-server-provisioner node port of the RPC service nil
persistence.enabled Enable config persistence using PVC false
persistence.storageClass PVC Storage Class for config volume nil
persistence.accessMode PVC Access Mode for config volume ReadWriteOnce
persistence.size PVC Storage Request for config volume 1Gi
storageClass.create Enable creation of a StorageClass to consume this nfs-server-provisioner instance true
storageClass.provisionerName The provisioner name for the storageclass cluster.local/{release-name}-{chart-name}
storageClass.defaultClass Whether to set the created StorageClass as the clusters default StorageClass false
storageClass.name The name to assign the created StorageClass nfs
resources Resource limits for nfs-server-provisioner pod {}
nodeSelector Map of node labels for pod assignment {}
tolerations List of node taints to tolerate []
affinity Map of node/pod affinities {}
$ helm install stable/nfs-server-provisioner --name my-release \
  --set=image.tag=v1.0.8,resources.limits.cpu=200m

可选的方法,通过YAML文件来指定这些参数,例如:

$ helm install stable/nfs-server-provisioner --name my-release -f values.yaml

提示: 你可以使用缺省的 values.yaml作为例子。

5、持久化

该 nfs-server-provisioner 镜像文件存储了它的配置数据,更重要的是, 其 dynamic volumes 所管理的 /export 路径。

The chart mounts a Persistent Volume volume at this location. The volume can be created using dynamic volume provisioning. However, it is highly recommended to explicitly specify a storageclass to use rather than accept the clusters default, or pre-create a volume for each replica.

If this chart is deployed with more than 1 replica, storageClass.defaultClass=true and persistence.storageClass, then the 2nd+ replica will end up using the 1st replica to provision storage - which is likely never a desired outcome.

5.1 建议的持久化配置例子

  • 下面的配置参数可以在values.yaml中修改,决定nfs-server-provisioner的基础配置。

下面是一个建议的配置例子,当另外的storage class存在用于提供持久化:

persistence:
  enabled: true
  storageClass: "standard"
  size: 200Gi

storageClass:
  defaultClass: true

在很多集群上,cloud provider集成将创建一个 "standard" storage class,其将创建一个 volume (e.g. a Google Compute Engine Persistent Disk or Amazon EBS volume) 来提供持久性。

下面是没有另外的 storage class提供持久化的例子:

persistence:
  enabled: true
  storageClass: "-"
  size: 200Gi

storageClass:
  defaultClass: true

在这个配置中, PersistentVolume 必须为每一个复制创建,使其可用。安装Helm chart,然后查看 PersistentVolumeClaim 将会创建并为你的 PersistentVolume绑定提供需要的名称。

  • 在gce上部署基础nfs-server-provisioner服务

必要的 PersistentVolume例子:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-nfs-server-provisioner-0
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadWriteOnce
  gcePersistentDisk:
    fsType: "ext4"
    pdName: "data-nfs-server-provisioner-0"
  claimRef:
    namespace: kube-system
    name: data-nfs-server-provisioner-0
  • 在本地机器上部署基础nfs-server-provisioner服务

下面是运行在裸机上的配置例子,使用hostPath存储卷类型:

persistence:
  enabled: true
  storageClass: "-"
  size: 200Gi

storageClass:
  defaultClass: true

nodeSelector:
  kubernetes.io/hostname: {node-name}

在这个配置中, PersistentVolume 必须为每一个复制创建,使其可用。安装 Helm chart,然后查看 PersistentVolumeClaim's已经创建并为 PersistentVolume 的绑定提供需要的名称。

5.2 创建PV

必要的 PersistentVolume的例子:

apiVersion: v1
kind: PersistentVolume
metadata:
  name: data-nfs-server-provisioner-0
spec:
  capacity:
    storage: 200Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /srv/volumes/data-nfs-server-provisioner-0
  claimRef:
    namespace: kube-system
    name: data-nfs-server-provisioner-0

警告: hostPath volumes 不能在Kubernetes集群的不同节点机器间迁移。 因此,我们限制来了 nfs-server-provisioner pod运行在单个node上。这对于产品生产环境的部署来说不一定合适。

      至此,基于NFS的NFS提供者和PV卷已经部署完毕,可以通过创建PVC和使用PVC的Pod来访问,或者直接将PV服务mount到本地目录,可以直接读写。参见下面的5.3、5.4、5.5节内容。

5.3 创建PVC

保存下面的内容为nfs-pvc.yaml:

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: nfs-pvc
spec:
  storageClassName: "nfs"
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 100Mi

运行:

kubectl create -f nfs-pvc.yaml

到Persistent Volumes查看,将会为PVC自动创建一个PV。

5.4 使用PVC

在pod中,可以使用上面创建的pvc。保存下面的文件为nfs-pvc-client.yaml。

# This mounts the nfs volume claim into /mnt and continuously
# overwrites /mnt/index.html with the time and hostname of the pod. 
apiVersion: v1
kind: Deployment
metadata:  
  name: busybox-deployment
spec:  
  replicas: 1  
  selector:    
    name: busybox-deployment
  template:    
    metadata:      
      labels:        
        name: busybox-deployment    
    spec:      
      containers:      
      - image: busybox        
        command:          
        - sh          
        - -c          
        - 'while true; do date > /mnt/index.html; hostname >> /mnt/index.html; sleep $(($RANDOM % 5 + 5)); done'        
        imagePullPolicy: IfNotPresent        
        name: busybox        
        volumeMounts:          
        # name must match the volume name below          
        - name: nfs            
          mountPath: "/mnt"     
     # 
     volumes:      
     - name: nfs        
       persistentVolumeClaim:          
         claimName: nfs-pvc

本Pod将进行一个写入文件操作。执行:

kubectl create -f nfs-pvc-client.yaml

然后到Dashboard的pods栏可以看到pod的启动情况,或者运行kubectl get pod -o wide查看列表。

⚠️注意

第一次部署上述的pod时,总是提示mount failed。在宿主机安装nfs的支持库后,刷新状态变为正常。

sudo apt install nfs-common nfs-kernel-server

如上所示,需要刷新Kubernetes的Dashboard控制面板。

5.5 直接连接

所创建的nfs-server是可以从外部通过nfs-client访问的,也可以mount到宿主机上去。如下操作:

sudo mount -t nfs 10.108.7.49:/export/pvc-faebddde-651e-11e8-a532-1831bfb4e036 /home/openthings/nfs

其中,10.108.7.49:/export/pvc-faebddde-651e-11e8-a532-1831bfb4e036 是上面通过pvc创建的pv,可以通过Kubernetes dashboard的Persistent Volumes查看里面的Source内容,然后替换进来。本地挂载目录 /home/openthings/nfs 需要用mkdir预先建好目录,可以替换成自己的目录。

展开阅读全文
加载中

作者的其它热门文章

打赏
0
4 收藏
分享
打赏
0 评论
4 收藏
0
分享
返回顶部
顶部