Kubernetes(十四)存储卷&GlusterFS

  • A+
所属分类:Kubernetes

存储卷的概念和类型

为了保证数据的持久性,必须保证数据在外部存储在docker容器中,为了实现数据的持久性存储,在宿主机和容器内做映射,可以保证在容器的生命周期结束,数据依旧可以实现持久性存储。但是在k8s中,由于pod分布在各个不同的节点之上,并不能实现不同节点之间持久性数据的共享,并且,在节点故障时,可能会导致数据的永久性丢失。为此,k8s就引入了外部存储卷的功能。

https://www.cnblogs.com/linuxk/p/9760363.html

http://blog.51cto.com/passed/2139299


k8s的存储卷类型

[root@k8s-master ~]# kubectl explain pod.spec.volumes #查看k8s支持的存储类型
KIND:     Pod
VERSION:  v1

常用分类

emptyDir(临时目录):Pod删除,数据也会被清除,这种存储成为emptyDir,用于数据的临时存储。

hostPath  (宿主机目录映射):

本地的SAN  (iSCSI,FC)、NAS(nfs,cifs,http)存储

分布式存储(glusterfs,rbd,cephfs)

云存储 (EBS,Azure Disk)

总结:k8s要使用存储卷,需要2步:

1、在pod定义volume,并指明关联到哪个存储设备

2、在容器使用volume mount进行挂载

GlusterFS部署

GlusterFS环境分配

192.168.56.11 Server、Client

192.168.56.12 Server、Client

GlusterFS安装

目前Gluster的最新版本为5.3版本,直接使用官方提供的repo进行安装。

[root@linux-node2 ~]# yum install centos-release-gluster
[root@linux-node2 ~]# yum install glusterfs-server

验证安装

[root@linux-node1 yum.repos.d]# glusterfs -V
glusterfs 5.3
Repository revision: git://git.gluster.org/glusterfs.git
Copyright (c) 2006-2016 Red Hat, Inc. <https://www.gluster.org/>

启动Glusterd

systemctl start glusterd
systemctl enable glusterd
systemctl status glusterd

请安装并启动linux-node2

Trusted Storage Pools创建

在开始创建ClusterFS卷之前,需要创建一个称之为Trusted Storage的池,是一个可信的网络存储服务器,可以理解为集群。为卷提供bricks。

gluster peer probe<主机名或者IP地址>,建议是IP地址,或者内网用DNS做主机名解析,或者在/etc/hosts做好绑定。

Trusted Storage Pools创建

在开始创建ClusterFS卷之前,需要创建一个称之为Trusted Storage的池,是一个可信的网络存储服务器,可以理解为集群。为卷提供bricks。

gluster peer probe<主机名或者IP地址>,建议是IP地址,或者内网用DNS做主机名解析,或者在/etc/hosts做好绑定。

增加Server到Pool

在node1上添加成员服务器到Poll中:例

[root@linux-node1 ~]# gluster peer probe 192.168.1.12
peer probe: success

从Pool中删除Server

删除集群中的成员服务器:例

[root@linux-node1 ~]# gluster peer detach linux-node2.unixhot.com
peer detach: success

注意不要添加本地的服务器。

查看Pool状态

[root@linux-node1 ~]# gluster peer status
Number of Peers: 3

GlusterFS Volumes创建

GlusterFS的卷共有三种基本类型,可以组合共7种类型,其中Distributed、Replicated、Strped、为基本类型。Distributed Striped、Distributed Replicated、Distributed Striped Replicated、Striped Replicated。为组合类型。

本文为了测试7种卷类型,需要在各个服务器分别创建7个目录。

mkdir /data && cd /data && mkdir type{1,2,3,4,5,6,7}/exp{1,2,3,4,5,6,7} -p

创建Volumes使用以下命令进行:

gluster volume create NEW-VOLNAME [stripe COUNT | replica COUNT]
[transport [tcp | rdma | tcp,rdma]] NEW-BRICK1 NEW-BRICK2 NEW-BRICK3...

创建复制卷

[root@localhost type11]# gluster volume create test2-volume replica 2 192.168.20.12:/data/type2/exp1 192.168.20.210:/data/type2/exp1  force
volume create: test2-volume: success: please start the volume to access data

[root@localhost type11]# gluster volume start test2-volume
volume start: test2-volume: success

[root@localhost type11]# gluster volume info test2-volume
Volume Name: test2-volume
Type: Replicate
Volume ID: b3264824-c3c2-45e8-a82d-f3dd5c931b5d
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.168.20.12:/data/type2/exp1
Brick2: 192.168.20.210:/data/type2/exp1
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

挂载卷需要安装客户端,默认安装server已经装好了 

[root@localhost data]# yum -y install glusterfs-client
mkdir /mnt/glusterfs/type1 -p
[root@localhost data]# mount.glusterfs 192.168.56.11:/test1-volume /mnt/glusterfs/type1/
df -h

查看挂载点,创建文件测试(注意,是在mnt目录创建,不要破坏GlusterFs的data)

[root@localhost data]# cd /mnt/glusterfs/type1/
[root@localhost type1]# touch {1,2,3,4,5,6,7}
[root@k8s-M1 ~]# kubectl get ep glusterfs-cluster -n kaifa -o yaml
apiVersion: v1
kind: Endpoints
metadata:
  creationTimestamp: 2018-12-08T10:19:52Z
  name: glusterfs-cluster
  namespace: kaifa
  resourceVersion: "12532756"
  selfLink: /api/v1/namespaces/kaifa/endpoints/glusterfs-cluster
  uid: cd5125ce-fad2-11e8-8711-005056940be9
subsets:
- addresses:
  - ip: 192.168.0.215
  - ip: 192.168.0.216
  ports:
  - port: 1990
    protocol: TCP

Kubernetes 挂载GlusterFs

kubernetes节点安装GlusterFs客户端工具

yum -y install glusterfs-client

注:以下操作在kubernetes集群中任意一个可以执行kubectl的master上操作!

第一步在Kubernetes中创建GlusterFS端点定义

/root/tools/yaml/glusterfs/glusterfs-endpoints.yaml
kubectl -n kaifa get ep glusterfs-cluster -o yaml

创建endpoints

[root@k8s-master01 glusterfs]# vim glusterfs-endpoints.yaml 
apiVersion: v1
kind: Endpoints
metadata:
  name: glusterfs-cluster
#  namespace: kaifa
subsets:
- addresses:
  - ip: 192.168.20.12
  - ip: 192.168.20.210
  ports:
  - port: 1990
    protocol: TCP

创建查看

kubectl create -f  glusterfs-endpoints.yaml
[root@k8s-master01 glusterfs]# kubectl get ep |grep glusterfs-cluster
glusterfs-cluster   192.168.20.12:1990,192.168.20.210:1990         19s

配置 service

我们还需要为这些端点创建服务,以便它们能够持久存在。我们将在没有选择器的情况下添加此服务,以告知Kubernetes我们想要手动添加其端点

[root@k8s-master01 glusterfs]# vim /root/tools/yaml/glusterfs/glusterfs-service.yaml 
apiVersion: v1
kind: Service
metadata:
  name: glusterfs-cluster
  #namespace: kaifa
spec:
  #clusterIP: 10.10.10.77
  ports:
  - port: 2
    protocol: TCP
    targetPort: 2
  sessionAffinity: None
  type: ClusterIP
status:
  loadBalancer: {}
kubectl create -f glusterfs-service.yaml
[root@k8s-master01 glusterfs]# kubectl get service glusterfs-cluster
NAME                TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)   AGE
glusterfs-cluster   ClusterIP   10.10.10.60   <none>        2/TCP     2m

配置PersistentVolume(简称pv)

在 Kubernetes 中还引入了一组叫作 Persistent Volume Claim(PVC)和 Persistent Volume(PV)的 API 对象,很大程度简化了用户声明和使用持久化 Volume 的门槛。比如 PV 是群集中已由管理员配置的一块存储,一般系统管理员创建 endpoint、Service、PV ;PVC 是由开发人员进行配置 ,Pod 挂载到 PVC 中,PVC 可以向 PV 申请指定大小的存储资源并设置访问模式,而不需要关注存储卷采用何种技术实现。

PersistentVolume(PV)是集群中由管理员配置的一块存储。它是集群中的资源,就和节点是集群资源一样。PV 是卷插件比如 Volumes,但是它的生命周期独立于使用 PV 的任何 pod 个体。该API对象捕获实现存储的详细信息,包括 NFS、iSCSI 或着是云服务商特定的存储系统。

PersistentVolumeClaim(PVC)是用户关于存储的请求。它类似于一个 pod,pod 消耗节点资源,而 PVC 消耗 PV 资源。Pods 可以请求特定级别的资源(CPU和内容),而Claim可以请求特定的大小和访问模式(例如,可以一次读/写或者多次只读)。

定义PV(注意path路径是GlusterFs的volumets)

[root@k8s-master01 glusterfs]# vim glusterfs-pv.yaml 
apiVersion: v1
kind: PersistentVolume
metadata:
  name: k8s-logs
spec:
  accessModes:
  - ReadWriteMany
  capacity:
    storage: 50Gi
  glusterfs:
    endpoints: glusterfs-cluster
    path: test2-volume
  persistentVolumeReclaimPolicy: Retain

创建&查看

kubectl create -f  glusterfs-pv.yaml
[root@k8s-master01 glusterfs]# kubectl get pv
NAME       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM     STORAGECLASS   REASON    AGE
k8s-logs   50Gi       RWX            Retain           Available                                      35s

定义PVC

[root@k8s-master01 glusterfs]# vim glusterfs-pvc.yaml 
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
  name: k8s-logs
  #namespace: kaifa
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 50Gi
  volumeName: k8s-logs

创建&查看

kubectl create -f glusterfs-pvc.yaml 
[root@k8s-master01 glusterfs]# kubectl get pvc 
NAME       STATUS    VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
k8s-logs   Pending   k8s-logs   0

备注:访问模式

ReadWriteOnce – the volume can be mounted as read-write by a single node

ReadOnlyMany – the volume can be mounted read-only by many nodes

ReadWriteMany – the volume can be mounted as read-write by many nodes

可以在 Dashboard 中查看存储卷的信息(持久化存储卷),状态是绿色代表正常

部署应用挂载pvc

以创建nginx,把pvc挂载到容器内的/usr/share/nginx/html文件夹为例:

[root@k8s-master01 glusterfs]# kubectl create -f nginx_deployment.yaml
apiVersion: extensions/v1beta1 kind: Deployment metadata: 
  name: nginx-dmspec: 
  replicas: 2
  template: 
    metadata: 
      labels: 
        name: nginx 
    spec: 
      containers: 
        - name: nginx 
          image: nginx
          ports: 
            - containerPort: 80
          volumeMounts:
            - name: accesslogs
              mountPath: "/usr/share/nginx/html"
      volumes:
      - name: accesslogs
        persistentVolumeClaim:
          claimName: k8s-logs

实例:

[root@k8s-master01 glusterfs]# kubectl create -f deployment.yaml


       volumeMounts:
       - name: accesslogs
         mountPath: /data/logs
       env:
        - name: aliyun_logs_fbackend-job-executor-recommend
          value: "stdout"
        - name: aliyun_logs_fbackend-job-executor-recommend
          value: "/data/logs/fbackend-job-executor-recommend.log"
     volumes:
      - name: accesslogs
        persistentVolumeClaim:
         claimName: k8s-logs

验证信息

[root@k8s-master01 ~]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
nginx-dm-7879874dd6-nfc2b           1/1       Running   0          17d
nginx-dm-7879874dd6-stqnc           1/1       Running   0          17d

[root@k8s-master01 ~]# kubectl exec -it nginx-dm-7879874dd6-nfc2b bash
root@nginx-dm-7879874dd6-nfc2b:/# df -h               
192.168.20.12:test2-volume   17G  4.5G   13G  27% /usr/share/nginx/html
root@nginx-dm-7879874dd6-nfc2b:/# echo "hello" >/usr/share/nginx/html/index.html

在GlusterFs可以查看文件信息

[root@localhost ~]# cat /data/type2/exp1/index.html 
hello

NFS挂载方式参考

https://blog.csdn.net/weixin_36171533/article/details/82627920

YaLei

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: