再也不踩坑的kubernetes实战指南
上QQ阅读APP看书,第一时间看更新

3.1 安装GFS到K8S集群中

在集群中,我们可以使用GFS、CEPH、NFS等为Pod提供动态持久化存储。本节动态存储主要介绍GFS的使用,静态存储方式采用NFS,其他类型的存储配置类似。

3.1.1 准备工作

为了保证Pod能够正常使用GFS作为后端存储,需要每台运行Pod的节点上提前安装GFS的客户端工具,其他存储方式也类似。

所有节点安装GFS客户端:

    yum install glusterfs glusterfs-fuse -y

给需要作为GFS节点提供存储的节点打上标签:

所有节点加载对应模块:

    [root@K8S-master01 ~]# modprobe dm_snapshot
    [root@K8S-master01 ~]# modprobe dm_mirror
    [root@K8S-master01 ~]# modprobe dm_thin_pool

3.1.2 创建GFS集群

这里采用容器化方式部署GFS集群,同样也可以使用传统模式部署,在生产环境中,GFS集群最好是独立于集群之外进行部署,之后只需创建对应的EndPoints即可。

本例部署采用DaemonSet方式,同时保证已经打上标签的节点上都运行一个GFS服务,并且均有提供存储的磁盘。

下载相关安装文件:

    wget https://github.com/heketi/heketi/releases/download/v7.0.0/
heketi-client-v7.0.0.linux.amd64.tar.gz

创建集群:

注意1:此处采用的是默认的挂载方式,可使用其他磁盘作为GFS的工作目录。

注意2:此处创建的Namespace为default,可按需更改。

注意3:可使用gluster/gluster-centos:gluster3u12_centos7镜像。

查看GFS Pods:

3.1.3 创建Heketi服务

Heketi是一个提供RESTful API管理GFS卷的框架,能够在Kubernetes、OpenShift、OpenStack等云平台上实现动态存储资源供应,支持GFS多集群管理,便于管理员对GFS进行操作,在Kubernetes集群中,Pod将存储的请求发送至Heketi,然后Heketi控制GFS集群创建对应的存储卷。

创建Heketi的ServiceAccount对象:

创建Heketi对应的权限和Secret:

初始化部署Heketi:

    [root@K8S-master01 kubernetes]# kubectl create -f heketi-bootstrap.json
    secret/heketi-db-backup created
    service/heketi created
    deployment.extensions/heketi created
    [root@K8S-master01 kubernetes]# pwd
    /root/heketi-client/share/heketi/kubernetes

3.1.4 创建GFS集群

本节使用Heketi创建GFS集群,其管理方式更加简单和高效。

复制heketi-cli至/usr/local/bin:

修改topology-sample,manage为GFS管理服务的节点(Node)主机名,storage为节点的IP地址,devices为节点上的裸设备,也就是用于提供存储的磁盘最好使用裸设备:

查看当前Heketi的ClusterIP:

使用Heketi创建GFS集群:

之前创建的Heketi未配置持久化卷,如果Heketi的Pod重启,可能会丢失之前的配置信息,所以现在创建Heketi持久化卷,对Heketi的数据进行持久化。该持久化方式采用GFS提供的动态存储,也可以采用其他方式进行持久化:

如果出现如下报错信息,就在所有节点执行modprobe dm_thin_pool,重新执行此命令即可:

删除中间产物:

创建持久化Heketi,持久化方式也可以选择其他方式:

    [root@K8S-master01 kubernetes]# kubectl create -f heketi-deployment.json
    service/heketi created
    deployment.extensions/heketi created

待Pod全部启动,即表示创建成功:

查看最新部署的持久化Heketi的svc,并更改HEKETI_CLI_SERVER的值:

查看GFS集群信息,其他操作可参考Heketi官方文档:

3.1.5 创建StorageClass

提前创建StorageClass,然后Pod直接在StorageClass选项配置选择该StorageClass,即可通过该StorageClass创建对应的PV。

创建StorageClass文件如下:

说明

Provisioner参数须设置为"kubernetes.io/glusterfs"。

resturl地址为API Server所在主机可以访问到的Heketi服务的某个地址。

其他详细参数可以参考2.2.12节。

3.1.6 测试使用GFS动态存储

创建一个Pod使用动态PV,在storageClassName指定之前创建的StorageClass的名字,即gluster-heketi:

创建Pod:

    [root@K8S-master01 gfs]# kubectl create -f pod-use-pvc.yaml
    pod/pod-use-pvc created

PVC定义一旦生成,系统便触发Heketi进行相应的操作,主要为在GFS集群上创建brick,再创建并启动一个卷(volume)。

创建的PV及PVC如下:

3.1.7 测试数据

测试使用该PV的Pod之间能否共享数据。

进入到Pod并创建文件:

    [root@K8S-master01 /]# kubectl exec -ti pod-use-pvc -- /bin/sh
    / # cd /pv-data/
    /pv-data # mkdir {1..10}
    /pv-data # ls
    {1..10}

查看创建的卷(volume):

或者使用volume list查看:

查看数据。其中vol_56d636b452d31a9d4cb523d752ad0891为卷名(Volume Name)挂载:

3.1.8 测试Deployment

测试在Deployment部署方式下是否能够正常使用StorageClass。

创建一个Nginx的Deployment如下:

上述例子为了演示使用了两个PVC,实际环境可以使用subPath来区分conf和html,当然也可以直接指定卷,此时不单独创建PVC。

直接创建的方式如下:

查看资源:

查看挂载情况:

宿主机挂载并创建index.html:

扩容Nginx,查看是否能正常挂载目录:

查看文件内容: