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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM