LoginSignup
3
1

More than 5 years have passed since last update.

openshift で Container-Native Storage (glusterfs) を簡単デプロイ

Last updated at Posted at 2018-07-05

ドキュメントの情報が多すぎるので、glusterfs を OpenShift にデプロイするシンプルな方法を書いていこうと思います。この記事でデプロイされるGlusterFSは、いわゆる Container-Native Storage(CNS) と呼ばれ、以下でも「CNSをデプロイ」という表記で進めていきます。

バージョンは、以下を使っています。

  • atomic-openshift-3.9.31
  • openshift-ansible-3.9.30
  • RHEL 7.5

構成

構成は、シンプルにmaster1台とnode3台です。各Nodeには、ディスク/dev/vdbを用意しておきます。(フォーマット等の必要はありません。)

+----------+
|  master  |
+----------+

+-----------+ +-----------+ +-----------+
|   node    | |   node    | |   node    |
|  /dev/vdb | |  /dev/vdb | |  /dev/vdb |
+-----------+ +-----------+ +-----------+

今回は、OpenShiftがインストール済みの構成でCNSをデプロイしていますが、OpenShiftと一緒にデプロイすることも可能です。

必要パッケージのインストール

masterのみに、heketi-client パッケージをインストールします。

# yum install heketi-client --enablerepo=rh-gluster-3-for-rhel-7-server-rpms

ansible inventory ファイルの準備

絶対に必要なのは、以下の設定でだけです。ホスト名(knakayam-ose39-c-nodeN.example.com) とディスク名 /dev/vdb は環境に応じて変更してください。

[OSEv3:children]
# masters
# nodes
# etcd
# lb
glusterfs

[glusterfs]
knakayam-ose39-c-node1.example.com glusterfs_devices='[ "/dev/vdb" ]'
knakayam-ose39-c-node2.example.com glusterfs_devices='[ "/dev/vdb" ]'
knakayam-ose39-c-node3.example.com glusterfs_devices='[ "/dev/vdb" ]'

ansible playbookの実行

以下のplaybookを実行するだけです。

  # ansible-playbook /usr/share/ansible/openshift-ansible/playbooks/openshift-glusterfs/config.yml

無事に完了すれば、以下のようになります。(okやchangedの数は環境によって異なるかもしれません。)

PLAY RECAP **********************************************************************************************
knakayam-ose39-c-node1.example.com : ok=24   changed=4    unreachable=0    failed=0
knakayam-ose39-c-node2.example.com : ok=24   changed=4    unreachable=0    failed=0
knakayam-ose39-c-node3.example.com : ok=24   changed=4    unreachable=0    failed=0
knakayam-ose39-c.example.com : ok=114  changed=37   unreachable=0    failed=0
localhost                  : ok=12   changed=0    unreachable=0    failed=0


INSTALLER STATUS ****************************************************************************************
Initialization             : Complete (0:03:19)
GlusterFS Install          : Complete (0:05:33)

デプロイメントの確認

デプロイが完了したら、構成を覗いてみます。glusterfsというプロジェクトにログインして、oc get allとすると以下のようにデプロイされていることがわかります。pod が Running 状態になっていることを必ず確認してください。また、storageclassもすでにデプロイ済みなので、Dynamic Provisioningもすぐに利用可能です。あとで使ってみましょう。

# oc project glusterfs
Already on project "glusterfs" on server "https://knakayam-ose39-c.example.com:8443".

# oc get all
NAME                   DESIRED   CURRENT   READY     UP-TO-DATE   AVAILABLE   NODE SELECTOR            AGE
ds/glusterfs-storage   3         3         3         3            3           glusterfs=storage-host   1h

NAME                                                    REVISION   DESIRED   CURRENT   TRIGGERED BY
deploymentconfigs/glusterblock-storage-provisioner-dc   1          1         1         config
deploymentconfigs/heketi-storage                        1          1         1         config

NAME                    HOST/PORT                                     PATH      SERVICES         PORT      TERMINATION   WILDCARD
routes/heketi-storage   heketi-storage-glusterfs.10.64.222.1.xip.io             heketi-storage   <all>                   None

NAME                                             READY     STATUS    RESTARTS   AGE
po/glusterblock-storage-provisioner-dc-1-nntj9   1/1       Running   0          1h
po/glusterfs-storage-grnvc                       1/1       Running   0          1h
po/glusterfs-storage-nwgvc                       1/1       Running   0          1h
po/glusterfs-storage-vntqh                       1/1       Running   0          1h
po/heketi-storage-1-lhx8c                        1/1       Running   0          1h

NAME                                       DESIRED   CURRENT   READY     AGE
rc/glusterblock-storage-provisioner-dc-1   1         1         1         1h
rc/heketi-storage-1                        1         1         1         1h

NAME                              TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)    AGE
svc/heketi-db-storage-endpoints   ClusterIP   172.30.255.108   <none>        1/TCP      1h
svc/heketi-storage                ClusterIP   172.30.215.93    <none>        8080/TCP   1h

# oc get storageclass
NAME                PROVISIONER               AGE
glusterfs-storage   kubernetes.io/glusterfs   1h

Dynamic Provisioning を利用する

それでは早速、Dynamic Provisioning を使ってみましょう。Dynamic Provisioning を簡単に言うと、PVCを作るだけで、先程デプロイしたCNSのストレージプールから、ストレージを切り出して使えるようにしてくれる仕組みです。

1. まずは、PVC を作ります。

cat <<EOF > ./pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: gluster1
spec:
 accessModes:
  - ReadWriteMany
 resources:
   requests:
        storage: 10Gi
 storageClassName: glusterfs-storage
EOF
$ oc create -f pvc.yaml

Bound状態になったことを確認します。

$ oc get pvc
NAME       STATUS    VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS        AGE
gluster1   Bound     pvc-1f691ad3-802b-11e8-a456-001a4a40dcb8   10Gi       RWX            glusterfs-storage   2h

2. 続いて、podを作ります。

cat <<EOF > ./pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: gluster-pod1
spec:
  containers:
  - name: gluster-busybox
    image: busybox
    command: ["sleep", "60000"]
    volumeMounts:
    - name: gluster-vol1
      mountPath: /usr/share/busybox
      readOnly: false
  volumes:
  - name: gluster-vol1
    persistentVolumeClaim:
      claimName: gluster1
EOF
oc create -f pod.yaml

pod にボリュームがマウントできたことを確認します。

$ oc rsh gluster-pod1 mount |grep gluster
10.64.222.3:vol_8a4fecca141b626670e99f5de1fca8fc on /usr/share/busybox type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)

(おまけ) heketi-cli を使ってみる

まずは、環境変数の HEKETI_CLI_SERVER を設定します。

# export HEKETI_CLI_SERVER=http://`oc get route heketi-storage  --template={{.spec.host}}`

これだけでは、以下のようにユーザーが設定されていないと怒られてしまいます。

# heketi-cli topology info
Error: Unknown user

ユーザーとadmin keyを heketi-storage pod から抜き出して、設定します。

# oc get pod heketi-storage-1-lhx8c -o yaml |grep HEKETI_ADMIN_KEY -A1
    - name: HEKETI_ADMIN_KEY
      value: nwXRXDD0MiDCnvg6DYmdTtAqVLuawenPLZay1DSTOG0=

# export HEKETI_CLI_USER=admin
# export HEKETI_CLI_KEY=nwXRXDD0MiDCnvg6DYmdTtAqVLuawenPLZay1DSTOG0=

これで、topology コマンド等が叩けるようになります。

# heketi-cli topology info

Cluster Id: 889b88ba0942ad1b338dc97afd135b53

    File:  true
    Block: true

    Volumes:

    Name: heketidbstorage
    Size: 2
    Id: 7c9574a3c1a6f6f70a55435962cae64d
    Cluster Id: 889b88ba0942ad1b338dc97afd135b53
    Mount: 10.64.222.4:heketidbstorage
    Mount Options: backup-volfile-servers=10.64.222.5,10.64.222.3
    Durability Type: replicate
    Replica: 3
    Snapshot: Disabled

        Bricks:
            Id: 052069adbf9894cfbd046a9008ea4aec
            Path: /var/lib/heketi/mounts/vg_0ca6422f04c1e75001e189ba2e9f68e3/brick_052069adbf9894cfbd046a9008ea4aec/brick
            Size (GiB): 2
            Node: 33e8015235af3fb2dfd0ea86b8149cb2
            Device: 0ca6422f04c1e75001e189ba2e9f68e3

            Id: 56218e5956d3b1ef1a8342f9e26ffc4d
            Path: /var/lib/heketi/mounts/vg_08160d8b5000d74d421637f3b675e12b/brick_56218e5956d3b1ef1a8342f9e26ffc4d/brick
            Size (GiB): 2
            Node: d5b6f4ac87e00656808d445b0afb6cc5
            Device: 08160d8b5000d74d421637f3b675e12b

            Id: 9303a3943585c8745a64dd2ae44beb61
            Path: /var/lib/heketi/mounts/vg_94d95f59fa5613b473cfde03133d2321/brick_9303a3943585c8745a64dd2ae44beb61/brick
            Size (GiB): 2
            Node: 194fb7f91ff2a049bc27b2ebb7416003
            Device: 94d95f59fa5613b473cfde03133d2321


    Name: vol_8a4fecca141b626670e99f5de1fca8fc
    Size: 10
    Id: 8a4fecca141b626670e99f5de1fca8fc
    Cluster Id: 889b88ba0942ad1b338dc97afd135b53
    Mount: 10.64.222.4:vol_8a4fecca141b626670e99f5de1fca8fc
    Mount Options: backup-volfile-servers=10.64.222.5,10.64.222.3
    Durability Type: replicate
    Replica: 3
    Snapshot: Disabled

        Bricks:
            Id: 0353101752644ddbb8512314061fdaaf
            Path: /var/lib/heketi/mounts/vg_0ca6422f04c1e75001e189ba2e9f68e3/brick_0353101752644ddbb8512314061fdaaf/brick
            Size (GiB): 10
            Node: 33e8015235af3fb2dfd0ea86b8149cb2
            Device: 0ca6422f04c1e75001e189ba2e9f68e3

            Id: 9f120fa36ed4aab668459ce1bb7cd8cb
            Path: /var/lib/heketi/mounts/vg_08160d8b5000d74d421637f3b675e12b/brick_9f120fa36ed4aab668459ce1bb7cd8cb/brick
            Size (GiB): 10
            Node: d5b6f4ac87e00656808d445b0afb6cc5
            Device: 08160d8b5000d74d421637f3b675e12b

            Id: e4f7fb10888f6d58d81c3cb29c531f65
            Path: /var/lib/heketi/mounts/vg_94d95f59fa5613b473cfde03133d2321/brick_e4f7fb10888f6d58d81c3cb29c531f65/brick
            Size (GiB): 10
            Node: 194fb7f91ff2a049bc27b2ebb7416003
            Device: 94d95f59fa5613b473cfde03133d2321


    Nodes:

    Node Id: 194fb7f91ff2a049bc27b2ebb7416003
    State: online
    Cluster Id: 889b88ba0942ad1b338dc97afd135b53
    Zone: 1
    Management Hostnames: knakayam-ose39-c-node2.example.com
    Storage Hostnames: 10.64.222.4
    Devices:
        Id:94d95f59fa5613b473cfde03133d2321   Name:/dev/vdb            State:online    Size (GiB):49      Used (GiB):12      Free (GiB):37      
            Bricks:
                Id:9303a3943585c8745a64dd2ae44beb61   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_94d95f59fa5613b473cfde03133d2321/brick_9303a3943585c8745a64dd2ae44beb61/brick
                Id:e4f7fb10888f6d58d81c3cb29c531f65   Size (GiB):10      Path: /var/lib/heketi/mounts/vg_94d95f59fa5613b473cfde03133d2321/brick_e4f7fb10888f6d58d81c3cb29c531f65/brick

    Node Id: 33e8015235af3fb2dfd0ea86b8149cb2
    State: online
    Cluster Id: 889b88ba0942ad1b338dc97afd135b53
    Zone: 1
    Management Hostnames: knakayam-ose39-c-node3.example.com
    Storage Hostnames: 10.64.222.5
    Devices:
        Id:0ca6422f04c1e75001e189ba2e9f68e3   Name:/dev/vdb            State:online    Size (GiB):49      Used (GiB):12      Free (GiB):37      
            Bricks:
                Id:0353101752644ddbb8512314061fdaaf   Size (GiB):10      Path: /var/lib/heketi/mounts/vg_0ca6422f04c1e75001e189ba2e9f68e3/brick_0353101752644ddbb8512314061fdaaf/brick
                Id:052069adbf9894cfbd046a9008ea4aec   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_0ca6422f04c1e75001e189ba2e9f68e3/brick_052069adbf9894cfbd046a9008ea4aec/brick

    Node Id: d5b6f4ac87e00656808d445b0afb6cc5
    State: online
    Cluster Id: 889b88ba0942ad1b338dc97afd135b53
    Zone: 1
    Management Hostnames: knakayam-ose39-c-node1.example.com
    Storage Hostnames: 10.64.222.3
    Devices:
        Id:08160d8b5000d74d421637f3b675e12b   Name:/dev/vdb            State:online    Size (GiB):49      Used (GiB):12      Free (GiB):37      
            Bricks:
                Id:56218e5956d3b1ef1a8342f9e26ffc4d   Size (GiB):2       Path: /var/lib/heketi/mounts/vg_08160d8b5000d74d421637f3b675e12b/brick_56218e5956d3b1ef1a8342f9e26ffc4d/brick
                Id:9f120fa36ed4aab668459ce1bb7cd8cb   Size (GiB):10      Path: /var/lib/heketi/mounts/vg_08160d8b5000d74d421637f3b675e12b/brick_9f120fa36ed4aab668459ce1bb7cd8cb/brick

CNSを簡単にデプロイして、使ってみる手順を書いてみました。ドキュメントが複雑なので、簡単な手順で初めてみました。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1