zoukankan      html  css  js  c++  java
  • glusterfs+heketi为k8s提供共享存储

    背景

    近来在研究k8s,学习到pv、pvc 、storageclass的时候,自己捣腾的时候使用nfs手工提供pv的方式,看到官方文档大量文档都是使用storageclass来定义一个后端存储服务, 使用pvc来自动申请pv,

    所以花了点时间研究了下glusterfs配合heketi如果为k8s动态提供存储。

    环境

    主机名 ip地址 角色 备注
    master 192.168.16.10 k8s-master,glusterfs,heketi  heketi只需要一个节点部署就可以了。
    node01 192.168.16.11 k8s-node,glusterfs  
    node02 192.168.16.12 k8s-node,glusterfs  

    gluster安装配置

    gluster安装

    下面操作需要在三个节点都需要执行。

    # centos 需要安装下 centos-release-gluster5, 此包提供gluster相关的包

    [root@master ~]# yum install centos-release-gluster5
    [root@master ~]# yum install yum install glusterfs-server fuse glusterfs-client
    # 开机自启 [root@master
    ~]# systemctl enable glusterd && systemctl restart glusterd && systemctl status glusterd

    gluster配置

    # 各个节点启动后, 需要使用peer探测各个节点
    [root@master ~]# gluster peer probe node01 [root@master ~]# gluster peer probe node02
    # 查看探测后的状态 [root@master
    ~]# gluster peer status Number of Peers: 2 Hostname: node01 Uuid: c7c12e58-a7de-4948-b11f-52205e3b527c State: Peer in Cluster (Connected) Hostname: node02 Uuid: 7af10306-5643-424c-b1e7-85c4b22ec5c2 State: Peer in Cluster (Connected)

     这一步骤确保集群的各个节点都是connected的。

    heketi的安装和配置

    heketi简介

    我们这里使用heketi注意是给glusterfs提供rest的api服务, 这样就相当于给glusterfs和k8s之间架通了桥梁。我们的k8s就可以使用heketi提供的rest api完成对glusterfs的pv申请和管理。

    heketi的安装

    主节点安装heketi

    [root@master ~]# yum install heketi

    所有节点安装heketi-client

    yum install heketi-client

    heketi的配置

    [root@master ~]# cd /etc/heketi/
    [root@master heketi]# ll
    total 4
    -rw-r--r-- 1 root root 1927 Sep 13 05:37 heketi.json
    # 备份一下。 [root@master heketi]#
    cp heketi.json heketi.json.default [root@master heketi]# vim heketi.json # 修改如下配置 "port": "18080", "use_auth": true, "admin": { "key": "admin" }, "user": { "key": "admin" } "executor": "ssh", "sshexec": { "keyfile": "/home/heketi/.ssh/id_rsa", "user": "heketi", "port": "22",
    "sudo": true,
    "fstab": "/etc/fstab" },

    heketi有三种ececutor, 我们这里选择了生产环境中推荐的ssh方式, 由于大部分场景下root是禁止远程登录的 所以这里使用heketi用户来执行。

    注意: 上面配置中的sudo是必须的, 否则会提示权限不足的。

    准备用户和配置ssh免密码

    #master节点 
    [root@master heketi]# id heketi 
    uid=995(heketi) gid=992(heketi) groups=992(heketi)
    # 原有的账户无home,无shell. 删除添加新的。 [root@master heketi]# userdel heketi [root@master heketi]# useradd heketi [root@master
    ~]# echo "heketi" |passwd --stdin heketi
    # 切换到heketi生成key [root@master heketi]#
    su - heketi [heketi@master ~]$ ssh-keygen # node01节点 [root@node01 ~]# useradd heketi [root@node01 ~]# echo "heketi" |passwd --stdin heketi [root@node01 ~]# su - heketi [heketi@node01 ~]$ ssh-keygen # node02节点 [root@node02 ~]# useradd heketi [root@node02 ~]# echo "heketi" |passwd --stdin heketi [root@node02 ~]# su - heketi [heketi@node01 ~]$ ssh-keygen # ssh免密码信任 [heketi@master ~]$ ssh-copy-id master [heketi@master ~]$ ssh-copy-id node01 [heketi@master ~]$ ssh-copy-id node02

    # 给heketisudo权限
    [root@master heketi]# echo "heketi    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
    [root@node01 heketi]# echo "heketi    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers
    [root@node02 heketi]# echo "heketi    ALL=(ALL)       NOPASSWD: ALL" >> /etc/sudoers

    启动heketi和测试heketi

    # 这一个步骤是必须的, 默认的yum安装后,这个目录的所有者都是root的。 但是安装提供的service文件的user又是heketi. 导致不修改权限就是启动不起来的,坑啊。
    [root@master ~]# chown heketi:heketi /etc/heketi/ -R || chown heketi:heketi /var/lib/heketi -R
    [root@master ~]# systemctl enable heketi  && systemctl start heketi && systemctl status heketi
    
    # 测试下heketi接口问题
    [root@master ~]#  heketi-cli --user admin --secret admin --server http://192.168.16.10:18080 --json  cluster create 
    {"id":"90f60d4e461bfb1dbd3fe3941740615c","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}
    [root@master ~]#  heketi-cli --user admin --secret admin --server http://192.168.16.10:18080 --json  cluster delete 90f60d4e461bfb1dbd3fe3941740615c

    创建集群

    #创建集群
    [root@master ~]#  heketi-cli --user admin --secret admin --server http://192.168.16.10:18080 --json  cluster create 
    {"id":"0c15099b0905cf490004ff3a4f0991e4","nodes":[],"volumes":[],"block":true,"file":true,"blockvolumes":[]}
    # 节点管理(其中集群id为上面命令的返回值)
    [root@master ~]#   heketi-cli --user admin --secret admin --server http://192.168.16.10:18080 --json  node add --cluster "0c15099b0905cf490004ff3a4f0991e4" --management-host-name 192.168.16.10  --storage-host-name 192.168.16.10  --zone 1                  
    [root@master ~]#   heketi-cli --user admin --secret admin --server htt05cf490004ff3a4f0991e4" --management-host-name 192.168.16.11  --storage-host-name 192.168.16.11  --zone 1  
    heketi-cli --user admin --secret admin --server htt05cf490004ff3a4f0991e4" --management-host-name 192.168.16.12  --storage-host-name 192.168.16.12  --zone 1  
    
    # 添加设备
    
    [root@master heketi]# heketi-cli --user admin --secret admin --server http://192.168.16.10:18080   node list  
    Id:179b08165b56df018a0ba295e2c78f22     Cluster:0c15099b0905cf490004ff3a4f0991e4
    Id:a547a8327d3ba9fc51fe5e25d95236cb     Cluster:0c15099b0905cf490004ff3a4f0991e4
    Id:c65521c53de76c3f70d2ec828498a261     Cluster:0c15099b0905cf490004ff3a4f0991e4
    [root@master heketi]# heketi-cli --user admin --secret admin --server http://192.168.16.10:18080   device add --name "/dev/sdb" --node 179b08165b56df018a0ba295e2c78f22
    Device added successfully
    [root@master heketi]# heketi-cli --user admin --secret admin --server http://192.168.16.10:18080   device add --name "/dev/sdb" --node a547a8327d3ba9fc51fe5e25d95236cb
    Device added successfully
    [root@master heketi]# heketi-cli --user admin --secret admin --server http://192.168.16.10:18080   device add --name "/dev/sdb" --node c65521c53de76c3f70d2ec828498a261
    Device added successfully

     也有直接使用拓扑文件load方式的。 具体可以参考: https://github.com/heketi/heketi/blob/master/docs/admin/topology.md

    k8s使用glusterfs

    k8s中使用glusterfs的时候, 会根据pvc的申请自动创建对应的pv, 然后绑定。 这样我们在pod里面就可以指定具体的pvc了。

    创建storageclass

    [root@master ~]# cat k8s.storageclass.yml
    apiVersion: storage.k8s.io/v1beta1
    kind: StorageClass
    metadata:
    name: glusterfs
    provisioner: kubernetes.io/glusterfs
    parameters:
    resturl: "http://192.16.10:18080"
    clusterid: "0c15099b0905cf490004ff3a4f0991e4"
    restauthenabled: "true"
    restuser: "admin"
    restuserkey: "admin"
    gidMin: "40000"
    gidMax: "50000"
    volumetype: "replicate:2"

    创建pvc

    [root@master ~]# cat pvc.yml 
    kind: PersistentVolumeClaim
    apiVersion: v1
    metadata:
      name: pvc1
      namespace: default
      annotations:
        volume.beta.kubernetes.io/storage-class: "glusterfs"
    spec:
      accessModes:
      - ReadWriteMany
      resources:
        requests:
          storage: 2Gi
    [root@master ~]# kubectl apply -f pvc.yml  
    [root@master ~]# kubectl get pvc           
    NAME   STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
    pvc1   Bound    pvc-affe7efc-21fe-11e9-9d1f-000c2987cf81   2Gi        RWX            glusterfs      19s
  • 相关阅读:
    Mysql优化与使用集锦
    用条件注释判断浏览器版本,解决兼容问题
    高效的使用 Response.Redirect
    JS中字符串的相关操作
    Http压力测试工具HttpTest4Net
    纯CSS(无 JavaScript)实现的响应式图像显示
    jquery使用jsonp进行跨域调用
    JS函数重载解决方案
    C# 实现将 PDF 转文本的功能
    iFrame的妙用
  • 原文地址:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_liunx_54_kubernates_glusterfs-heketi.html
Copyright © 2011-2022 走看看