Rook: EdgeFS をKubernetesへデプロイする

Rookだらけの Advent Calendar 2019/12/17: Rook EdgeFS Operator の力を実感する

makotow
makotow’s blog clone
10 min readDec 16, 2019

--

この記事は「Rookだらけの Advent Calendar」 2019/12/17分です。Rook EdgeFSについて記事を投稿します。

TL;DR

  • 事前準備が終わっていれば3分でデプロイ可能
  • 事前要件はしっかりみておく
  • Operatorは偉大

この記事では実際にプロビジョニングするところまでやってみたいと思います。

端的に言うと以下のコマンドで終了です。
しかし、EdgeFSではクラスタ作成時の事前準備が必要となるためその部分を重点的に今日は書きたいと思います。

$ git clone https://github.com/rook/rook.git
$ cd cluster/examples/kubernetes/edgefs
$ kubectl create -f operator.yaml
$ kubectl create -f cluster.yaml

事前準備・今回の環境

  • Rook masterブランチを使用 (1fd1938234fd896d63150fb4fdd3a27204256d90)
  • Kubernetes v1.16.4: 1 master(2vCPU 4GiB memory), 3 worker(2vCPU, 8GiB memory)、KVMで準備
  • ホストマシン: AMD Ryzen 5 3600 6-Core Processor, 64GB memory, Ubuntu18.04
  • stern version 1.11.0

デプロイの流れ

大まかな流れとしては

  • EdgeFS Operator導入
  • EdgeFSクラスタ導入

のステップです。

最初に書いたとおり3つのマニフェストを適応すれば完了です。

実際に試す際に引っかかりそうなところをピックアップし、Podの状態を確認しながら見ていきます。

正式な手順についてはこちらをご参照ください。https://rook.io/docs/rook/master/edgefs-cluster-crd.html

デバイスの設定

まずはじめにはまったのがデバイスを付与しておくというところです。なのでディスクをVMにつけておきましょう。今回はKVMで実施したので以下のようにVirtIOディスク2をEdgeFSように付与しました。

KVM の仮想マシンのディスク

以下のような結果になればOKです。今回はvdbが対象のディスクになります。

$ sudo lsblk -l | grep vdvda  252:0    0   30G  0 disk 
vda1 252:1 0 1M 0 part
vda2 252:2 0 1G 0 part /boot
vda3 252:3 0 29G 0 part
vdb 252:16 0 10G 0 disk

ちなみにドキュメントにはカーネルパラメータを自動調整する旨記載があります。

IMPORTANT EdgeFS will automatically adjust deployment nodes to use larger then 128KB data chunks, with the following addition to /etc/sysctl.conf:

もし嫌ならCRDで無効化しておきましょう。

マニフェストの変更

基本的にはリポジトリのマニフェストをkubectl create -f で流していくだけで大丈夫です。

はじめにEdgeFS Operatorを導入します

$ cd cluster/examples/kubernetes/edgefs
$ kubectl create -f operator.yaml
namespace/rook-edgefs-system created customresourcedefinition.apiextensions.k8s.io/clusters.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/nfss.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/swifts.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/s3s.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/s3xs.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/iscsis.edgefs.rook.io created customresourcedefinition.apiextensions.k8s.io/isgws.edgefs.rook.io created clusterrole.rbac.authorization.k8s.io/rook-edgefs-cluster-mgmt created role.rbac.authorization.k8s.io/rook-edgefs-system created clusterrole.rbac.authorization.k8s.io/rook-edgefs-global created serviceaccount/rook-edgefs-system created rolebinding.rbac.authorization.k8s.io/rook-edgefs-system created clusterrolebinding.rbac.authorization.k8s.io/rook-edgefs-global created deployment.apps/rook-edgefs-operator created

Operatorが導入されたことを確認します。

❯ kubectl -n rook-edgefs-system get pod -o wide NAME                                    READY   STATUS    RESTARTS   AGE   IP            NODE      NOMINATED NODE   READINESS GATES rook-discover-7jvfk                     1/1     Running   0          76s   10.244.2.9    worker3   <none>           <none> rook-discover-h95k6                     1/1     Running   0          76s   10.244.1.10   worker2   <none>           <none> rook-discover-nmksm                     1/1     Running   0          76s   10.244.3.10   worker1   <none>           <none> rook-edgefs-operator-5c94848c48-dd84f   1/1     Running   0          84s   10.244.1.9    worker2   <none>           <none>

最初はサンプルのマニフェストで実行していたところエラーが発生し、うまく行っておりませんでした。(エラーのログ失念…)

stern を使ってPodの状態を関しすることで気づけました。

stern . -n rook-edgefs-system

デバイスの使用部分のところで存在するものをすべて使おうとしていてエラーとなっていました。(この記事だと3秒ぐらいで気づいたような記載ですが、ここに気づくのにすごい時間がかかった

ここらへんをヒントに対応して行きました。

https://github.com/Nexenta/edgefs/issues/385

ということであれば、cluster.yaml を以下のように修正し対応しました。

Before

useAllDevices: true

After

useAllDevices: false

シングルノードの場合はyamlの#sysRepCount: 1 のコメントを外してください。

デフォルトでは3なので3つの場所にレプリカを取れないとエラーとなります。

今回はマルチノードで実施したため変更はしませんでした。

デプロイ後の確認

再度デプロイすると以下のように無事完了しました。

❯ kubectl get pod -n rook-edgefs -o wide 
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES rook-edgefs-mgr-795c59c456-pgdrm 3/3 Running 0 3m30s 10.244.1.15 worker2 <none> <none> rook-edgefs-target-0 3/3 Running 0 3m30s 10.244.2.12 worker3 <none> <none> rook-edgefs-target-1 3/3 Running 0 3m30s 10.244.3.13 worker1 <none> <none> rook-edgefs-target-2 3/3 Running 0 3m30s 10.244.1.16 worker2 <none> <none>

サービスも確認してみましょう。

❯ kubectl get svc --all-namespaces NAMESPACE     NAME                  TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                      AGE default       kubernetes            ClusterIP   10.96.0.1        <none>        443/TCP                      45h kube-system   kube-dns              ClusterIP   10.96.0.10       <none>        53/UDP,53/TCP,9153/TCP       45h rook-edgefs   rook-edgefs-mgr       ClusterIP   10.97.189.186    <none>        6789/TCP                     6h52m rook-edgefs   rook-edgefs-restapi   ClusterIP   10.107.169.160   <none>        8881/TCP,8080/TCP,4443/TCP   6h52m rook-edgefs   rook-edgefs-target    ClusterIP   None             <none>        <none>                       6h52m rook-edgefs   rook-edgefs-ui        ClusterIP   10.108.180.155   <none>        3000/TCP,3443/TCP            6h52m

サービスの中のrook-edgefs-ui が管理画面になっています。forwardして画面を確認しました。無事3ノード分のクラスタができていました。

ダッシュボード

仮想マシンを1台電源オフにすると 以下のようになりました。

まとめ

本日はEdgeFS Operatorの導入とクラスタの導入までを書きました。

事前要件さえ満たしていれば3分でできます。この記事を書くためにハマっていましたがなんかも作り直しをしました。Operatorを使うことでそれだけ簡単にできるということが身を持って理解できました。

確かに簡単に色々できてしまうのですが肝心の仕組みがうまく理解できません。むしろそこら辺を気にしなくていいようにOperatorが作られているので正しいのですが…。この件に関しては4日目に掘り下げていきたいと思います。

明日は本日作ったクラスタ上にNFSサービスを実行し、実際にPVとして見えるところまでを行います。

--

--

makotow
makotow’s blog clone

kubernetes/container/docker/Programming/Go/Scala/Ruby/Mac/Emacs/IntelliJ/Rust/OpenShift.