Oracle Container Engine for Kubernetes(OKE)にRook-CephをデプロイしてWordPressを構築してみた

#はじめに
今までは見る専門だったのですが、諸々あってそろそろQiitaデビューをしようと思い、投稿しました。

表題の通り、Oracle Container Engine for KubernetesにRook-CephをデプロイしてWordPress環境を構築してみたいと思います。

Rook-Cephに関してはかなり素人なので、間違いがあればご指摘頂けるとありがたいです！

環境は以下の通りです。

+ Oracle Container Engine for Kubernetes:v1.15.7(Master/Workerともに)
+ Rook:v1.3.3
+ Ceph:v14.2.9

この記事は、Rook-Cephをただ動かしてみるだけの記事になっています。
Rook-Ceph自体についての解説はこの記事では行いません。
[まとめ](#まとめ)にも記載しましたが、Rook-Ceph自体については今後の目標として投稿していきたいと思っています。

では、やっていきます！

(5/20追記)
寝ぼけていたのか手順を1つ入れ忘れていました...申し訳ございません...
Rook-CephのデプロイとWordPressの構築の間に「3. CephBlockPoolとStorageClassの作成」を追加しています。

#1. Oracle Container Engine for Kubernetes(OKE)のプロビジョニング

まず、OKEクラスタをプロビジョニングしていきます。
ちなみにこの記事では、リージョンはAshburnとします。

プロビジョニングについては、[公式で提供されているハンズオンドキュメント](https://oracle-japan.github.io/paasdocs/documents/containers/common/)があるので、こちらのリンクを参照します。
※リンク先の「上記ハンズオン共通手順」と書かれている部分がプロビジョニング手順になっており、ついでにOKEクラスタにアクセスするためのクライアントも作成できます。

OKEのプロビジョニング自体は上記で完了しますが、今回はRook-Cephを利用するために追加でWorker NodeにBlock Volumeをアタッチしてみます。

Oracle Clooud Infrastructure(OCI)コンソールの`ブロック・ストレージ`というメニューをクリックします。

<img width="300" alt="スクリーンショット 2020-05-19 18.52.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/38aa1971-e210-1c4b-1f28-a1cc98d5ec57.png">

`ブロック・ボリュームの作成`をクリックします。

<img width="257" alt="スクリーンショット 2020-05-19 18.55.28.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/2dabc244-49ca-da39-e1bf-60be6823265b.png">

作成画面が表示されるので、必要項目を入れて、`ブロック・ボリュームの作成`ボタンをクリックします。

<img width="1686" alt="スクリーンショット 2020-05-19 18.56.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/2697b1dd-dca0-25fe-c02d-ea35fe4ed165.png">


ここで今回重要になるのは、可用性ドメイン(AD)の部分です。
今回はAshburnリージョン(ADは3ドメイン)なので、デフォルトでは各可用性ドメインそれぞれに1ノードずつ合計3つのWoker Nodeがプロビジョニングされます。
そのため、ブロック・ボリュームについても各可用性ドメインごとに1つずつ合計3つ作成します。

ブロック・ボリュームが3つ作成できたら、Worker Nodeにアタッチしていきます。

作成したブロック・ボリュームをクリックすると、詳細画面が表示されます。

画面左端の`アタッチされたインスタンス`をクリックします。
<img width="293" alt="スクリーンショット 2020-05-19 19.06.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/dd582297-8931-b7cf-2c40-03ea7262a477.png">

`インスタンスにアタッチ`をクリックします。
<img width="209" alt="スクリーンショット 2020-05-19 19.23.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/71816a94-0f97-2e15-e418-ba3d86600a9d.png">

アタッチするための画面が表示されるので、必要項目を入れて、`アタッチ`をクリックします。
<img width="1650" alt="スクリーンショット 2020-05-19 19.23.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/00e64724-8025-2ca6-3874-44a0a6575180.png">

ここで重要になるのは、アタッチ対象の「インスタンス」です。インスタンスはOKEのWoker Nodeを選択するようにします。
アタッチメントタイプは、「準仮想化」を選択します。

アタッチが完了すると以下のように`アタッチ済`と表示されます。これをWorker Node3つ分実施すれば完了です！
<img width="561" alt="スクリーンショット 2020-05-19 19.40.30.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/7c101afa-f648-ddf2-10a9-3512df418cd8.png">

#2. Rook-Cephのデプロイ

Rook-Cephのデプロイについては、[Ceph Storage Quickstart](https://github.com/rook/rook/blob/master/Documentation/ceph-quickstart.md)で公開している手順にしたがって実施していきます。

まずは、rookレポジトリをgit cloneします。

```
git clone https://github.com/rook/rook.git
```

cloneしたレポジトリ内にCephクラスタを構築するためのmanifestセットがあります。

```
cd rook/cluster/examples/kubernetes/ceph
```

まずは、manifestセットの中の`commmon.yaml`をデプロイします。

```
kubectl create -f common.yaml
```

`common.yaml`は、Cephクラスタを構築するためのNamespace、CustomResourceDefinition、(Cluster)Role、(Cluster)RoleBinding、Service Accountなどを作成するためのmanifestになっています。

続いて、CephクラスタのOperatorをデプロイします。

```
kubectl create -f operator.yaml
```

Cephクラスタをデプロイします。

```
kubectl create -f cluster.yaml
```

クラスタが構築されたので、Podを確認してみます。namespaceはrook-cephという名前のようです。

```
[opc@oke-client kubernetes]$  kubectl get pod -n rook-ceph
NAME                                                   READY   STATUS      RESTARTS   AGE
csi-cephfsplugin-8d7p6                                 3/3     Running     0          11m
csi-cephfsplugin-lws5k                                 3/3     Running     0          11m
csi-cephfsplugin-provisioner-74579b599c-ks9t9          5/5     Running     0          11m
csi-cephfsplugin-provisioner-74579b599c-mdfpt          5/5     Running     0          11m
csi-cephfsplugin-rz7qr                                 3/3     Running     0          11m
csi-rbdplugin-czfnw                                    3/3     Running     0          11m
csi-rbdplugin-d26t7                                    3/3     Running     0          11m
csi-rbdplugin-provisioner-79cdfdbc64-9nk46             6/6     Running     0          11m
csi-rbdplugin-provisioner-79cdfdbc64-jwg69             6/6     Running     0          11m
csi-rbdplugin-rrb27                                    3/3     Running     0          11m
rook-ceph-crashcollector-10.0.10.10-94bd48669-rt68l    1/1     Running     0          46m
rook-ceph-crashcollector-10.0.10.11-86bfb47dbb-dnccv   1/1     Running     0          46m
rook-ceph-crashcollector-10.0.10.9-67d95475d9-pct86    1/1     Running     0          22m
rook-ceph-mgr-a-7d4b5f56-nwlnb                         1/1     Running     0          47m
rook-ceph-mon-a-78f5c44b88-7hbj2                       1/1     Running     0          45m
rook-ceph-mon-b-68db8964f6-xr2bc                       1/1     Running     0          46m
rook-ceph-mon-c-f9475b799-t64dp                        1/1     Running     0          45m
rook-ceph-operator-7d99d768f4-8p94q                    1/1     Running     0          23m
rook-ceph-osd-0-f6b7945b7-fvdx5                        1/1     Running     0          22m
rook-ceph-osd-1-567995f68b-65xb9                       1/1     Running     0          22m
rook-ceph-osd-2-6cb9b454f-fqd68                        1/1     Running     0          22m
rook-ceph-osd-prepare-10.0.10.10-7wvdg                 0/1     Completed   0          22m
rook-ceph-osd-prepare-10.0.10.11-wqvjc                 0/1     Completed   0          22m
rook-ceph-osd-prepare-10.0.10.9-vh7nf                  0/1     Completed   0          22m
rook-discover-42n6l                                    1/1     Running     0          14m
rook-discover-lzn6q                                    1/1     Running     0          14m
rook-discover-vwl6p                                    1/1     Running     0          14m
```

Cephクラスタの状態は以下で確認できます。
"CephCluster"というリソースは、先ほどデプロイした`cluster.yaml`で作成されたCR(Custom Resource)です。
`HEALTH_OK`なので、問題ないようですね。

```
[opc@oke-client kubernetes]$ kubectl get CephCluster -n rook-ceph
NAME        DATADIRHOSTPATH            MONCOUNT   AGE     PHASE   MESSAGE   HEALTH
rook-ceph   /dev/oracleoci/oraclevdb   3          44m                     HEALTH_OK
```

[Ceph Storage Quickstart](https://github.com/rook/rook/blob/master/Documentation/ceph-quickstart.md)では、Rook toolboxというDeploymentをデプロイして、そのコンテナ上からチェックするような手順になっていますが、ステータスのチェック程度であれば、個人的には上記手順の方が楽なのはないかと思います。
エラーなどで細かい情報を取得する際にはRook toolboxが便利かと思います。

これでCephクラスタがデプロイできました！非常に簡単ですね！！

#3. StorageClassとCephBlockPoolの作成

次にStorageClassとCephBlockPoolを作成します。
ここで何をしているのかも今後記事にしていけたらと思います。
manifestファイルは以下の通りです。

```yaml:storageclass.yaml
apiVersion: ceph.rook.io/v1
kind: CephBlockPool
metadata:
  name: replicapool
  namespace: rook-ceph
spec:
  failureDomain: host
  replicated:
    size: 3
---
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
   name: rook-ceph-block
# Change "rook-ceph" provisioner prefix to match the operator namespace if needed
provisioner: rook-ceph.rbd.csi.ceph.com
parameters:
    # clusterID is the namespace where the rook cluster is running
    clusterID: rook-ceph
    # Ceph pool into which the RBD image shall be created
    pool: replicapool

    # RBD image format. Defaults to "2".
    imageFormat: "2"

    # RBD image features. Available for imageFormat: "2". CSI RBD currently supports only `layering` feature.
    imageFeatures: layering

    # The secrets contain Ceph admin credentials.
    csi.storage.k8s.io/provisioner-secret-name: rook-csi-rbd-provisioner
    csi.storage.k8s.io/provisioner-secret-namespace: rook-ceph
    csi.storage.k8s.io/node-stage-secret-name: rook-csi-rbd-node
    csi.storage.k8s.io/node-stage-secret-namespace: rook-ceph

    # Specify the filesystem type of the volume. If not specified, csi-provisioner
    # will set default as `ext4`.
    csi.storage.k8s.io/fstype: xfs

# Delete the rbd volume when a PVC is deleted
reclaimPolicy: 
```

このファイルを適用します。

```
kubectl create -f storageclass.yaml
```

#4. WordPressの構築

サンプルアプリケーションをデプロイしてみます。

ちょうどよくrookレポジトリにWordPressのmanifestがあるので、こちらを使用させていただきます。

ディレクトリを移動します。

```
cd rook/cluster/examples/kubernetes
```

まず、mysqlをデプロイします。

```
kubectl create -f mysql.yaml
```

次にWordPressをデプロイします。

```
kubectl create -f wordpress.yaml
```

Podの状態を確認します。

```
NAME                               READY   STATUS    RESTARTS   AGE
wordpress-8968cd5b6-dshll          1/1     Running   0          5m
wordpress-mysql-6cc97b86fc-4hnbw   1/1     Running   0          5m
```

ちゃんと`Running`になっていますね。

PVC(Persistent Volume Claim)とPV(Persistent Volume)も見ておきましょう。

```
[opc@oke-client kubernetes]$ kubectl get pvc
NAME             STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS      AGE
mysql-pv-claim   Bound    pvc-2ad79794-7f31-495b-81c4-f8e105358a88   20Gi       RWO            rook-ceph-block   5m
wp-pv-claim      Bound    pvc-b254fd73-a5ba-45f1-90ef-faa3465ea8de   20Gi       RWO            rook-ceph-block   5m
[opc@oke-client kubernetes]$ 
```

```
[opc@oke-client kubernetes]$ kubectl get pv
NAME                                       CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                    STORAGECLASS      REASON   AGE
pvc-2ad79794-7f31-495b-81c4-f8e105358a88   20Gi       RWO            Delete           Bound    default/mysql-pv-claim   rook-ceph-block            5m
pvc-b254fd73-a5ba-45f1-90ef-faa3465ea8de   20Gi       RWO            Delete           Bound    default/wp-pv-claim      rook-ceph-block            5m
[opc@oke-client kubernetes]$ 
```


StorageClassに`rook-ceph-block`が利用されていることが確認できます。

最後にWordPressにアクセスしてみます。今回はServiceとしてLoad Balancerタイプを利用しています。

```
[opc@oke-client kubernetes]$ kubectl get svc
NAME              TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)        AGE
kubernetes        ClusterIP      10.96.0.1      <none>           443/TCP        5h
wordpress         LoadBalancer   10.96.170.70   150.136.20.232   80:31111/TCP   5m
wordpress-mysql   ClusterIP      None           <none>           3306/TCP       5m
```

`External-IP`にアクセスします。

無事、WordPressのインストール画面が表示されました！！
<img width="2407" alt="スクリーンショット 2020-05-19 20.32.42.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/40392/e45d1de2-f406-17af-c9ff-6f3ebbf5c04e.png">

#まとめ

今回は、OKE上にRook-CephをデプロイしてWordPressを構築してみました。
今回はただ動かしてみただけで、まだまだRookについてもCephについても理解が浅いので、今後もっと詳細に勉強してみようと思います。
そのプロセスも記事として投稿したいと思っています。

#参考記事
[Running Ceph Clusters with Rook in Oracle Container Engine for Kubernetes](https://blogs.oracle.com/cloud-infrastructure/running-ceph-clusters-with-rook-in-oracle-container-engine-for-kubernetes)