使用glusterfs为k8s提供动态pv供给

1、创建glusterfs集群

(1)部署glusterfs集群

        由于虚拟机机器限制,所以使用k8s集群的两台node节点创建glusterfs集群。具体环境如下:

主机ip

主机名

使用的磁盘

Heketi节点

192.168.16.130

heketi

/dev/sdb

192.168.16.197

node01

/dev/sdb

192.168.16.198

node02

/dev/sdb

# 在三台节点上安装glusterfs-server程序包,并启动glusterfs服务
~]# yum install centos-release-gluster -y
~]# yum install glusterfs-server
~]# systemctl start glusterd.service
# 通过一个节点发现其他节点
~]# gluster peer probe node01
~]# gluster peer probe node02
~]# gluster peer status
Number of Peers: 2

Hostname: node01
Uuid: 1e1d86ff-8a23-468c-ae43-f9f3b989be21
State: Peer in Cluster (Connected)

Hostname: node02
Uuid: 10ad6c06-d006-4577-a147-5aec9e32eff2
State: Peer in Cluster (Connected)
Other names:
192.168.16.198

(2)部署Heketi(在heketi主机上)

        heketi为管理clusterfs存储卷的生命周期提供了一个restful管理接口。Heketi能够自动确定整个集群的brick位置,并确保将brick及其副本放置在不同的故障域中。同时,Heketi还支持任意数量的cluster存储集群,并支持云服务提供网络文件存储。不过在heketi中注册的任何磁盘都必须以原始格式提供。

1)安装设置heketi

# 安装启动heketi服务
~]# yum install heketi heketi-client
# 配置heketi通过ssh秘钥的方式连接至集群中clusterfs节点
~]# ssh-keygen -f /etc/heketi/heketi_key -t rsa -N ''
~]# chown heketi:heketi /etc/heketi/heketi_key*
~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@node01
~]# ssh-copy-id -i /etc/heketi/heketi_key.pub root@node02 

2)配置heketi

       heketi的默认配置文件为/etc/heketi/heketi.json,默认的配置即可使用,如果需要连接heketi的认证,则需要将“use_auth”的参数设置为“true”,并在“jwt{}”配置段中为各用户设定相应的密码,用户名和密码都可以自定义。配置实例如下:

~]# cat /etc/heketi/heketi.json
{
  "port": "8080",
  "use_auth": false,
  "jwt": {
    "admin": {
      "key": "admin Secret"
    },
    "user": {
      "key": "user Secret"
    }
  },
  "glusterfs": {
    "executor": "ssh",
    "sshexec": {
      "keyfile": "/etc/heketi/heketi_key",
      "user": "root",
      "port": "22",
      "fstab": "/etc/fstab"
    },
    "db": "/var/lib/heketi/heketi.db",
    "loglevel" : "debug"
  }
}

3)启动验证heketi服务

# 启动heketi
~]# systemctl enable heketi
~]# systemctl start heketi
# 验证heketi
~]# curl http://heketi:8080/hello
Hello from Heketi

(3)设置heketi的系统拓扑

        拓扑信息用于让heketi确认可使用的节点、磁盘和集群,管理员必须自行确定节点故障域和节点集群。通过命令行的客户端”hekcti-cli”可以加载预定义的集群拓扑,从而添加节点到集群中,以及将磁盘关联到节点上。加载拓扑文件的命令为:

# export HEKETL_CLI_SERVER=http://
# heketi-cli topology load --json=

        设置heketi系统拓扑时需要一个使用于当前配置环境的配置文件,它将根据gluster存储的实际环境把各节点定义在同一个集群中,并指明各节点上可用于提供存储空间的磁盘设备。

# 定义当前环境的配置文件
~]# cat /etc/heketi/topology_demo.json 
~]# cat /etc/heketi/topology_demo.json 
{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.16.197"
              ],
              "storage": [
                "192.168.16.197"
              ]
            },
            "zone": 1
          },
          "devices": [
             "/dev/sdb"
           ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.16.198"
              ],
              "storage": [
                "192.168.16.198"
              ]
            },
            "zone": 1
          },
          "devices": [
             "/dev/sdb"
           ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "192.168.16.130"
              ],
              "storage": [
                "192.168.16.130"
              ]
            },
            "zone": 1
          },
          "devices": [
             "/dev/sdb"
           ]
        }
      ]
    }
  ]
}

配置文件定义好之后需要通过命令加载拓扑信息,从而完成集群的配置。

# 加载拓扑信息
~]# export HEKETI_CLI_SERVER=http://heketi:8080
~]# heketi-cli topology load --json=/etc/heketi/topology_demo.json
Creating cluster ... ID: a8e652ea255c6d129a5b8900cdadbf4e
  Allowing file volumes on cluster.
  Allowing block volumes on cluster.
  Creating node 192.168.16.197 ... ID: 534fe718a31481aa625c0cec6e7a715e
          Adding device /dev/sdb ... OK
  Creating node 192.168.16.198 ... ID: 9b8354c51092cca16ccb27998e3a7b00
          Adding device /dev/sdb ... OK
  Creating node 192.168.16.130 ... ID: b4decebd4ecb257835ac7c652e067564
          Adding device /dev/sdb ... OK 
# 查看集群的状态信息
~]# heketi-cli cluster info a8e652ea255c6d129a5b8900cdadbf4e
Cluster id: a8e652ea255c6d129a5b8900cdadbf4e
Nodes:
534fe718a31481aa625c0cec6e7a715e
9b8354c51092cca16ccb27998e3a7b00
b4decebd4ecb257835ac7c652e067564

(4)存储卷的管理

        存储卷的创建通过“heketi-cli volume create --size= [options]”命令创建。存存储卷的使用则需要在使用该存储卷的节点上安装GlusterFS和glusterfs-fuse程序包。

2、使用glusterfs动态pv供给

(1)存储类

      存储类支持pv的动态创建,创建存储类时,除了名称之外,还需要定义以下字段:

        1)provisioner:供给方,提供存储资源的存储系统,该字段用来判定要使用的存储插件以便适配到目标存储系统。

        2)parameters:该参数用来描述要关联到的存储卷

       3)reclaimPolicy:为当前存储类动态创建的pv指定回收策略,可用值为delete和retain

       4)volumeBindMode:定义如何为PVC完成供给和绑定,默认值为“VolumeBindingImmediate”.

       5)mountOptions:由当前类动态创建的pv的挂载选项列表

# 定义一个基于glusterfs的存储类
]# cat glusteerfs-storageclass.yaml 
kind: StorageClass
apiVersion: storage.k8s.io/v1beta1
metadata:
  name: glusterfs
provisioner: kubernetes.io/glusterfs
parameters:
  resturl: "http://192.168.17.130:8080"
  restauthenabled: "false"
# 创建并查看该存储类
]# kubectl apply -f glusteerfs-storageclass.yaml 
storageclass.storage.k8s.io/glusterfs created
]# kubectl get StorageClass
NAME        PROVISIONER               AGE
glusterfs   kubernetes.io/glusterfs   16s

(2)动态pv供给

        动态pv的供给至少需要一个存储类,有了存储类就可以进行pv的动态供给。在pvc中定义使用指定的存储类资源的方式有两种,一种是通过spec. storageClassName字段定义,另一种方式是通过” volume.beta.kubernetes.io/storage-class”注解信息指定。

# 创建一个pvc并动态请求pv
~]# cat pvc-glusterfs.yaml 
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-glusterfs
  annotations:
    volume.beta.kubernetes.io/storage-class: glusterfs
spec:
  # storageClassName: "glusterfs"
  accessModes: 
  - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
# 创建并查看创建的pvc
~]# kubectl apply -f pvc-glusterfs.yaml 
persistentvolumeclaim/pvc-glusterfs created
 ~]# kubectl get pvc
NAME            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
pvc-glusterfs   Bound    pvc-20fdbad8-7acf-11e9-8957-000c29063a23   2Gi        RWO            glusterfs      25s

 

你可能感兴趣的:(docker&k8s)