1. 程式人生 > >Kubernetes中部署Heketi和GlusterFS

Kubernetes中部署Heketi和GlusterFS

issue 服務 p地址 following 節點 tidb fuse led 安裝

Kubernetes中部署Heketi和GlusterFS

[TOC]

1. 前言

在Kubernetes中,使用GlusterFS文件系統,操作步驟通常是:
創建brick-->創建volume-->創建PV-->創建PVC-->Pod掛載PVC
如果要創建多個PV,則需要手動重復執行這些繁鎖步驟,Heketi可以解決這些重復問題。
Heketi是用來管理GlusterFS卷的生命周期的,並提供了一個RESTful API接口供Kubernetes調用,因為GlusterFS沒有提供API調用的方式,所以我們借助heketi,通過Heketi,Kubernetes可以動態配置GlusterFS卷,Heketi會動態在集群內選擇bricks創建所需的volumes,確保數據的副本會分散到集群不同的故障域內,同時Heketi還支持GlusterFS多集群管理,便於管理員對GlusterFS進行操作。

Heketi要求在每個glusterfs節點上配備裸磁盤,因為Heketi要用來創建PV和VG,如果有了Heketi,則可以通過StorageClass來創建PV,步驟僅有:
創建StorageClass-->創建PVC-->Pod掛載PVC
這種方式稱為基於StorageClass的動態資源供應,雖然只有簡單的兩步,但是它所幹活的活一點也不比上述中步驟少,只不過大部分工作都由Heketi在背後幫我們完成了。

2. 環境說明

# k8s 
192.168.105.92 lab1  # master1
192.168.105.93 lab2  # master2
192.168.105.94 lab3  # master3
192.168.105.95 lab4  # node4
192.168.105.96 lab5  # node5
192.168.105.97 lab6  # node6
192.168.105.98 lab7  # node7

3. gluster-kubernetes部署

給需要部署GlusterFS節點的Node打上標簽

[root@lab1 glusterfs]# kubectl label node lab4 storagenode=glusterfs 
node/lab4 labeled
[root@lab1 glusterfs]# kubectl label node lab5 storagenode=glusterfs 
node/lab5 labeled
[root@lab1 glusterfs]# kubectl label node lab7 storagenode=glusterfs
node/lab7 labeled

準備部署文件

git clone https://github.com/gluster/gluster-kubernetes.git
cd gluster-kubernetes/deploy
mv topology.json.sample topology.json

修改配置topology.json

{
  "clusters": [
    {
      "nodes": [
        {
          "node": {
            "hostnames": {
              "manage": [
                "lab4"
              ],
              "storage": [
                "192.168.105.95"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "lab5"
              ],
              "storage": [
                "192.168.105.96"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        },
        {
          "node": {
            "hostnames": {
              "manage": [
                "lab7"
              ],
              "storage": [
                "192.168.105.98"
              ]
            },
            "zone": 1
          },
          "devices": [
            "/dev/sdb"
          ]
        }
      ]
    }
  ]
}

topology-sample.json文件,稱為拓樸文件,它提供了運行gluster Pod的kubernetes節點IP,每個節點上相應的磁盤塊設備,修改hostnames/manage,設置為與kubectl get nodes所顯示的Name字段的值,通常為Node IP,修改hostnames/storage下的IP,為存儲網絡的IP地址,也即Node IP。

集群部署成功後修改配置,需要再次加載,使用如下命令:
/usr/bin/kubectl -n default exec -i $(kubectl get pod|grep heketi|awk ‘{print $1}‘) -- heketi-cli -s http://localhost:8080 --user admin --secret ‘‘ topology load --json=/etc/heketi/topology.json

執行了heketi-cli topology load之後,Heketi到底在服務器上做了什麽呢?
進入任意glusterfs Pod內,執行gluster peer status發現都已把對端加入到了可信存儲池(TSP)中。
在運行了gluster Pod的節點上,自動創建了一個VG,此VG正是由topology.json文件中的磁盤裸設備創建而來。
一塊磁盤設備創建出一個VG,以後創建的PVC,即從此VG裏劃分的LV。
heketi-cli topology info 查看拓撲結構,顯示出每個磁盤設備的ID,對應VG的ID,總空間、已用空間、空余空間等信息。
可以通過Heketi Pod 日誌查看到。

執行部署

./gk-deploy -g
# bash -x ./gk-deploy -g  # 調試運行過程

註意:

  • 上文json中的磁盤是沒有新建vg、pv的。
  • 部署失敗使用./gk-deploy -g --abort刪除pod,再將節點的目錄/var/lib/glusterd清空,刪除磁盤的vg和pv
  • gk-deploy我修改了create -fapply -f,避免secret不更新,適當在確認無誤但又影響腳本運行的地方註釋exit,比如Error: Volume heketidbstorage alreay exists

問題
https://github.com/gluster/gluster-kubernetes/issues/507:

MountVolume.SetUp failed for volume "heketi-storage" : mount failed: mount failed: exit status 32 Mounting command: systemd-run Mounting arguments: --description=Kubernetes transient mount for /var/lib/kubelet/pods/e2531fbe-a133-11e8-b55d-000c2931d938/volumes/kubernetes.io~glusterfs/heketi-storage --scope -- mount -t glusterfs -o log-file=/var/lib/kubelet/plugins/kubernetes.io/glusterfs/heketi-storage/heketi-storage-copy-job-ptnx4-glusterfs.log,backup-volfile-servers=192.168.105.95:192.168.105.96:192.168.105.98,log-level=ERROR 192.168.105.95:heketidbstorage /var/lib/kubelet/pods/e2531fbe-a133-11e8-b55d-000c2931d938/volumes/kubernetes.io~glusterfs/heketi-storage Output: Running scope as unit run-53418.scope. mount: unknown filesystem type ‘glusterfs‘ the following error information was pulled from the glusterfs log to help diagnose this issue: could not open log file for pod heketi-storage-copy-job-ptnx4

上面提示掛載失敗,其實是需要在運行的deploy-heketi節點上安裝yum -y install glusterfs-fuse

全部部署成功後:

[root@lab1 deploy]# kubectl get pod
NAME                                READY     STATUS    RESTARTS   AGE
curl-87b54756-wzm66                 1/1       Running   0          17h
glusterfs-9xj2r                     1/1       Running   0          15h
glusterfs-kbqpc                     1/1       Running   1          15h
glusterfs-wwg5w                     1/1       Running   0          15h
heketi-86f98754c-dvqpk              1/1       Running   0          38s
nginx-deployment-7f46fc97b9-hn8g7   1/1       Running   0          14h
nginx-deployment-7f46fc97b9-t82fv   1/1       Running   0          17h
[root@lab1 deploy]# kubectl  exec -it heketi-86f98754c-dvqpk -- df |grep heketidb
192.168.105.95:heketidbstorage   2086912   54280   2032632   3% /var/lib/heketi
export HEKETI_CLI_SERVER=$(kubectl get svc/deploy-heketi --template ‘http://{{.spec.clusterIP}}:{{(index .spec.ports 0).port}}‘)
curl $HEKETI_CLI_SERVER/hello

返回如下則正常:

Hello from Heketi

參考資料:
[1] http://blog.51cto.com/newfly/2134514
[2] http://blog.51cto.com/newfly/2139393
[3] https://github.com/gluster/gluster-kubernetes
[4] https://github.com/gluster/gluster-kubernetes/blob/master/docs/examples/hello_world/README.md

Kubernetes中部署Heketi和GlusterFS