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

 

posted @ 2020-04-08 15:51  张艳华  阅读(6555)  评论(1编辑  收藏  举报