侧边栏壁纸
博主头像
惬意小蜗牛博主等级

海内存知己,天涯若比邻!

  • 累计撰写 54 篇文章
  • 累计创建 143 个标签
  • 累计收到 59 条评论

目 录CONTENT

文章目录

k8s 基于NFS部署storageclass pv自动供给

惬意小蜗牛
2021-07-21 / 0 评论 / 0 点赞 / 1,890 阅读 / 1,706 字 / 正在检测是否收录...

在k8s中部署有状态应用时,通常需要做数据持久化存储。

后端存储的方式有以下几种

1.基于宿主机本地的存储方式

重启pod时,若pod被调度到其他节点上,尽管原来节点上的数据不会丢失,但是其他节点上没有该应用存储过的数据,所以并不持久化

2.基于本地过云存储服务的方式,如:(NFS、glusterfs、cephfs、awsElasticBlockStore、azureDisk、gcePersistentDisk等)

在资源清单中指明URL地址和共享挂载卷目录即可实现数据持久化存储

3.基于存储类,实现PV自动供给

创建存储类,在资源清单中指明地址和共享挂载卷目录即可实现持久化存储

我们这里就介绍一下基于存储类的PV自动供给实现的数据持久化存储

官网概念说明

https://kubernetes.io/docs/concepts/storage/storage-classes/

项目地址

https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

项目架构

image.png

原理

1.存储工程师创建存储类。
2.集群管理员维护集群中的存储资源。
3.用户或开发人员提交需求,(如在sts中只要在资源清单中编辑好volumeClaimTemplates中的需求,确保资源清单无误即可运行)这个过程不需要人工手动创建PVC。

当然图是这样画的,分工明细,但现实中相信一个人把这些活都揽的也不计其数。kube、kube拼音就一苦比,但是多学点没坏处。
从官网中可以看出目前NFS并不支持做存储类,但是我们可以使用NFS的插件来支持。

NFS插件在Github中的项目地址

https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy

搭建

1.搭建NFS服务(与k8s集群同一网段下的主机)

安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)

 启动nfs并设为开机自启:systemctl start nfs && systemctl enable nfs

 创建共享挂载目录: mkdir -pv /data/volumes/{v1,v2,v3}

 编辑/etc/exports文件,将目录共享到192.168.1.0/24这个网段中:

vi /etc/exports

/data/volume/v1  192.168.1.0/24(rw,no_root_squash)
/data/volume/v2  192.168.1.0/24(rw,no_root_squash)
/data/volume/v3  192.168.1.0/24(rw,no_root_squash)

 发布:exportfs -avr

exporting 192.168.1.0/24:/data/volume/v3
exporting 192.168.1.0/24:/data/volume/v2
exporting 192.168.1.0/24:/data/volume/v1

 查看:showmount -e

/data/volume/v3 192.168.1.0/24
/data/volume/v2 192.168.1.0/24
/data/volume/v1 192.168.1.0/24

2.在kubernetes中部署NFS插件(项目地址在上面)

下载项目:for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done

修改资源清单(红色地方需要修改):

vim deployment.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: nfs-client-provisioner
---
kind: Deployment
apiVersion: extensions/v1beta1
metadata:
  name: nfs-client-provisioner
spec:
  replicas: 1
  strategy:
    type: Recreate
  template:
    metadata:
      labels:
        app: nfs-client-provisioner
    spec:
      serviceAccountName: nfs-client-provisioner
      containers:
        - name: nfs-client-provisioner
          image: quay.io/external_storage/nfs-client-provisioner:v2.0.0  ##默认是latest版本
          volumeMounts:
            - name: nfs-client-root
              mountPath: /persistentvolumes
          env:
            - name: PROVISIONER_NAME
              value: fuseim.pri/ifs  ##这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功
            - name: NFS_SERVER
              value: k8s-nfs      ##这里写NFS服务器的IP地址或者能解析到的主机名
            - name: NFS_PATH
              value: /data/volume/v1   ##这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
      volumes:
        - name: nfs-client-root

          nfs:
            server: k8s-nfs                ##NFS服务器的IP或可解析到的主机名
            path: /data/volume/v1  ##NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)

3.部署

切换到此项目的目录中

kubectl apply -f ./

4.查看

查看此NFS插件的pod是否部署成功

kubectl get pods

NAME                                      READY       STATUS         RESTARTS       AGE

nfs-client-provisioner-8664fb9f68-57wkf   1/1        Running            0          5m43s

5.测试

部署一个pvc或者声明存储的应用,测试是否自动创建出PV而且自动绑定PVC

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

例:StatefulSet方式部署的nginx应用

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

例:StatefulSet方式部署的nginx应用

vim nginx-demo.yaml

apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
    - port: 80
    name: web
  clusterIP: None
  selector:
    app: nginx
---

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      terminationGracePeriodSeconds: 10
      containers:
        - name: nginx
          image: nginx
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html
  volumeClaimTemplates:
  - metadata:
    name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 1Gi

部署

部署:
kubectl apply -f test.yaml nginx-demo.yaml
查看pod、svc、pv、pvc状态:
kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                STORAGECLASS          REASON   AGE
pvc-5d66051e-9674-11e9-9021-000c29cc70d4   1Mi        RWX            Delete           Bound    default/test-claim   managed-nfs-storage            7m6s
pvc-73235c07-9677-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-1    managed-nfs-storage            6m15s
pvc-8a58037f-9677-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-2    managed-nfs-storage            5m36s
pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4   1Gi        RWO            Delete           Bound    default/www-web-0    managed-nfs-storage            7m6s

kubectl get pvc
NAME         STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS          AGE
test-claim   Bound    pvc-5d66051e-9674-11e9-9021-000c29cc70d4   1Mi        RWX            managed-nfs-storage   28m
www-web-0    Bound    pvc-ab7fca5a-9676-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   12m
www-web-1    Bound    pvc-73235c07-9677-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   6m32s
www-web-2    Bound    pvc-8a58037f-9677-11e9-9021-000c29cc70d4   1Gi        RWO            managed-nfs-storage   5m53s

kubectl get pods -owide
IP             NODE        NOMINATED NODE   READINESS GATES
nfs-client-provisioner-f9776d996-dpk6z   1/1     Running   0          12m    10.244.1.65    k8s-node1   <none>           <none>
web-0                                    1/1     Running   0          16m    10.244.1.66    k8s-node1   <none>           <none>
web-1                                    1/1     Running   0          10m    10.244.2.181   k8s-node2   <none>           <none>
web-2                                    1/1     Running   0          10m    10.244.2.182   k8s-node2   <none>           <none>

kubectl get svc

现在查看nfs服务器中的v1目录下

kubectl get pvc
default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4
default-www-web-2-pvc-d3944c4a-968f-11e9-9021-000c29cc70d4
default-www-web-1-pvc-ccd2a50b-968f-11e9-9021-000c29cc70d4

在这些目录中创建默认访问页

cd default-www-web-0-pvc-c32f532b-968f-11e9-9021-000c29cc70d4

echo "<h1>NFS Server</h1>" > index.html

此时使用curl命令访问此nginx pod

curl 10.244.1.66

NFS Server

好了,以上就是全部内容了

0

评论区