k8s创建使用nfs的StorageClass
在k8s中pod需要持久化数据就需要挂卷,一般会使用pvc,这样就需要先有StorageClass,记录一下如何创建使用NFS共享存储的StorageClass
之前已经搭建了一个NFS共享存储了,参考 搭建NFS共享存储
用下面命令在k8s节点上安装NFS组件,可以用 showmount -e 查看共享存储,可以看到在10.110.30.216的主机上共享了/nfs-data 目录
yum -y install nfs-utils;
systemctl enable rpcbind;
systemctl start rpcbind;
1、手动创建一个pv和pvc测试一下nfs是否可用,将下面代码保存到文件后执行create安装命令 kubectl create -f pv-pvc.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-test
spec:
capacity:
storage: 1Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
nfs:
path: /nfs-data
server: 10.110.30.216
---
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pvc-test
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 100Mi
创建之后查看绑定信息,可以看到已经成功绑定了,说明k8s中可以使用这个NFS,可以继续下一步开始创建StorageClass了。
2、创建StorageClass参考github上的文档,nfs-client是一个自动预配置程序,它使用已有的NFS服务器来支持Kubernetes卷的动态预设置,官方的方法是通过安装一个nfs-client-provisioner,参考【nfs-client配置说明】,安装所用的yaml文件在deploy文件夹中 https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy 但是还是需要根据自己情况对文件做一些修改,默认使用的镜像是quay.io/external_storage/nfs-client-provisioner:latest,这个地址有可能无法访问,如果遇到无法访问的的情况可以试试其他的镜像仓库,例如去阿里云的仓库找找。
另外还提供了一个heml的chart包,地址 【nfs-client-provisioner的HELM包】,我这里集群已经安装helm了,先尝试用用这个方法。
3、修改chart包,将values.yaml中的部分参数值修改成实际值
nfs:
server: 10.110.30.216
path: /nfs-data
mountOptions:
reclaimPolicy: Retain
4、安装
helm install --name nfs-client-provisioner nfs-client-provisioner/
可以看到StorageClass已经创建出来了,下面测试一下是否可用,安装下面的nginx测试,注意storageClassName就是我们上面创建的StorageClass的名称
# nginx.yaml
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-nginx-demo
labels:
app.kubernetes.io/name: my-nginx-demo
app.kubernetes.io/version: "1.0"
spec:
replicas: 1
serviceName: my-nginx-demo-svc
selector:
matchLabels:
app.kubernetes.io/name: my-nginx-demo
template:
metadata:
labels:
app.kubernetes.io/name: my-nginx-demo
spec:
restartPolicy: Always
containers:
- name: my-nginx-demo
image: "nginx:1.17.9"
imagePullPolicy: IfNotPresent
ports:
- name: http
containerPort: 80
protocol: TCP
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: html
volumeClaimTemplates:
- metadata:
name: html
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
storageClassName: nfs-client
---
apiVersion: v1
kind: Service
metadata:
name: my-nginx-demo-svc
labels:
app.kubernetes.io/name: my-nginx-demo
app.kubernetes.io/version: "1.0"
spec:
# type: ClusterIP
# type: LoadBalancer
type: NodePort
ports:
- port: 80
targetPort: http
protocol: TCP
name: http
selector:
app.kubernetes.io/name: my-nginx-demo
kubectl create -f nginx.yaml 安装,然后查看pv、pvc以及pod可以看到都创建成功了,(pod的状态先忽略吧,现在是因为挂载目录为是nginx的文件目录,应该是现在目录为空导致启动异常,暂时先不处理这个了),然后我们看NFS服务端的工项目录,下面也创建了一个文件夹,对应着上面的pv
我们在nfs共享目录的文件夹里创建个测试文件,看看容器内是否生效
vi index.html 然后输入下面内容后保存 <html><body><h1>Test Page!</h1></body></html>
创建了文件之后,等一会pod的状态也正常了,通过service访问一下服务,也显示正常了
通过上面页面也可以看出来,pod挂的卷确实映射到了NFS服务共享出来的目录中了
5、上面是通过helm模板的方式安装的,如果没有helm,可以手动执行,直接参考 https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client 页面中的描述,按照实际情况修改 deploy 文件夹中的yaml文件,然后执行安装就可以,修改的内容主要就是namespace