見出し画像

【2020年2月17日掲載】CSI Driver for Dell EMC Isilonを試す(インストール編)

サービスマネージメントグループの秋元です。

今回は2019年12月の初旬にリリースされましたCSI Driver for Dell EMC Isilonを試してみましたのでご紹介したいと思います。

CSI Driver for Dell EMC Isilonとは

Dell EMC IsilonのCSIドライバーは、Dell EMC Isilonを使用した永続ストレージのプロビジョニングをサポートするContainer Storage Interface(CSI)ドライバーです。

CSI Driver for Dell EMC Isilon
FAQ / CSI Driver for Isilon

以降のCSI Driver for Dell EMC Isilonのインストールについての内容は上記レポジトリにある
CSI Driver for Dell EMC Isilon Product Guide and Release Notes v1.0.pdf
を参照しています。(※以降Product Guide)

インストールの必要要件

Product GuideではCSI Driverインストールに必要な要件として下記が挙げられています。

  • Supports CSI 1.1

  • Supports Kubernetes version 1.14.x

  • Supports Red Hat Enterprise Linux 7.6 host operating system

  • Supports Isilon OneFS 8.1 and 8.2

また、推奨として下記が挙げられています。

  • The recommended docker version is 18.06.

  • The recommended Helm and Tiller package version is 2.14.0.

今回検証を行った環境では仮想マシン3台を用意し、CSI Driver for Dell EMC Isilonをインストールする為の下準備として、それぞれ下記のバージョンでセットアップを行いました。本記事ではKubernetes等のセットアップについては触れませんので、検証環境構築の際には下記のバージョンを参考にしてください。

OS

[root@node1 ~]# cat /etc/centos-release
CentOS Linux release 7.6.1810 (Core)
[root@node1 ~]#

今回は検証目的の為CentOSを使用しています。本番環境での運用の際にはCSI Driver for Dell EMC IsilonのサポートOSであるRed Hat Enterprise Linuxをご利用ください。

Docker

[root@node1 ~]# docker version
Client:
 Version:           18.09.9
 API version:       1.39
 Go version:        go1.11.13
 Git commit:        039a7df9ba
 Built:             Wed Sep  4 16:51:21 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          18.09.9
  API version:      1.39 (minimum version 1.12)
  Go version:       go1.11.13
  Git commit:       039a7df
  Built:            Wed Sep  4 16:22:32 2019
  OS/Arch:          linux/amd64
  Experimental:     false
[root@node1 ~]#

Kubernetes

[root@node1 ~]# yum list installed | grep kube
cri-tools.x86_64                     1.13.0-0                       @kubernetes
kubeadm.x86_64                       1.14.10-0                      @kubernetes
kubectl.x86_64                       1.14.10-0                      @kubernetes
kubelet.x86_64                       1.14.10-0                      @kubernetes
kubernetes-cni.x86_64                0.7.5-0                        @kubernetes
[root@node1 ~]#
[root@node1 ~]# kubectl version
Client Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.10", GitCommit:"575467a0eaf3ca1f20eb86215b3bde40a5ae617a", GitTreeState:"clean", BuildDate:"2019-12-11T12:41:00Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"14", GitVersion:"v1.14.10", GitCommit:"575467a0eaf3ca1f20eb86215b3bde40a5ae617a", GitTreeState:"clean", BuildDate:"2019-12-11T12:32:32Z", GoVersion:"go1.12.12", Compiler:"gc", Platform:"linux/amd64"}
[root@node1 ~]#

Isilon OneFS

H400-1# uname -r
v8.1.2.0
H400-1#

インストールの前提条件

Product Guideでは前提条件として下記の記述があります。

  • Install Kubernetes

  • Enable Kubernetes feature gates

  • Configure Docker service

  • Install the Helm and Tiller package manager

Install Kubernetes

Kubernetesについてはインストールが終わっているものとします。検証環境では下記のようになっています。

[root@node1 ~]# kubectl get node
NAME    STATUS   ROLES    AGE    VERSION
node1   Ready    master   4d3h   v1.14.10
node2   Ready       4d3h   v1.14.10
node3   Ready       4d3h   v1.14.10
[root@node1 ~]# kubectl describe node | grep -A1 Internal
  InternalIP:  172.16.26.24
  Hostname:    node1
--
  InternalIP:  172.16.26.25
  Hostname:    node2
--
  InternalIP:  172.16.26.26
  Hostname:    node3
[root@node1 ~]#

Kubernetes以外の項目についてはProduct Guideにそれぞれ手順が記載されているのでこれを進めていきます。

Enable Kubernetes feature gates

Kuberntesのfeature gateの下記の機能を有効にしていきます。

  • VolumeSnapshotDataSource

  • KubeletPluginsWatcher

  • CSINodeInfo

  • CSIDriverRegistry

1. 各Kubernetes nodeの/var/lib/kubelet/config.yamlに設定を追加します。

[root@node1 ~]# cat << EOF > feature-gate.txt
VolumeSnapshotDataSource: true
KubeletPluginsWatcher: true
CSINodeInfo: true
CSIDriverRegistry: true
EOF
[root@node1 ~]#
[root@node1 ~]# for i in 172.16.26.{25,26};do scp feature-gate.txt $i:/root/;done
[root@node1 ~]# for i in 172.16.26.{24..26};do ssh $i 'cat /root/feature-gate.txt >> /var/lib/kubelet/config.yaml';done

2. master nodeの/etc/kubernetes/manifests/kube-apiserver.yamlに設定を追加します。

[root@node1 ~]# vim /etc/kubernetes/manifests/kube-apiserver.yaml

spec:
  containers:
  - command:
    - kube-apiserver
    - --advertise-address=172.16.26.24
..snip..
    - --tls-private-key-file=/etc/kubernetes/pki/apiserver.key
    - --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true

spec:containers:commandの最後にfeature-gatesの設定を追加しています。

3. master nodeの/etc/kubernetes/manifests/kube-controller-manager.yamlに設定を追加します。

[root@node1 ~]# vim /etc/kubernetes/manifests/kube-controller-manager.yaml
spec:
  containers:
  - command:
    - kube-controller-manager
    - --allocate-node-cidrs=true
..snip..
    - --use-service-account-credentials=true
    - --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true

spec:containers:commandの最後にfeature-gatesの設定を追加しています。

4. master nodeの/etc/kubernetes/manifests/kube-scheduler.yamlに設定を追加します。

[root@node1 ~]# vim /etc/kubernetes/manifests/kube-scheduler.yaml
spec:
  containers:
  - command:
    - kube-scheduler
    - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
..snip..
    - --leader-elect=true
    - --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true

spec:containers:commandの最後にfeature-gatesの設定を追加しています。

5. 各nodeの/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.confのKUBELET_KUBECONFIG_ARGSに設定を追加します。

[root@node1 ~]# vim /usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf
[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf"

[Service]
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --allow-privileged=true --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true"

6. 各nodeでsystemctlの設定を再読み込みして、kubeletを再起動します。

[root@node1 ~]# for i in 172.16.26.{24..26};do ssh $i 'systemctl daemon-reload && systemctl restart kubelet';done

Configure Docker service

1. 各nodeの/etc/systemd/system/multi-user.target.wants/docker.serviceに設定を追加します。

[root@node1 ~]# for i in 172.16.26.{24..26};do ssh $i \
  "sed -i '/\[Service\]/ aMountFlags=shared' /etc/systemd/system/multi-user.target.wants/docker.service";done

2. 各nodeでsystemctlの設定を再読み込みして、dockerを再起動します。

[root@node1 ~]# for i in 172.16.26.{24..26};do ssh $i 'systemctl daemon-reload && systemctl restart docker';done

Install the Helm and Tiller package manager

1. master nodeにHelmをインストールします。

[root@node1 ~]# curl https://raw.githubusercontent.com/helm/helm/master/scripts/get > get_helm.sh
[root@node1 ~]# chmod 700 get_helm.sh
[root@node1 ~]# ./get_helm.sh
[root@node1 ~]# helm init
[root@node1 ~]# helm version
Client: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
Server: &version.Version{SemVer:"v2.16.1", GitCommit:"bbdfe5e7803a12bbdf97e94cd847859890cf4050", GitTreeState:"clean"}
[root@node1 ~]#

推奨のバージョンは2.14.0となっていますが、最新の2.16.1でも動作を確認できたので特にバージョンは下げずこのまま進めます。

2. TillerのServiceAccountを設定します。

[root@node1 ~]# cat << EOF > rbac-config.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: tiller
  namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: tiller
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
  - kind: ServiceAccount
    name: tiller
    namespace: kube-system
EOF
[root@node1 ~]# 
[root@node1 ~]# kubectl create -f rbac-config.yaml

3. TillerのServiceAccountを更新します。

[root@node1 ~]# helm init --upgrade --service-account tiller

ここまででCSI driver for Dell EMC Isilonをインストールする為の下準備は終了です。

Install the CSI driver for Dell EMC Isilon

続いてCSI driver for Dell EMC Isilonのインストールを行います。

1. master nodeでgit cloneします。

[root@node1 ~]# git clone https://github.com/dell/csi-isilon.git

2. CSI driverインストール用のmyvalues.yamlを作成します。

[root@node1 ~]# cd csi-isilon/helm && cp csi-isilon/values.yaml ./myvalues.yaml

3. myvalues.yaml内のOneFSのエンドポイント(isiIP)を設定します。

myvalues.yamlのisiIPの初期値は下記となっている為、これを環境に合わせ設定します。

# "isiIP" defines the HTTPs endpoint of the Isilon OneFS API server
isiIP: 1.1.1.1
[root@node1 helm]# sed -ri 's/isiIP: .+$/isiIP: 172.16.27.157/' myvalues.yaml

4. myvalues.yamlのisiPathを確認し、Isilon側にディレクトリを作成してください。

# The default base path for the volumes to be created, this will be used if a storage class does not have the IsiPath parameter specified
# Ensure that this path exists on Isilon.
isiPath: "/ifs/data/csi"

Isilon側にisiPathで指定されているディレクトリを作成します。

H400-1# mkdir /ifs/data/csi
H400-1# ls -l /ifs/data/ | grep csi
drwxr-xr-x    2 root  wheel         0 Jan 10 10:17 csi
H400-1#

myvalues.yamlにはその他設定項目がありますが詳細はProduct Guideを参照してください。

5. Isilonにアクセスする際に使用するSecretファイルを作成します。

secret.yamlの初期状態は下記のようになっています。

[root@node1 helm]# cat secret.yaml
apiVersion: v1
kind: Secret
metadata:
  name: isilon-creds
  namespace: isilon
type: Opaque
data:
  # set username to the base64 encoded username
  username: YWRtaW4=
  # set password to the base64 encoded password
  password: UGFzc3dvcmQxMjMh
[root@node1 helm]#

Isilonのusernameとpasswordをbase64でエンコードしたものでsecret.yaml内の設定を書き換えてください。

[root@node1 helm]# echo -n "myusername" | base64
[root@node1 helm]# echo -n "mypassword" | base64

6. Kubernetesにisilonのnamespaceを作成します。

[root@node1 helm]# kubectl create namespace isilon
namespace/isilon created
[root@node1 helm]#

7. Secretを作成します。

[root@node1 helm]# kubectl create -f secret.yaml
secret/isilon-creds created
[root@node1 helm]#

8. CSI driverをインストールします。

[root@node1 helm]# sh install.isilon

正常にインストールが完了すると下記のような出力となります。

[root@node1 helm]# sh install.isilon
Kubernetes version v1.14.10
Kubernetes master nodes: 172.16.26.24
Kubernetes minion nodes: 172.16.26.25 172.16.26.26
Verifying the feature gates.
Verification Succeded.
*** Couldn't find isilon-certs. Creating an empty secret. Delete it and re-create it if you want to validate OneFS API server's certificates ***
secret/isilon-certs created
NAME:   isilon
LAST DEPLOYED: Fri Jan 10 10:42:08 2020
NAMESPACE: isilon
STATUS: DEPLOYED

RESOURCES:
==> v1/ClusterRole
NAME               AGE
isilon-controller  0s
isilon-node        0s

==> v1/ClusterRoleBinding
NAME               AGE
isilon-controller  0s
isilon-node        0s

==> v1/Pod(related)
NAME                 AGE
isilon-controller-0  0s
isilon-node-46s6m    0s
isilon-node-lktmc    0s

==> v1/ServiceAccount
NAME               AGE
isilon-controller  0s
isilon-node        0s

==> v1/StorageClass
NAME    AGE
isilon  0s

==> v1beta1/CSIDriver
NAME    AGE
isilon  0s

==> v1beta1/StatefulSet
NAME               AGE
isilon-controller  0s

==> v1beta2/DaemonSet
NAME         AGE
isilon-node  0s


NAME                  READY   STATUS    RESTARTS   AGE
isilon-controller-0   4/4     Running   0          10s
isilon-node-46s6m     2/2     Running   0          10s
isilon-node-lktmc     2/2     Running   0          10s
NAME                  READY   STATUS    RESTARTS   AGE
isilon-controller-0   4/4     Running   0          15s
isilon-node-46s6m     2/2     Running   0          15s
isilon-node-lktmc     2/2     Running   0          15s
NAME                  READY   STATUS    RESTARTS   AGE
isilon-controller-0   4/4     Running   0          20s
isilon-node-46s6m     2/2     Running   0          20s
isilon-node-lktmc     2/2     Running   0          20s
CSIDrivers:
NAME     CREATED AT
isilon   2020-01-10T01:42:08Z
CSINodeInfos:
No resources found.
StorageClasses:
NAME               PROVISIONER              AGE
isilon (default)   csi-isilon.dellemc.com   21s
No resources found.
installing volumesnapshotclass
volumesnapshotclass.snapshot.storage.k8s.io/isilon-snapclass created
VolumeSnapshotClasses:
NAME               AGE
isilon-snapclass   0s
[root@node1 helm]#

“*** Couldn’t find isilon-certs. Creating an empty secret. Delete it and re-create it if you want to validate OneFS API server’s certificates ***”

上記のメッセージは初回のインストール時には出力されますが、インストールスクリプト内でisilon-certsが無い場合にはisilon-certsを作成するようになっている為このまま進めて問題ありません。

Kubernetes側の状況を確認すると下記のようにCSI Driverがインストールされていることが確認できます。

CSI Driver

[root@node1 helm]# kubectl get csidriver
NAME     CREATED AT
isilon   2020-01-10T01:42:08Z
[root@node1 helm]#
[root@node1 helm]# kubectl describe csidriver isilon
Name:         isilon
Namespace:
Labels:       
Annotations:  
API Version:  storage.k8s.io/v1beta1
Kind:         CSIDriver
Metadata:
  Creation Timestamp:  2020-01-10T01:42:08Z
  Resource Version:    3099
  Self Link:           /apis/storage.k8s.io/v1beta1/csidrivers/isilon
  UID:                 69d12eb3-334a-11ea-a609-0050569cf7a7
Spec:
  Attach Required:    true
  Pod Info On Mount:  false
Events:               
[root@node1 helm]#

StorageClass

[root@node1 helm]# kubectl get storageclass
NAME               PROVISIONER              AGE
isilon (default)   csi-isilon.dellemc.com   2m3s
[root@node1 helm]# 
[root@node1 helm]# kubectl describe storageclass isilon
Name:                  isilon
IsDefaultClass:        Yes
Annotations:           storageclass.beta.kubernetes.io/is-default-class=true
Provisioner:           csi-isilon.dellemc.com
Parameters:            AccessZone=System,AzServiceIP=172.16.27.157,IsiPath=/ifs/data/csi
AllowVolumeExpansion:  
MountOptions:          
ReclaimPolicy:         Delete
VolumeBindingMode:     Immediate
Events:                
[root@node1 helm]#

PODs

[root@node1 helm]# kubectl get pods -n isilon
NAME                  READY   STATUS    RESTARTS   AGE
isilon-controller-0   4/4     Running   0          3m21s
isilon-node-46s6m     2/2     Running   0          3m21s
isilon-node-lktmc     2/2     Running   0          3m21s
[root@node1 helm]#

ここまででCSI Driver for Dell EMC Isilonのインストールは終了です。

CSI driver for Dell EMC Isilonにはテストツールも含まれています。

Test the CSI driver for Dell EMC Isilon

  • Test the CSI driver for Dell EMC Isilon

  • Test creating snapshots

  • Test restoring from a snapshot

次回は上記のテストがどのような動作となるかIsilon側も挙動も含めご紹介したいと思います。

ブロードバンドタワーのエンジニアブログ『 Tower of Engineers 』で公開されていた記事をnoteに再投稿させていただきました。

過去(2020年2月17日掲載)のものではありますが、皆様に再び楽しんでいただけると嬉しいです。これからも、価値ある記事や興味深い内容を、noteでシェアさせていただく予定です。どうぞ楽しみにお待ちください。

X(旧Twitter)でも情報を発信しております。ぜひフォローお願いします!