Kubernetes存储系统-NFS Server的Helm部署
- 本文翻译根据 https://github.com/kubernetes/charts/tree/master/stable/nfs-server-provisioner
- 本文地址 https://my.oschina.net/u/2306127/blog/1820434,By openthings,2018.05.29.
其它参考:
- Helm Charts仓库,https://github.com/kubernetes/charts
- 本文用到的yaml文件,https://github.com/openthings/kubernetes-tools/tree/master/nfs
- kunbernetes存储系统-基于NFS的PV服务,https://my.oschina.net/u/2306127/blog/1819620
- Jupyter Hub on Kubernetes Part II: NFS ,https://my.oschina.net/u/2306127/blog/1818470
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预先建好目录,可以替换成自己的目录。