株式会社ネットワールドのエンジニアがお届けする技術情報ブログです。
各製品のエキスパートたちが旬なトピックをご紹介します。

使ってみよう csi-unity !!(其ノ弐)

[Unity] 使ってみよう csi-unity !!(其ノ弐) 
 

皆様こんにちは。ネットワールドのストレージ担当の井上です。

今回も csi-unity についてみていきたいと思います!
其の壱(以下リンク)からの続きのになってますので、ご興味ある方はそちらも是非ご覧ください。
blogs.networld.co.jp

其の壱ではそもそも csi-unity が何かというところから入手方法、Compatibility/仕様を見てきました。
今回はいよいよ導入方法と使い方を見ていきたいと思います!

まず検証環境ですが、其の壱で確認したコンパチも踏まえて以下の環境で今回の検証を実施しています。

[検証環境]
 CentOS 7.8
 Kubernetes v1.19.2 ※Master1台構成
 Docker CE 3:19.03.13-3.el7


・csi-unityインストール

では早速インストールから見ていきましょう。導入・利用手順は其の壱で紹介したProduct Guideに記載されているので、そちらを参考に進めていきます。
流れは以下の感じです。

 1. csi-unity環境設定用パラメータファイル編集
 2. Unity連携用Secret作成
 3. インストール用スクリプト実行

(初挑戦でマニュアルが全部英語で色々詰まりましたが、わかってしまえば)とっても簡単ですね!
それぞれもうちょっと詳しく見てみましょう。

1. csi-unity環境設定用パラメータファイルではcsi-unity経由でVolumeを作成する際に使うUnityの名前poolやNASサーバの指定や、Volumeのprefix名をどうするか、作成時のオプション等を指定してあげます。
PoolやNASサーバなどの値はGUIでも確認可能ですが、CLI IDで指定する必要があります。なんというか、Unityらしさですよね。
以下は編集するyamlファイルの抜粋です。DLしたツール一式の中にサンプルファイルがあるのでコピーして使います。

[myvalue.yaml]

=======
storageArrayList:
- name: "XXXXXXXX"
isDefaultArray: "true"
storageClass:
storagePool: pool_1
FsType: "ext4"
thinProvisioned: "true"
isDataReductionEnabled: "false"
tieringPolicy: "0"
hostIOLimitName: ""
nasServer: "nas_1"
reclaimPolicy: Delete
snapshotClass:
retentionDuration: ""
=======

2.についてSecretというのは、K8sがクレデンシャルを扱うためのインスタンスです(という理解です)。
REST APIにアクセスするための証明書と、Unityへのログイン情報をSecretの形でK8sに持たせます。

openssl s_client -showcerts -connect <Unisphere IP:Port> </dev/null 2>/dev/null | openssl x509 -outform PEM > ca_cert_0.pem
kubectl create secret generic unity-certs-0 --from-file=cert-0=ca_cert_0.pem -n unity

(基本的にLinuxでK8sのコマンドを打っていく感じになります。)

kubectl create secret generic unity-creds -n unity --from-file=config=secret.json


[secret.json]

=======
{
"storageArrayList": [
{
"username": "admin",
"password": "password",
"restGateway": "https://XX.XX.XX.XX",
"arrayId": "XXXXXXXX",
"insecure": true,
"isDefaultArray": true
}
]
}
=======


パラメータとしてarrayIdというものがありますが、先のmyvalue.yamlの中で指定するnameの値と一致させることで、myvalue.yaml中で定義するUnityシステムとそのログイン情報(Secret)を紐づけているようです。

3.はスクリプトをキックするだけです。

./csi-install.sh --namespace unity --values ./myvalues.yaml

スクリプトの中でコンパチチェックなど色々やってくれているようです。

当然ながら色々ありまして、1発でうまくはいかなかったので、スクリプトの出力やcsi-unityのPod(後述)のDescription等々の各種情報を確認しつつ進めましょう。



・インストール後の状態

インストールが一通り終わるとK8sのunityネームスペースに、以下のように色々csi-unityのインスタンスが生成されています。

f:id:networld-blog-post:20201026141451p:plain

インストール後の状態

 この中でユーザに直接的に関係するのが赤枠で囲った、storageClassです。
storageClassはストレージのひな型のようなものですが、csi-unityでは図のように1つのunityシステムあたり3つのStorageClassができるので、利用するプロトコルに合わせてstorageClassを選ぶ形になっています。



・Dynamic Provisioning!!

ということで無事インストールが終わったので早速Dynamic Provisioningを試してみまみましょう!
static provisioningでは事前にストレージ管理者がVolumeを作成する必要がありますが、Dynamic Provisioningではコンテナを作る人が上述のstorageClassと容量を指定するだけで、K8sのpersistentVolume(コンテナの永続ストレージ)インスタンスと紐づくUnityのVolumeが生成されコンテナへのVolumeマウントまで自動で実施されます。いちいちストレージ管理者に容量やプロトコル、マウントのための情報を伝えてVoluemeを作成してもらう手間がかからないので、K8s/Storage双方の担当者の負担軽減になりますね!

本題のVolumeですが、Dynamic Provisioningでは永続ストレージをおくれ~!!という要求(persistentVolumeClaim/PVC)を作ることで、K8sで扱う永続ストレージオブジェクト(persistentVolume/PV)が動的に生成されます。
PVCの定義は以下のような感じで記述し、これをkubectl createしてあげます。
(K8s本家のチュートリアルを参考に、Volumeを使うアプリとしてWordpress&mysqlをデプロイしていますが、詳細はここでは割愛です)

---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: wp-pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 30Gi
storageClassName: unity-iscsi
---

下からの2行で容量とstorageClassを指定しており、これにより30GiのiSCSI接続のLUNが作成されることになります。
実際にPVCをcerateしたあとは、以下のようにVoluemeがマウントまでされているのが確認できます。
インストール時に編集したファイルで指定した「csivol-」というというのがLUN名のprefixとして付与されていますね。

f:id:networld-blog-post:20201026141650p:plain

VolumeのProvisioning確認

もちろんフロントエンドのWordpressも問題なく動作していますよ!

f:id:networld-blog-post:20201026143644p:plain

WordPress(フロントエンドアプリ)画面


・データ保護

やはり、永続ストレージの基盤としてストレージを用いることは、そのストレージ装置のIO性能だったり冗長性だったりというストレージ装置のメリットを享受したいというのがモチベーションになってくると思います。
persistentVolumeについてもcsi-unityを通じてK8sのVolume Snapshot機能(βリリース)を利用できるみたいなのですが、マニュアルを見てもリンク切れだったのと、まだGAにもなっていないようなのであまり需要の高いものではないのかもしれません。。
とはいえ、パブリッククラウドも売買システムも止まりうる昨今、バックアップやDRは必須だな・・・と認識をあらたにした方もいるのではないでしょうか。
念のため上記で作成したLUNで確認してみましたが、csi-unityにより作成されるリソースでもUnisphereから通常通りSnapshot取得/リストアやReplicationも設定することができました。

f:id:networld-blog-post:20201026143849p:plain

csi volume の Snapshot/Replication

はい、ということで、以上其の壱、其の弐と2回にわたってcsi-unityについて紹介してきましたが、いかがだったでしょうか?
今回はコンパチに記載のなかったDocker CEで試してみたので、無事動いてくれてよかったです。(切実)
K8sを本番環境として利用しているユーザーさんはまだまだ日本では多くはなさそうですが、コンテナを運ぶ波はいよいよ勢いを増してきている感じもありますよね。
今回の内容で、K8sには既にストレージ連携の仕組みがあって、コンテナでもストレージの恩恵を受けれるのだな!というところを認識してもらえれば幸いです。


それではここまで読んでいただきありがとうございました!
Thank you for reading!!

DellEMCプロダクトについてメーカーブログにも色々寄稿していますので、以下も是非ご参照ください!
https://www.dell.com/community/ストレージ-Wiki/tkb-p/storage-wiki-jp/label-name/EvalReport