はじめに
- Red Hat社が提供するKubernetesのディストリビューションとして、エンタープライズな領域を中心によく使われている印象(やっぱり保守受けたいですよね、わかります)があるRed Hat OpenShift Container Platform(OCP)。
- そのOCPの、AWSによるマネージドサービスがRed Hat OpenShift Service on AWS(ROSA)。
- そのROSAとAmazon FSx for NetApp ONTAP(FSx for ONTAP)との統合について紹介されているAWSブログを読んで、興味が湧いてきたので自分でも試してみました。ちなみにOpenShift自体は少し触れたことがありますが、ROSA自体に触れるは全くの初めてです。
- ROSAクラスタのデプロイ編の記事でROSAクラスタを作成するところまでは完了したので、今回はFSx for ONTAPのデプロイからPVのマウントまでをやってみます。
前回はWindowsでやっていましたが、今回はROSAクラスタがあるVPC上に立てたAmazon Linux上で作業する場合の手順です。2023年2月上旬に実施していますので、今後手順等が変わったらすみません。
予め用意しておくもの
- ROSAクラスタ(前回の記事で作成したもの)
早速やってみた
FSx for ONTAPのデプロイ
-
参考にしたこちらのブログではCloudFormationでデプロイしていますが、今回はあえてGUI(AWSマネジメントコンソール)でやってみました。
-
「ファイルシステムのオプション」は「Amazon FSx for NetApp ONTAP」を選択し、「次へ」をクリック。
-
「ネットワークとセキュリティ」は以下の通り選択。
- VPC:ROSAクラスタがあるVPC(ROSAデプロイ時に自動作成されたもの)
- VPCセキュリティグループ:ROSAクラスタのMaster Node用、Worker Node用セキュリティグループの両方(ROSAデプロイ時に自動作成されたもの)
- サブネット:ROSAクラスタのWorker Nodeがあるプライベートサブネット(ROSAデプロイ時に自動作成されたもの)
今回、検証なのでセキュリティグループは適当にROSAクラスタのものを使いまわしています。本番利用される場合は、ちゃんとFSx for ONTAP用に最小権限で作成したほうがいいです。
また、Astra Tridentが通信に使用するポートはセキュリティグループのインバウンドルールに追加しておく必要があります。(追加時のスクリーンショット取り忘れてました。。。)
-
「セキュリティと暗号化」は、以下の通り入力/選択。
- 暗号化キー:aws/fsx(デフォルト)
- ファイルシステム管理パスワード:「パスワードを指定」を選択
- パスワード:任意のものを入力
-
「デフォルトのストレージ仮想マシン設定」は、以下の通り入力/選択。
- ストレージ仮想マシン名:svm1(任意の名前でOK)
- SVM管理パスワード:「パスワードを指定」を選択(Astra Tridentでストレージバックエンドの設定をするのに必要)
- ルートボリュームのセキュリティスタイル:Unix (Linux)
- Active Directory:Active Directoryに参加しない
-
「デフォルトのボリューム設定」、「バックアップとメンテナンス - オプション」、「タグ」は、以下の通り入力/選択し、「次へ」をクリック。(今回の検証なら適当でOK)
Astra Trident(CSIドライバ)の設定
Astra Tridentとは
- NetAppストレージ用のCSIドライバ。
- Astra Tridentを介してKubernetesのレイヤーからNetAppストレージへPersistentVolumeの要求やSnapshotなどの操作を実施可能。
- ハードウェアストレージであってもFSx for ONTAPのようなクラウド上のストレージサービスであっても同じドライバを利用可能。
- 勿論、Red Hat OpenShift(ROSA含む)でも利用可能。
- ここからは、ROSAクラスタとFSx for ONTAPがあるVPC内に立てたAmazon Linux(AWS CLI、OC CLI、ROSA CLI、Helmがインストール済)から操作していきます。
Astra Tridentのインストール
- 以下コマンドにて、ROSAクラスタにログイン。(実際のログイン先、認証情報は前回の記事参照)
$ oc login https://api.st-rosa-test.XXXX.XX.openshiftapps.com:6443 --username cluster-admin --password XXXXXXXXXXXXXXXXXXXXXXX Login successful. You have access to 101 projects, the list has been suppressed. You can list all projects with 'oc projects' Using project "default". Welcome! See 'oc help' to get started.
- 以下コマンドにて、Astra Trident用のNamespace
trident
を作成。$ oc create ns trident namespace/trident created
- 以下コマンドにて、Astra Trident(今回はv22.10.0)のインストーラをダウンロード。
$ curl -L -o trident-installer-22.10.0.tar.gz https://github.com/NetApp/trident/releases/download/v22.10.0/trident-installer-22.10.0.tar.gz
- 以下コマンドにて、インストーラの圧縮ファイルを解凍。
$ tar -xvf ./trident-installer-22.10.0.tar.gz
- 以下コマンドにて、Helmを使ってAstra Tridentをインストール。
$ cd trident-installer/helm $ helm install trident -n trident trident-operator-22.10.0.tgzz W0206 13:31:09.800783 3835 warnings.go:70] would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "trident-operator" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "trident-operator" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "trident-operator" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "trident-operator" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") NAME: trident LAST DEPLOYED: Mon Feb 6 13:31:06 2023 NAMESPACE: trident STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI storage provisioner for Kubernetes. Your release is named 'trident' and is installed into the 'trident' namespace. Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster. To configure Trident to manage storage resources, you will need a copy of tridentctl, which is available in pre-packaged Trident releases. You may find all Trident releases and source code online at https://github.com/NetApp/trident. To learn more about the release, try: $ helm status trident $ helm get all trident
Astra Tridentのインストール
- 以下コマンドにて、ROSAクラスタにログイン。(実際のログイン先、認証情報は前回の記事参照)
$ oc login https://api.st-rosa-test.XXXX.XX.openshiftapps.com:6443 --username cluster-admin --password XXXXXXXXXXXXXXXXXXXXXXX Login successful. You have access to 101 projects, the list has been suppressed. You can list all projects with 'oc projects' Using project "default". Welcome! See 'oc help' to get started.
- 以下コマンドにて、Astra Trident用のNamespace
trident
を作成。$ oc create ns trident namespace/trident created
- 以下コマンドにて、Astra Trident(今回はv22.10.0)のインストーラをダウンロード。
$ curl -L -o trident-installer-22.10.0.tar.gz
- 以下コマンドにて、圧縮ファイルのインストーラを解凍。
$ tar -xvf ./trident-installer-22.10.0.tar.gz
- 以下コマンドにて、Helmを使ってAstra Tridentをインストール。
$ cd trident-installer/helm $ helm install trident -n trident trident-operator-22.10.0.tgzz W0206 13:31:09.800783 3835 warnings.go:70] would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "trident-operator" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "trident-operator" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "trident-operator" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "trident-operator" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") NAME: trident LAST DEPLOYED: Mon Feb 6 13:31:06 2023 NAMESPACE: trident STATUS: deployed REVISION: 1 TEST SUITE: None NOTES: Thank you for installing trident-operator, which will deploy and manage NetApp's Trident CSI storage provisioner for Kubernetes. Your release is named 'trident' and is installed into the 'trident' namespace. Please note that there must be only one instance of Trident (and trident-operator) in a Kubernetes cluster. To configure Trident to manage storage resources, you will need a copy of tridentctl, which is available in pre-packaged Trident releases. You may find all Trident releases and source code online at https://github.com/NetApp/trident. To learn more about the release, try: $ helm status trident $ helm get all trident
FSx for ONTAPをバックエンドとして設定
-
以下コマンドにて、適当な作業ディレクトリ(今回はホームディレクトリ)に移動。
$ cd ~/
-
以下コマンドにて、SVMのシークレット用のyamlファイルを作成し、保存。
$ vi svm_secret.yaml
svm_secret.yamlapiVersion: v1 kind: Secret metadata: name: backend-fsx-ontap-nas-secret namespace: trident type: Opaque stringData: username: vsadmin password: <FSx for ONTAPデプロイ時に設定したSVM管理パスワード>
-
以下コマンドにて、シークレットを追加。
$ oc apply -f svm_secret.yaml secret/backend-fsx-ontap-nas-secret created
-
以下コマンドにて、シークレットが追加されたことを確認。
$ oc get secrets -n trident |grep backend-fsx-ontap-nas backend-fsx-ontap-nas-secret Opaque 2 8s
-
AWSマネジメントコンソールのFSx for ONTAPの画面からストレージ仮想マシン(SVM)のエンドポイントを確認。
-
以下コマンドにて、バックエンド設定用のyamlファイルを作成し、保存。ここでSVMへの接続のために先ほど作成したシークレットが登場します。
$ vi backend-ontap-nas.yaml
backend-ontap-nas.yamlapiVersion: trident.netapp.io/v1 kind: TridentBackendConfig metadata: name: backend-fsx-ontap-nas namespace: trident spec: version: 1 backendName: fsx-ontap storageDriverName: ontap-nas managementLIF: 10.0.225.117 <- 上記で確認した「管理IPアドレス」 dataLIF: 10.0.225.117 <- 上記で確認した「NFS IPアドレス」 svm: svm1 <- 作成したストレージ仮想マシン名 credentials: name: backend-fsx-ontap-nas-secret
ちょっと前まではバックエンドの設定はjsonファイルで定義して
tridentctl
コマンドを使用して設定するものだったんですが、v21.04からはTridentBackendConfig
オブジェクトが導入されたので、kubectl apply
やoc apply
コマンドで設定できるようになりました。 -
以下コマンドにて、FSx for ONTAPをバックエンドとして構成。
$ oc apply -f backend-ontap-nas.yaml tridentbackendconfig.trident.netapp.io/backend-fsx-ontap-nas created
-
以下コマンドにて、バックエンドが構成されていることを確認。(
tbc
はTridentBackendConfig
)$ oc get tbc -n trident NAME BACKEND NAME BACKEND UUID PHASE STATUS backend-fsx-ontap-nas fsx-ontap 3051def7-bb11-4fea-aa37-9f3f018865f8 Bound Success
ストレージクラスの作成
- 以下のコマンドにて、ストレージクラス設定用のyamlファイルを作成し、保存。
$ vi storage-class-csi-nas.yaml
storage-class-csi-nas.yamlapiVersion: storage.k8s.io/v1 kind: StorageClass metadata: name: trident-csi provisioner: csi.trident.netapp.io parameters: backendType: "ontap-nas" fsType: "ext4" allowVolumeExpansion: True reclaimPolicy: Retain
- 以下コマンドにて、ストレージクラスを作成。
$ oc apply -f storage-class-csi-nas.yaml storageclass.storage.k8s.io/trident-csi created
- 以下コマンドにて、ストレージクラスが作成されていることを確認。
$ oc get sc NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE gp2 kubernetes.io/aws-ebs Delete WaitForFirstConsumer true 82m gp2-csi ebs.csi.aws.com Delete WaitForFirstConsumer true 77m gp3 (default) ebs.csi.aws.com Delete WaitForFirstConsumer true 82m gp3-csi ebs.csi.aws.com Delete WaitForFirstConsumer true 77m trident-csi csi.trident.netapp.io Retain Immediate true 5s
PersistentVolumeを作成(サンプルのMySQLのStatefulSetをデプロイ)
- 以下コマンドにて、MySQL用のNamespace
mysql
を作成。$ oc create ns mysql namespace/mysql created
- 以下コマンドにて、MySQLのシークレット用のyamlファイルを作成し、保存。
$ vi mysql-secrets.yaml
mysql-secrets.yamlapiVersion: v1 kind: Secret metadata: namespace: mysql name: mysql-password type: opaque stringData: MYSQL_ROOT_PASSWORD: password
- 以下コマンドにて、MySQL用のシークレットを追加。
$ oc apply -f mysql-secrets.yaml secret/mysql-password created
- 以下コマンドにて、シークレットが追加されたことを確認。
$ oc get secrets -n mysql NAME TYPE DATA AGE builder-dockercfg-vssdp kubernetes.io/dockercfg 1 13s builder-token-5kj4x kubernetes.io/service-account-token 4 14s default-dockercfg-dsggs kubernetes.io/dockercfg 1 13s default-token-s775h kubernetes.io/service-account-token 4 14s deployer-dockercfg-5bjv5 kubernetes.io/dockercfg 1 13s deployer-token-jcd5h kubernetes.io/service-account-token 4 13s mysql-password opaque 1 6s
- 以下コマンドにて、MySQLのStatefulSet用のyamlファイルを作成し、保存。
$ vi mysql-statefulset.yaml
mysql-statefulset.yamlapiVersion: apps/v1 kind: StatefulSet metadata: namespace: mysql name: mysql-set spec: selector: matchLabels: app: mysql serviceName: "mysql" replicas: 3 template: metadata: labels: app: mysql spec: terminationGracePeriodSeconds: 10 containers: - name: mysql image: mysql:5.7 ports: - containerPort: 3306 volumeMounts: - name: mysql-store mountPath: /var/lib/mysql env: - name: MYSQL_ROOT_PASSWORD valueFrom: secretKeyRef: name: mysql-password key: MYSQL_ROOT_PASSWORD volumeClaimTemplates: - metadata: name: mysql-store spec: accessModes: ["ReadWriteMany"] storageClassName: trident-csi resources: requests: storage: 10Gi
- 以下コマンドにて、StatefulSetを作成。
$ oc apply -f mysql-statefulset.yaml Warning: would violate PodSecurity "restricted:v1.24": allowPrivilegeEscalation != false (container "mysql" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "mysql" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "mysql" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "mysql" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") statefulset.apps/mysql-set created
- 以下コマンドにて、MySQLのPodが作成されていることを確認。
$ oc get pods -n mysql NAME READY STATUS RESTARTS AGE mysql-set-0 1/1 Running 0 58s mysql-set-1 1/1 Running 0 36s mysql-set-2 1/1 Running 0 16s
- 以下コマンドにて、PVCが作成されていることを確認。
$ oc get pvc -n mysql NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE mysql-store-mysql-set-0 Bound pvc-db5d8d26-192c-454c-ba95-52a4dacf2935 10Gi RWX trident-csi 68s mysql-store-mysql-set-1 Bound pvc-a9015077-e97c-4054-9a6b-19ec12c157a5 10Gi RWX trident-csi 46s mysql-store-mysql-set-2 Bound pvc-9102b0af-85f7-48bb-a531-30a71d54cb27 10Gi RWX trident-csi 26s
- 以下コマンドにて、MySQLのサービス用のyamlファイルを作成し、保存。
$ vi mysql-service.yaml
mysql-service.yamlapiVersion: v1 kind: Service metadata: namespace: mysql name: mysql labels: app: mysql spec: ports: - name: mysql port: 3306 clusterIP: None selector: app: mysql
- 以下コマンドにて、MySQLのサービスを作成。
$ oc apply -f mysql-service.yaml service/mysql created
- 以下コマンドにて、MySQLのサービスが作成されていることを確認。
$ oc get svc -n mysql NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE mysql ClusterIP None <none> 3306/TCP 6s
- 以下コマンドにて、MySQL ClientのPod用のyamlファイルを作成し、保存。
$ vi mysql-client.yaml
mysql-client.yamlapiVersion: v1 kind: Pod metadata: name: mysql-client spec: containers: - name: mysql-container image: alpine command: ['sh','-c', "sleep 1800m"] imagePullPolicy: IfNotPresent
- 以下コマンドにて、MySQL Client用のPodを作成。
$ oc apply -f mysql-client.yaml Warning: would violate PodSecurity "restricted:latest": allowPrivilegeEscalation != false (container "mysql-container" must set securityContext.allowPrivilegeEscalation=false), unrestricted capabilities (container "mysql-container" must set securityContext.capabilities.drop=["ALL"]), runAsNonRoot != true (pod or container "mysql-container" must set securityContext.runAsNonRoot=true), seccompProfile (pod or container "mysql-container" must set securityContext.seccompProfile.type to "RuntimeDefault" or "Localhost") pod/mysql-client created
- 以下コマンドにて、MySQL ClientのPodが作成されたことを確認。
$ oc get pods NAME READY STATUS RESTARTS AGE mysql-client 1/1 Running 0 19s
- 以下コマンドにて、MySQL ClientのPodにログイン。
$ oc exec --stdin --tty mysql-client -- sh / #
- 以下コマンドにて、MySQL Clientツールをインストール
/ # apk add mysql-client fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/main/x86_64/APKINDEX.tar.gz fetch https://dl-cdn.alpinelinux.org/alpine/v3.17/community/x86_64/APKINDEX.tar.gz (1/7) Installing mariadb-common (10.6.11-r0) 0% 0% # 1% # 1% ## 2% ### 2% #### 3% #### 3% ##### 4% ###### 4% ####### 5% ####### 5% ######## (2/7) Installing libgcc (12.2.1_git20220924-r4) 6% ######### (3/7) Installing ncurses-terminfo-base (6.3_p20221119-r0) 6% ########## 7% ########## (4/7) Installing ncurses-libs (6.3_p20221119-r0) 7% ########### 8% ############# (5/7) Installing libstdc++ (12.2.1_git20220924-r4) 8% ############# 14% ###################### (6/7) Installing mariadb-client (10.6.11-r0) 15% ####################### 21% ################################ 27% ######################################## 27% ######################################### 33% ################################################## 38% ######################################################### 43% ################################################################# 48% ######################################################################## 54% ################################################################################# 59% ######################################################################################## 65% ################################################################################################# 69% ######################################################################################################## 75% ################################################################################################################# 79% ####################################################################################################################### 85% ################################################################################################################################ 89% ###################################################################################################################################### 95% ############################################################################################################################################### (7/7) Installing mysql-client (10.6.11-r0) 99% ##################################################################################################################################################### 100% ######################################################################################################################################################Executing busybox-1.35.0-r29.trigger OK: 41 MiB in 22 packages
- 以下のコマンドにて、MySQLに接続。(
mysql-secrets.yaml
に記載したパスワードを入力)/ # mysql -u root -p -h mysql-set-0.mysql.mysql.svc.cluster.local Enter password: Welcome to the MariaDB monitor. Commands end with ; or \g. Your MySQL connection id is 3 Server version: 5.7.41 MySQL Community Server (GPL) Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. MySQL [(none)]>
- 以下コマンドにて、データベースを作成
MySQL [(none)]> CREATE DATABASE erp; Query OK, 1 row affected (0.004 sec) MySQL [(none)]> CREATE TABLE erp.Persons ( ID int, FirstName varchar(255),Lastname varchar(255)); Query OK, 0 rows affected (0.011 sec) MySQL [(none)]> INSERT INTO erp.Persons (ID, FirstName, LastName) values (1234 , "John" , "Doe"); Query OK, 1 row affected (0.007 sec) MySQL [(none)]> commit; Query OK, 0 rows affected (0.000 sec) MySQL [(none)]> select * from erp.Persons; +------+-----------+----------+ | ID | FirstName | Lastname | +------+-----------+----------+ | 1234 | John | Doe | +------+-----------+----------+ 1 row in set (0.000 sec)
MySQLのStatefulSetのPodをスケール
-
以下コマンドにて、MySQLのStatefulSetのPodをスケール。
$ oc scale statefulsets mysql-set --replicas=4 -n mysql statefulset.apps/mysql-set scaled
-
以下コマンドにて、MySQLのPodが4つに増えていることを確認。
$ oc get pods -n mysql NAME READY STATUS RESTARTS AGE mysql-set-0 1/1 Running 0 6m38s mysql-set-1 1/1 Running 0 6m16s mysql-set-2 1/1 Running 0 5m56s mysql-set-3 1/1 Running 0 18s
-
AWSマネジメントコンソールからボリュームを確認すると、Astra Tridentを介して作成されたボリューム(
trident_pvc
で始まるボリューム)が4つあることを確認。
-
参考にしたこちらのブログではこの後バックアップとリストアも実行していますが、今回は割愛しました。
-
ということで、今回は以上で完了です。
まとめ
- ROSAでもAstra Tridentを介してFSx for ONTAPをPersitentVolumeとして利用できることを確認できました。
- ROSAはAWS側で一度有効化などをしておけばAWSのインフラの準備をする必要なく、コマンド一発でOpenShiftのクラスタを作成できるのが良いと思いました。
- オンプレミスでOpenShiftを利用しており、PersistentVolumeのバックエンドとしてNetAppのONTAPが搭載されたストレージを使用している場合、PVのボリュームをオンプレミスのストレージからFSx for ONTAPにレプリケーションしておけば、アプリケーションなどはyamlのマニフェストファイルさえあれば立ち上げられるので、簡単にクラウドDRを実現できると思いました。
- また機会があればいろいろ触ってみたいと思います。
参照記事
- https://aws.amazon.com/jp/blogs/news/scaling-container-workloads-with-shared-storage-for-red-hat-openshift-service-on-aws/
- https://docs.openshift.com/rosa/rosa_getting_started/rosa-quickstart-guide-ui.html
- https://www.rosaworkshop.io/
- https://aws.amazon.com/jp/blogs/news/whats-new-red-hat-openshift-service-on-aws/