让Kubernetes方便地使用GLusterFS存储

本文介绍了为k8s集群接入一个Glusterfs集群的实践。

1. 理论知识
pod挂载volume的方式:
1)创建pv—创建pvc—创建pod,挂载pvc
2)创建sotrageclass—创建pvc–创建pod,挂载pvc
像ceph,GlusterFs这样的成熟产品,我们希望可以直接通过RestFul的方式调用创建volume,所以选择sotrageclass。
但是GlusterFs没有提供API调用的方式,所以我们借助heketi,他的开源地址:github
gluster项目已经融合了heketi,kubernetes,并提供了部署方式gluster+k8s

2.前提
已经有k8s集群,准备一个kube-admin工作节点。
准备2+以上的GLusterFS node,每个node准备20G裸设备,为了快速启动GlusterFS,我们使用docker的方式,但是并不部署在k8s里面。

3. 快速启动一套 GlusterFS
注意,不需要初始化 GlusterFS 集群。
3.1 启动 GlusterFS
在 fs node1 和fs node2 上,分别启动docker

1
docker run -v /root/.ssh:/root/.ssh -v /etc/glusterfs:/etc/glusterfs:z -v /var/lib/glusterd:/var/lib/glusterd:z -v /var/log/glusterfs:/var/log/glusterfs:z -v /sys/fs/cgroup:/sys/fs/cgroup:ro -d --privileged=true --net=host -v /dev/:/dev gluster/gluster-centos

这里比官方新加了一句 -v /root/.ssh:/root/.ssh ,因为kube-admin工作节点需要通过2222端口ssh连接到这两个container里面。

3.2 设置节点免密登陆
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.32.103
ssh-copy-id -i .ssh/id_rsa.pub root@192.168.32.104

3.3 两台 fs 节点需要分别挂载裸设备
进入GlusterFS container中
pvcreate /dev/sdc

3.4 加载必须的模块

1
2
3
modprobe dm_thin_pool
modprobe dm-snapshot
modprobe dm-mirror

4.
4.1 下载源项目:
默认master即可
git clone https://github.com/gluster/gluster-kubernetes
修改部署文件,涉及到访问rest api的用户\密码;hostpath的配置。(注1)
gluster-kubernetes/deploy/kube-templates/deploy-heketi-deployment.yaml
如下所示:

4.2 创建 topology.json 文件
修改自topology.json.sample

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.37.103"
              ],
              "storage": [
                "192.168.37.103"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdc"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.37.104"
              ],
              "storage": [
                "192.168.37.104"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdc"
          ]
        }
      ]
    }
  ]
}

4.3 导入 topology

1
./gk-deploy -n kube-system -c kubectl --ssh-keyfile /root/.ssh/id_rsa --ssh-port 2222 --admin-key adminkey001

参数说明:
–ssh-keyfile /root/.ssh/id_rsa 本机使用的private key,用来登陆远程gluster container

遇到错误:

从line835往后的都没执行,但是heketi service已经部署完成,满足我们后续的需要了,这个问题的原因是vm数量至少需要3个,我2个节点也可以部署出来的,权当测试练手了,缺点就是heketi数据没有放在GlusterFS上。如果有3个节点,此次部署就会:
先使用 deploy-heketi-deployment.yaml 创建一个 heketi
再使用 heketi-deployment.yaml,这个yaml里面设置了pod heketi 挂载 GlusterFS volume 。

4.4 查看 topology 信息:

1
2
export HEKETI_CLI_SERVER=http://{heketi service ip}:8080
heketi-cli topology info --user admin --secret adminkey001

如下所示-图片:

5 通过storageclass使用
5.1 创建storage class

kubectl create -f storage_class.yaml

5.2 创建pvc

#kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
gluster1 Bound pvc-8c90b96c-00e6-11e8-b14b-080027b70d0e 2Gi RWO gluster-heketi 40m

5.3 创建nginx使用pvc
准备一个nginx:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# kubectl create   -f nginx.yaml 
pod "nginx-pod1" created
# docker exec -ti 65fw bash
root@nginx-pod1:/# mkdir /mytestpath
root@nginx-pod1:/# touch mytestfile
root@nginx-pod1:/# echo "where are you" > mytestfile
root@nginx-pod1:/# exit
# kubectl delete   -f nginx.yaml 
pod "nginx-pod1" deleted
# kubectl create   -f nginx.yaml 
pod "nginx-pod1" created
# docker exec -ti 77be bash
groups: cannot find name for group ID 2000
root@nginx-pod1:/# ls                                                                                                                                                     
bin  boot  dev	etc  home  lib	lib64  media  mnt  mytestpath  opt  proc  root	run  sbin  srv	sys  tmp  usr  var
root@nginx-pod1:/# cd mytestpath/
root@nginx-pod1:/mytestpath# ls
mytestfile
root@nginx-pod1:/mytestpath# cat mytestfile 
where are you

持久存储数据还在。

(注1)
按照github上的解释,部署的过程是不需要修改yaml文件的。但是在此次部署的过程中,并不是完全按照部署脚本执行,因为部署脚本 gk-deploy 执行到”line835″时会失败退出[Error: No space]。

参考链接:
https://github.com/kubernetes/examples/tree/master/staging/volumes/glusterfs
https://github.com/gluster/gluster-kubernetes/blob/master/docs/setup-guide.md
https://github.com/gluster/gluster-kubernetes/tree/master/docs/examples/hello_world