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
  • 相关阅读:
    简单明了的带你理解springboot原理和三大核心注解
    Spring Boot(一):入门篇
    【Mysql优化】聚簇索引与非聚簇索引概念
    Mysql索引原理与优化
    Mysql全文索引的使用
    索引的优缺点,如何创建索引
    184 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 04 例:字符串与byte(即:字节)数组间的相互转换
    183 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 03 String常用方法(下)
    182 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 02 String常用方法(上)
    181 01 Android 零基础入门 03 Java常用工具类03 Java字符串 02 String类 01 String常用方法简介
  • 原文地址:https://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_liunx_54_kubernates_glusterfs-heketi.html
Copyright © 2011-2022 走看看