NetApp Astra Data Storeとは

# はじめに

初版: 2022年1月24日
2022/2/1 公開

「NetApp Astra Data Store」(以下ADS)は、仮想マシンとコンテナの統合データストアとして、クラウドのような柔軟性・拡張性を持った新しいソフトウェアデファインドストレージ(SDS)です。
従来のSDSでは難しかったエンタープライズレベルのデータ管理を実現し、スケーラブルで回復性のあるプラットフォームを提供します。

2022年1月現在では、ADSのプレビュー版をご提供しており、今後正式リリース予定のADSの機能を先行してお試しいただけます。
GA版は今年上半期中での提供を予定しており、Astra Control CenterからこのADSの管理ができる機能や、VMwareの管理プラグインなどをあわせてご提供する予定となっています。

ADSのClusterをストレージバックエンドとして使用するアプリケーションは、Astra Control Center(ACC)v21.12を使用して、データ保護、ディザスタリカバリ、Kubernetesワークロードの移行など、アプリケーションを意識したデータ管理機能を活用することができます。

#### 関連投稿一覧
* [NetApp Tridentとは](https://qiita.com/star76/items/fa88d715192f565e5832) 
* [NetApp Astra とは](https://qiita.com/star76/items/86c1df804fc762b22d8e) 
* [NetApp Astra Service を使ってみる ①GKE事前準備編](https://qiita.com/star76/items/4ec78181db97d0f52eb8) 
* [NetApp Astra Service を使ってみる ②AKS事前準備編](https://qiita.com/star76/items/4a2999590fd657082254) 
* [NetApp Astra Service を使ってみる ③UIの操作編](https://qiita.com/star76/items/1bb428404b6eb4337dd4) 
* [NetApp Astra Control のインストール](https://qiita.com/star76/items/84b1d0732e8ce2dbf4cc) 
* [NetApp Astra Control を使ってみる ①UIの操作編](https://qiita.com/star76/items/a746fdb78d07c32ef1bc) 
* [NetApp Astra Data Store とは](https://qiita.com/star76/items/ef8e809d9cad24d51e8e) 【本投稿】

# プレビュー版での制限  
ADSは、エンタープライズグレードの耐障害性を実現するために設計・開発されていますが、本プレビュー版では本番環境のワークロードを対象としていません。(プレビュー版からGA版へのアップグレードもできません。)またGA版とパフォーマンスは異なりますのでご注意下さい。
ADS プレビュー版での制限は以下のとおりとなっています。

|リソース|制限| 
|:------|:------|
|ノード|4ノード<br>(1台追加し5台に増設することでスケールアウトをお試しいただけます)|
|ノードあたりのPV数|最大10個まで|
|ノードあたりのvCPUコア数|10vCPU以上<br> (9x ADS用(1x ADSコントロールプレーン + 8x ADS データプレーン) + 1x K8sオーバヘッド)|
|クラスタあたりのvCPUコア|45vCPU以上|
|ノードあたりの最大プロビジョニング容量|1TiB|
|クラスタあたりの最大プロビジョニング容量|4TiB(1台増設した場合は、5TiB)|
|ボリュームあたりの容量|20MiB〜1TiB|
|ボリュームあたりのクローン数|9個|
|ボリュームあたりのSnapshot数|256個|
※ vVol、QoS機能はプレビュー版ではサポートされません。
※ ADSには、モニタリングのための Cloud Insightsの基本バージョンが含まれます。
※ プレビュー版では、Astra Trident CSIドライバーを使用したKubernetesワークロードのPVのプロビジョニングのみがサポートされています。VMワークロードは今後のリリースでサポートされる予定です。


# 必要要件  
ADSのインストールにあたり必要な要件は以下となっています。

| 必要要件 |  | 
|:---------------|---------------|
| Astra Data Store のライセンスファイル | [こちら](https://www.netapp.com/cloud-services/astra/data-store-form/)から入手下さい |
| Astra Data Store ソフトウェアバンドル | NetAppサポートサイトからダウンロードいただきます。<br>ダウンロード手順は、ライセンスファイルの取得手続き後に送付される案内に従い実施下さい。 |
| K8sクラスタ | v1.20以上であること |
| K8sクラスタ用クレデンシャル | ADSをK8sクラスタにインストールするためのクレデンシャル<br>クラスタの管理者権限が必要です |
| ADSを構成するノードのスペック | <ul><li>1つ以上のMasterノード: 4CPU/4GB RAM </li><li> 4つ以上のWorkerノード: 10CPU/36GB RAM </li>物理または仮想マシンのいずれもご使用になれます。<br>【物理の場合】<ul><li>ハイパーバイザーを使用せずにLinux上に直接K8sクラスタを展開します。</li><li>対応するサーバは、HPE DL360/380、DELL R640/R740/C6420、Lenovo SR630/SR650/SR635/SR665、NetApp HCI H610S となります。</li><li>SATAまたはNVMeのTLC SSDがサポートされます。</li></ul>【仮想マシンの場合】<ul><li>vSphere/ESXi 7.0上のLinux VMがサポートされます。KVMベースのVMはサポートされていません。</li><li>SATA、SAS、またはNVMeのTLC SSDベースのデータストアに対応し、仮想ディスクまたはパススルードライブをサポートします。</li><li>ホストがハードウェアRAIDコントローラを使用している場合、ハードウェアRAIDコントローラが「パススルー」モードを使用するように設定してください。</li></ul>|
| Workerノードのディスク | <ul><li>1x 100GB以上のホストOS用ディスク(例: sda) </li><li>1x 8GB以上のストレージOS用キャッシュディスク(例：sdb) </li><li> 3x 100GB以上(〜4TiB)のキャパシティディスク (例: sdc,sdd) </li></ul><ul><li>書き込み性能を上げるためには、低レイテンシーかつ低容量のキャッシュデバイスを構成する必要があります。</li><li>キャパシティディスクの種類は全て同じであること、また容量は全て同じサイズである必要があります。</li><li>NVMeおよびSSDのみをサポートします。RAID構成はサポートされません。</li><li>SCSIデバイスとしてホストに割り当てられた論理ボリュームユニットはサポートされません。</li><li>RAIDコントローラーを使用している場合は「パススルー」モードを有効にしてください。</li><li>SCSIデバイスとしてドライブと対話できる必要があります。</li><li>各ドライブには、固有のシリアル番号が必要です。VMの作成時に仮想マシンの詳細設定で disk.enableuuid=TRUEという属性を追加します。設定方法は、vCenterにログインし、仮想マシンの「設定の編集」-「仮想マシンオプション」-「詳細」-「構成パラメータ」で「設定の編集」をクリックし、「構成パラメータの追加」から「名前:disk.EnableUUID」の 「値：true」を入力してOKをクリックします。</li></ul>|
| CSIドライバ | ストレージのプロビジョニングとオーケストレーションを行うために、K8sクラスタにAstra Tridentのv21.10.1を展開する必要があります。|
| CNI | <ul><li>Native K8s: CalicoまたはWeave Net</li><li>OpenShift: OpenShift SDN for Red Hat OpenShift Container Platform</li><li>Anthos: Cilium for Google Anthos</li></ul>|
| 構成するノードのOS | <ul><li>RHEL 7.9/8.2以上</li><li>Red Hat Enterprise Linux CoreOS(RHCOS)</li><li>CentOS 8</li><li>Ubuntu 20.04</li>(いずれも英語版のみサポート)<br>ホストのファイアウォール(firewalld)は無効にする必要があります。</ul> |
| 必要なパッケージ | Workerノードには、nfs-utilsパッケージがインストールされている必要があります。<br> アプリケーションは、NFSv4.1で接続されるPVにアクセスしますが、これにはAUTH_SYS認証が必要となります。|
| ネットワークインタフェース | クラスタ、データ、および管理トラフィック用に、少なくとも1つの10GbE以上必要。管理トラフィックは、1GbEのインタフェースに分離できます。|
| IPアドレス | 各ノードに、管理ネットワークおよびストレージネットワーク用のIPv4アドレスを事前に設定します。<ul><li>管理ネットワーク用IP: 計5個以上(各ノード+VIP)</li><li>ストレージネットワーク: 計5個以上(各ノード+VIP) </li></ul>また、ノードに付与するIPの他に、各ネットワークに1つVirtual IPを確保しておく必要があります。Virtual IPは、インストールの際に設定されます。VLANタグの付与はサポートしていません。|
| インターネットへの接続 | NetAppのAutoSupportという機能を使用し、インターネット経由でsupport.netapp.comにメトリクスデータを送信します。(プロキシ経由も可)<br>プレビュー版では、インターネットへの接続が必須となります。<br>テレメトリが長期間無効になっている場合は、ADSが読み取り専用となります。<br>AutoSupportバンドルの送信に使用される設定は変更しないでください。定期的な AutoSupportバンドルの送信を無効にした場合は、その設定を再度有効にするまで新しいボリュームを作成できなくなります。|


# インストール手順  
以下の手順に従って、ADS環境をセットアップします。

### ソフトウェアバンドルの解凍
作業用端末上で、ダウンロードしたサポートバンドルの署名を確認し、問題なければ解凍します。
ソフトウェアバンドルには、以下が含まれています。
* コンテナイメージ
* kubectl-astrads バイナリ
* ADS構成仕様書/yamlファイル
ADSのインストールは、カスタムリソースに対してkubectlコマンドを使って、またはkubectl-astradsというプラグインを使って行われます。

```bash
$ openssl dgst -sha256 -verify 2021.12_astradatastore.pub -signature 2021.12_astradatastore.sig 2021.12_astradatastore.tar
$ mkdir 2021.12_astradatastore && cd 2021.12_astradatastore
$ tar -xvf ../2021.12_astradatastore.tar
```

kubectl-astrads バイナリファイル は、ADSをインストールして管理するために開発されたkubectlのカスタムエクステンションです。
このバイナリを K8sのkubectlバイナリがインストールされている標準パスにコピーします。

```bash
$ which kubectl
/usr/bin/kubectl 
$ sudo cp -f bin/kubectl-astrads [上記kubectlが含まれるパスを指定 例)/usr/local/bin/]
```

### イメージをローカルレジストリにプッシュ
イメージをローカルのレジストリにプッシュします。

```bash
$ export REGISTRY=[レジストリのURL:Port]
例: $ export REGISTRY=pregistry70.green.lab:5000

$ docker login $REGISTRY
$ for astraImageFile in $(ls images/*.tar) ; do
astraImage=$(docker load --input ${astraImageFile} | sed 's~Loaded image: ~~'); astraImageShort=`echo $astraImage | sed 's~.*/~~'`;
docker tag ${astraImage} ${REGISTRY}/${astraImageShort};
docker push ${REGISTRY}/${astraImageShort};
done

$ docker image ls
```

### マニフェストファイルのパラメータ変更
manifests フォルダの配下には、以下のマニフェストのテンプレートが予め用意されています。

```
astradscluster.yaml    
grafana_cluster.json  
monitoring_operator.yaml
astradsoperator.yaml  
astradsversion.yaml        
grafana_volume.json
```

ファイル内の[YOUR REGISTRY]の部分を、前のステップでイメージをプッシュしたレジストリのパスに変更します。

```bash
例
$ export REGISTRY=pregistry70.green.lab:5000
$ cd manifests/
$ sed -i 's~\[YOUR REGISTRY\]~'${REGISTRY}'~' *.yaml
```


### ADS Operatorのインストール 
````bash
$ kubectl apply -f ./manifests/astradsoperator.yaml

namespace/astrads-system created
customresourcedefinition.apiextensions.k8s.io/astradsautosupports.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradscloudsnapshots.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsclusters.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsexportpolicies.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsfaileddrives.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradslicenses.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsnfsoptions.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsnodeinfoes.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsnodemanagements.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsqospolicies.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsversions.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsvolumefiles.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsvolumes.astrads.netapp.io created
customresourcedefinition.apiextensions.k8s.io/astradsvolumesnapshots.astrads.netapp.io created
role.rbac.authorization.k8s.io/astrads-astrads-system-admin-role created
role.rbac.authorization.k8s.io/astrads-astrads-system-reader-role created
role.rbac.authorization.k8s.io/astrads-astrads-system-writer-role created
role.rbac.authorization.k8s.io/astrads-leader-election-role created
role.rbac.authorization.k8s.io/astrads-manager-role created
clusterrole.rbac.authorization.k8s.io/astrads-astrads-admin-clusterrole created
clusterrole.rbac.authorization.k8s.io/astrads-astrads-reader-clusterrole created
clusterrole.rbac.authorization.k8s.io/astrads-astrads-writer-clusterrole created
clusterrole.rbac.authorization.k8s.io/astrads-astradsautosupport-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsautosupport-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradscloudsnapshot-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradscloudsnapshot-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradscluster-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradscluster-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsexportpolicy-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsexportpolicy-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsfaileddrive-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsfaileddrive-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradslicense-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradslicense-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnfsoption-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnfsoption-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnodeinfo-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnodeinfo-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnodemanagement-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsnodemanagement-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsqospolicy-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsversion-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsversion-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolume-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolume-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolumefile-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolumefile-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolumesnapshot-editor-role created
clusterrole.rbac.authorization.k8s.io/astrads-astradsvolumesnapshot-viewer-role created
clusterrole.rbac.authorization.k8s.io/astrads-manager-role created
rolebinding.rbac.authorization.k8s.io/astrads-astrads-admin-rolebinding created
rolebinding.rbac.authorization.k8s.io/astrads-astrads-reader-rolebinding created
rolebinding.rbac.authorization.k8s.io/astrads-astrads-writer-rolebinding created
rolebinding.rbac.authorization.k8s.io/astrads-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/astrads-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/astrads-astrads-admin-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/astrads-astrads-reader-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/astrads-astrads-writer-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/astrads-manager-rolebinding created
configmap/astrads-autosupport-cm created
configmap/astrads-firetap-cm created
configmap/astrads-kevents-asup created
configmap/astrads-metrics-cm created
secret/astrads-autosupport-certs created
deployment.apps/astrads-operator created
```

Podが起動したことを確認します。

```bash
$ kubectl get pods -n astrads-system
NAME                               READY   STATUS    RESTARTS   AGE
astrads-operator-9ddfb8d7b-mb5cg   1/1     Running   0          50s
```


### ADSのインストール
ADSのコントロールプレーンをインストールします。

```bash
$ kubectl apply -f ./manifests/astradsversion.yaml
astradsversion.astrads.netapp.io/astradsversion created
```

Podが起動したことを確認します。

```bash
$ kubectl get pods -n astrads-system
NAME                                          READY   STATUS    RESTARTS   AGE
astrads-cluster-controller-85f6c86959-65f6l   1/1     Running   0          73s
astrads-ds-nodeinfo-astradsversion-2sskj      1/1     Running   0          84s
astrads-ds-nodeinfo-astradsversion-4vsng      1/1     Running   0          84s
astrads-ds-nodeinfo-astradsversion-jngtj      1/1     Running   0          84s
astrads-ds-nodeinfo-astradsversion-pkrsg      1/1     Running   0          84s
astrads-license-controller-7cbc9959c4-dnt6v   1/1     Running   0          75s
astrads-operator-9ddfb8d7b-mb5cg              1/1     Running   0          28m
```


### ADSライセンスの適用
サインアップの際に入手したADSのNetAppライセンスファイル(NLF)を適用します。
適用するためにはK8sのクラスタ名が必要になりますので、以下のコマンドで確認します。

```
$ kubectl config view

apiVersion: v1
clusters:
- cluster:
    certificate-authority-data: DATA+OMITTED
    server: https://10.128.211.70:6443
  name: adskspraycluster     <= K8sクラスタ名
contexts:
- context:
    cluster: adskspraycluster       
    user: kubernetes-admin
  name: kubernetes-admin@adskspraycluster
current-context: kubernetes-admin@adskspraycluster
kind: Config
preferences: {}
users:
- name: kubernetes-admin
  user:
    client-certificate-data: REDACTED
    client-key-data: REDACTED
```
ライセンスを適用します。

```zsh
$ kubectl astrads license add --license-file-path [ファイルのパス/ファイル名] --ads-cluster-name [ADSがインストールされたK8sクラスタ名] -n astrads-system

例:
$ kubectl astrads license add --license-file-path XXXXXXXXXX.txt --ads-cluster-name adskspraycluster -n astrads-system

Signature verified with key NETAPP_KEY
Successfully created XXXXXXXXXX

確認例:
$ kubectl get astradslicense -A
NAMESPACE        NAME         ADSCLUSTER         VALID   PRODUCT                     EVALUATION   ENDDATE      VALIDATED
astrads-system   XXXXXXXXXX   adskspraycluster   true    Astra Data Store   true         2022-02-21   2022-01-22T10:44:51Z

$ kubectl astrads license list
NAME      	ADSCLUSTER      	VALID	PRODUCT                  	EVALUATION	ENDDATE   	VALIDATED
XXXXXXXXXX	adscluster	true 	Astra Data Store	true      	2022-02-21	2022-01-22T10:44:51Z
```

### ADS Clusterのデプロイ
astradscluster.yaml ファイルを編集します。

```yaml:(例)astradscluster.yaml
$ vim manifests/astradscluster.yaml
(skip)
kind: AstraDSCluster
metadata:
  name: adskspraycluster          #...①
  namespace: astrads-system
(skip)
  # Specify the IP address of a floating management IP routable from any worker node in the cluster
  mvip: "10.128.211.45"           #...②
(skip)
  adsDataNetworks:                #...③
    - addresses: "192.168.0.46,192.168.0.47,192.168.0.48,192.168.0.49"     
      netmask: 255.255.255.0

  # [Optional] Specify the network interface names for either all or none
  adsNetworkInterfaces:           #...④
    managementInterface: "ens192"
    clusterInterface: "ens224"
    storageInterface: "ens224"
(skip)
  # [Optional] Provide a monitoring config to be used to setup/configure a monitoring agent.
  # monitoringConfig:               #...⑤
    # namespace: "netapp-monitoring"
    # repo: "pregistry70.green.lab:5000"

  autoSupportConfig:              #...⑥
```

以下の変更が必要です。
<b>① metadataセクションの「name」</b>
上記ライセンスの適用時に使用したクラスタ名と同じ名前である必要があります。

<b>② specセクションの「mvip」</b>
このIPアドレスは、クラスタ内のどのworkerノードからでもルーティング可能なフローティングIPである必要があります。

<b>③ specセクションの「adsDataNetworks」</b>
ボリュームをマウントする予定のホストからルーティング可能な、ストレージノードのIPアドレスとnetmaskをカンマ区切りで記入します。

<b>④ specセクションの「adsNetworkInterfaces」</b>
初期値は以下のような値が入っています。
`managementInterface: "mgmt"`
`clusterInterface: "data"`
`storageInterface: "data"`
それぞれの値を、管理ネットワーク、Clusterネットワーク、ストレージネットワークに使用されているネットワークインタフェース名に置き換えます。
* 名前が指定されていない場合は、ノードのプライマリインターフェースが管理、Cluster、およびストレージネットワークに使用されます。
* Clusterとストレージのネットワークは同じインターフェイスである必要があります。
* 管理インターフェースは、K8sノードの管理インターフェースと同じである必要があります。

<b>⑤ specセクションの「monitoringConfig」</b>
モニタリング用のエージェントをセットアップする場合は、モニタリングエージェントのNameSpace(デフォルトは「netapp-monitoring」)と、ローカルレジストリのパスを記載します。

<b>⑥ specセクションの「autoSupportConfig」</b>
AutoSupportのバンドルログの送付に関するパラメータです。
バンドルの送付にプロキシを使用しない場合は、デフォルトのままでOKです。
プロキシ経由の場合は、「proxyURL」に、AutoSupportバンドルの送付に使用するプロキシのURLを記載します。

ファイルの編集が完了したら、適用します。

```zsh
$ kubectl apply -f manifests/astradscluster.yaml
astradscluster.astrads.netapp.io/adskspraycluster created
```

ADS Clusterの作成には、10分程度かかります。
デプロイの進捗状況は、以下のコマンドで確認することができます。

```zsh
$ kubectl get events --field-selector involvedObject.kind=AstraDSCluster -n astrads-system

ADS Operatorが、ADS Clusterを構成する4台のノードのCPU/メモリ/ストレージ/ネットワークリソースのチェックを完了すると以下のメッセージが表示されます。
38m         Normal    ControlPlaneNodeSelectionSuccessful   astradscluster/adskspraycluster   Successfully selected 4 control plane nodes to join the ADS cluster: k8s-worker71,k8s-worker72,k8s-worker73,k8s-worker74

ADSコントローラが、ADS Clusterの作成を開始すると以下のメッセージが表示されます。
29m         Normal    ADSClusterCreateInProgress            astradscluster/adskspraycluster   ADS cluster create in progress

Clusterの作成が完了すると、以下のメッセージが表示されます。
6m14s       Normal    ADSClusterCreateSuccess               astradscluster/adskspraycluster   ADS cluster created
```

進捗状況は、以下のコマンドでも確認できます。

```zsh
$ kubectl describe astradscluster [cluster名] -n astrads-system
```

Clusterの作成完了のメッセージを確認したら、Podが動作しているかを確認します。

```zsh
$ kubectl get pods -n astrads-system

NAME                                          READY   STATUS    RESTARTS        AGE
astrads-cluster-controller-85f6c86959-65f6l   1/1     Running   0               21h
astrads-deployment-support-d6dc48646-t5z9v    3/3     Running   0               10m
astrads-ds-adskspraycluster-9lwdg             1/1     Running   0               7m
astrads-ds-adskspraycluster-b972t             1/1     Running   0               6m45s
astrads-ds-adskspraycluster-fd629             1/1     Running   0               6m49s
astrads-ds-adskspraycluster-pnz5d             1/1     Running   0               6m45s
astrads-ds-nodeinfo-astradsversion-2sskj      1/1     Running   0               21h
astrads-ds-nodeinfo-astradsversion-4vsng      1/1     Running   0               21h
astrads-ds-nodeinfo-astradsversion-jngtj      1/1     Running   0               21h
astrads-ds-nodeinfo-astradsversion-pkrsg      1/1     Running   0               21h
astrads-ds-support-5sq56                      2/2     Running   0               10m
astrads-ds-support-dqjpv                      2/2     Running   0               10m
astrads-ds-support-jtzx8                      2/2     Running   0               10m
astrads-ds-support-xfqfd                      2/2     Running   0               10m
astrads-license-controller-7cbc9959c4-dnt6v   1/1     Running   0               21h
astrads-operator-9ddfb8d7b-mb5cg              1/1     Running   0               22h
```

以下のコマンドで、Clusterの「STATUS」が「created」 となっていることを確認します。

```zsh
$ kubectl get astradscluster -n astrads-system

NAME               STATUS    VERSION     SERIAL NUMBER   MVIP            AGE
adskspraycluster   created   2021.10.0   i000000036      10.128.211.45   35m

```

Clusterの「STATUS」が、しばらく経っても空欄のままで「in progress」に変わらない場合は、以下のコマンドでOperatorのログを確認してください。

```zsh
$ kubectl logs -n astrads-system [ADS OperatorのPod名 例:astrads-operator-9ddfb8d7b-mb5cg]
```

Clusterの「STATUS」が「in progress」のままスタックしていると思われる場合は、以下のコマンドでOperatorのログを確認してください。

```zsh
$ kubectl logs -n astrads-system [ADS ControllerのPod名 例:astrads-cluster-controller-85f6c86959-65f6l]
```

### ADSの監視設定

ADSは、Astra Control Center(ACC)や別のモニタリングサービスによるモニタリングが可能です。
ACCでADSをバックエンドとして管理する場合の手順は以下のように実施します。

```zsh
$ kubectl astrads monitoring -m netapp-monitoring -r [ローカルレジストリのパス] setup
```

ACCでADSをバックエンドとして管理せずにスタンドアロンで動作させる場合に、Cloud InsightsやElasticなどサードパーティを用いて監視を行う場合は、monitoring_operator.yaml ファイルを適用することでリモート監視の設定が可能です。

```zsh
$ kubectl apply -f ./manifests/monitoring_operator.yaml
$ kubectl astrads monitoring -m netapp-monitoring -r [ローカルレジストリのパス] setup
```


### Astra Tridentのインストール
ADSのセットアップが完了したら、次はAstra Tridentをインストールします。
ADSプレビュー版では、Astra Trident 21.10.1 をインストールする必要があります。
Astra Tridentは、Trident Operatorを使用してインストールを行います。

[TridentのGitHubのページ](https://github.com/NetApp/trident/releases/download/v21.10.1/trident-installer-21.10.1.tar.gz)より、インストーラをダウンロードし、helmを使ってインストールします。Helm Chartは、/helm配下にあります。

```zsh
$ helm install [Helm release object名] trident-operator-21.10.1.tgz --namespace [Trident用のNameSpace] --create-namespace

例:
$ helm install trident trident-operator-21.10.1.tgz --namespace trident --create-namespace
```

Podが起動したことを確認します。

```zsh
$ kubectl get pod -n trident
NAME                                READY   STATUS    RESTARTS   AGE
trident-csi-4j4fr                   2/2     Running   0          4m9s
trident-csi-5b47cc6bf-d2qbs         6/6     Running   0          4m9s
trident-csi-ndz5d                   2/2     Running   0          4m9s
trident-csi-rjppj                   2/2     Running   0          4m9s
trident-csi-tzx2c                   2/2     Running   0          4m9s
trident-csi-w7v7x                   2/2     Running   0          4m9s
trident-operator-5fb5dbc487-wckhz   1/1     Running   0          4m26s
```


### K8s SnapshotのCRDとコントローラをインストール

Volume Snapshotの作成には、K8sのSnapshot CRDと Snapshotコントローラが必要です。
お使いの環境にSnapshot CRDとコントローラがインストールされていない場合は、以下のコマンドを実行します。


* [CRDのyamlファイル](https://github.com/kubernetes-csi/external-snapshotter/tree/master/client/config/crd)を適用します。

```zsh
$ kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/blob/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotclasses.yaml
customresourcedefinition.apiextensions.k8s.io/volumesnapshotclasses.snapshot.storage.k8s.io created

$ kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/blob/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshotcontents.yaml
customresourcedefinition.apiextensions.k8s.io/volumesnapshotcontents.snapshot.storage.k8s.io created

$ kubectl apply -f https://github.com/kubernetes-csi/external-snapshotter/blob/master/client/config/crd/snapshot.storage.k8s.io_volumesnapshots.yaml
customresourcedefinition.apiextensions.k8s.io/volumesnapshots.snapshot.storage.k8s.io created

$ kubectl get crd | grep volumesnapshot
astradsvolumesnapshots.astrads.netapp.io              2022-01-21T16:28:59Z
volumesnapshotclasses.snapshot.storage.k8s.io         2022-01-22T16:13:39Z
volumesnapshotcontents.snapshot.storage.k8s.io        2022-01-22T16:14:26Z
volumesnapshots.snapshot.storage.k8s.io               2022-01-22T16:14:35Z
```

* [Snapshotコントローラのyamlファイル](https://github.com/kubernetes-csi/external-snapshotter/tree/master/deploy/kubernetes/snapshot-controller) を適用し、snapshotコントローラ を作成します。 NameSpaceは、デフォルトでdefault NameSpaceを使用するようになっていますので、適用する前にファイル内のNameSpaceの記述を編集しておきます。

```zsh
$ kubectl apply -f setup-snapshot-controller.yaml
statefulset.apps/snapshot-controller created

$ kubectl apply -f trident/rbac-snapshot-controller.yaml
serviceaccount/snapshot-controller created
clusterrole.rbac.authorization.k8s.io/snapshot-controller-runner created
clusterrolebinding.rbac.authorization.k8s.io/snapshot-controller-role created
role.rbac.authorization.k8s.io/snapshot-controller-leaderelection created
rolebinding.rbac.authorization.k8s.io/snapshot-controller-leaderelection created

$  kubectl get pods -A | grep snapshot
snapshot-controller   snapshot-controller-0                         1/1     Running   0              2m2s
```


### ADSをストレージバックエンドとして設定

ads_backend.json ファイルを編集し、ストレージバックエンドのパラメーターを設定します。

```json:例)ads_backend.json
{
    "version": 1,
    "storageDriverName": "astrads-nas",
    "storagePrefix": "",
    "cluster": "adskspraycluster",         #...①
    "namespace": "astrads-system",         #...②
    "autoExportPolicy": true,
    "autoExportCIDRs": ["0.0.0.0/0"],      #...③
    "kubeconfig":<以下の④の方法で作成した文字列>,
    "debugTraceFlags": {"method": true, "api": true},
    "labels": {"cloud": "on-prem", "creator": "trident-dev"},
    "defaults": {
        "qosPolicy": "bronze"
    },
    "storage": [
        {
            "labels": {
                "performance": "extreme"
            },
            "defaults": {
                "qosPolicy": "bronze"
            }
        },
	{
	    "labels": {
                "performance": "premium"
            },
            "defaults": {
                "qosPolicy": "bronze"
            }
        },
	{
	    "labels": {
                "performance": "standard"
            },
            "defaults": {
                "qosPolicy": "bronze"
            }
	}
    ]
}
```


①「cluster」の値をADSクラスタのクラスタ名に変更します。
②「namespace」の値を、ボリューム作成時に使用するNameSpaceに変更します。
③「autoExportCIDRs」に、アクセスを許可したいIPアドレスを入力します。「0.0.0.0/0」はすべて許可します。
④「kubeconfig」の値は、以下のようにします。

~/.kube/configファイルを、スペースを含まないjson形式に変換します。

```zsh
$ python3 -c 'import sys, yaml, json; json.dump(yaml.load(sys.stdin), sys.stdout, indent=None)' < [kubeconfigのファイルパス] > kubeconf.json
```

base64でエンコードし、そのbase64出力を「kubeconfig」の値に使用します。

```zsh
$ cat kubeconf.json | base64 | tr -d '\n'
```

バックエンドを作成します。

```zsh
$ tridentctl create backend -f ads_backend.json -n trident
+------------------+----------------+--------------------------------------+--------+---------+
|       NAME       | STORAGE DRIVER |                 UUID                 | STATE  | VOLUMES |
+------------------+----------------+--------------------------------------+--------+---------+
| adskspraycluster | astrads-nas    | 342ca3d1-3589-4760-b5c1-abfe1b436135 | online |       0 |
+------------------+----------------+--------------------------------------+--------+---------+
```


### ADS のStorageClassを作成
StorageClass用のyamlファイルを作成し、適用します。

```yaml:ads_sc_generic.yaml
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: trident-csi
provisioner: csi.trident.netapp.io
reclaimPolicy: Delete
volumeBindingMode: Immediate
allowVolumeExpansion: true
mountOptions:
  - vers=4
```
```zsh
$  kubectl create -f ads_sc_generic.yaml
storageclass.storage.k8s.io/trident-csi created

$  kubectl get storageclass
NAME          PROVISIONER             RECLAIMPOLICY   VOLUMEBINDINGMODE   ALLOWVOLUMEEXPANSION   AGE
trident-csi   csi.trident.netapp.io   Delete          Immediate           true                   72s
```

### volumesnapshotclassを作成
volumesnapshotclass用のyamlファイルを作成し、適用します。

```yaml:volumesnapshotclass.yaml
apiVersion: snapshot.storage.k8s.io/v1
kind: VolumeSnapshotClass
metadata:
  name: csi-snapclass
driver: csi.trident.netapp.io
deletionPolicy: Delete
```

```zsh
$ kubectl apply -f volumesnapshotclass.yaml -n snapshot-controller
volumesnapshotclass.snapshot.storage.k8s.io/csi-snapclass created
```

ここまでで、ADSのセットアップは完了です。

# まとめ
本投稿では、ADSのセットアップの手順をご紹介しました。
プレビュー版ということもあり、コマンドラインでの操作が少し煩雑な印象もあるかと思いますが、できる限りシンプルなものとなるよう予定しています。
ぜひ今後にご期待いただければと思います。