6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

NetApp/Trident: 既存ストレージボリュームのインポート

Last updated at Posted at 2019-08-07

はじめに

NetApp/Trident v19.04.0 の大きな新機能として既存のボリュームがインポートできるようになりました。ここでは、この機能を検証します。

機能概要

v19.04.0 から ontap-nas, ontap-nas-flexgroup, solidfire-san, aws-cvs ドライバですでに存在しているストレージボリュームを Kubernetes にインポートできるようになりました。利用ケースとしては次が上げられています。

  • アプリケーションをコンテナ化して既存のデータセットを再利用する
  • 一時的な (ephemeral) アプリケーションのためのデータセットのクローン利用
  • 障害が発生した Kubernetes クラスタの再構築
  • ディザスタリカバリ中のアプリケーションデータのマイグレーション

既存のストレージボリュームのインポートは、tridentctl コマンドで実行します。

$ tridentctl import volume <backendName> <volumeName> -f <path-to-pvc-file>

インポートにはストレージボリュームを含むストレージバックエンド名を <backendName> として指定し、一意のボリューム名を <volumeName> として指定します。

-f <path-to-pvc-file> は必須引数で、YAML または JSON 形式で記述された PersistentVolumeClaim (PVC) マニフェストを含むファイルを指定します。このマニフェストファイルは、ボリュームのインポート処理のなかで PVC オブジェクトを作成するために使用されます。次のように少なくとも、オブジェクト名、Namespace、accessModes、ストレージサイズ、storageClassName の各フィールドを含む必要があります。1

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: my_claim
  namespace: my_namespace
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
  storageClassName: my_storage_class

ボリュームインポートを実行すると、既存のストレージボリュームが PersistentVolume (PV) として作成され、その PV の ClaimRef として引数で指定した PVC が設定されます。作成した時点では、reclaim policy は retain に設定されますが、PVC と PV が正常に割り当てられれば (bind)、その後 StorageClass の reclaim policy と一致するように更新されます。当然ながら reclaim policy が delete になっていると PV が削除されるとともに外部ストレージ上のボリュームが削除されることに注意が必要です。しかし --no-manage オプションを指定してボリュームをインポートすると、Trident がそのストレージボリュームの PV、PVC に対して追加の操作を実行しないようになります。つまり、PV オブジェクトが作成されたとしてもストレージボリュームが削除されなくなります。ボリュームクローンやボリュームサイズ変更といった操作も実行されなくなることに注意してください。

インポートされたストレージボリュームの PV、PVC はインポートされたことがわかるようにアノテーションが設定されます。このアノテーションは削除してはいけません。

ストレージボリュームのインポート処理のなかでは、そのボリュームが正しくマウントできるかどうかは確認されません。そのため、正しくマウントできないといったインポートの失敗を確認した場合(例えば StorageClass が正しくないなど)、PV の reclaim policy を retain に変更したのちに PV を削除しもう一度インポートを実行することで回復できます。Tip として、--no-manage オプションを使用してインポートを実行し、マウントできることを確認できたら、一度 PV、PVC を削除したのちに、--no-manage オプションを今度は利用せずにインポートするという手順を取ると安全に検証を進められるでしょう。

機能検証

ここからは実際にボリュームインポートを実行します。ここでは事前に tridentctl と Trident のバージョンを v19.04.1 に更新しています。

$ tridentctl version -n trident
+----------------+----------------+
| SERVER VERSION | CLIENT VERSION |
+----------------+----------------+
| 19.04.1        | 19.04.1        |
+----------------+----------------+

$ tridentctl import -h
Import an existing resource to Trident

Usage:
  tridentctl import [command]

Available Commands:
  volume      Import an existing volume to Trident

Flags:
  -h, --help   help for import

Global Flags:
  -d, --debug              Debug output
  -n, --namespace string   Namespace of Trident deployment
  -o, --output string      Output format. One of json|yaml|name|wide|ps (default)
  -s, --server string      Address/port of Trident REST interface

Use "tridentctl import [command] --help" for more information about a command.

tridentctl import コマンドが利用できそうなことを確認しました。また、ここでは ontapnas バックエンドを使う ontap-file StorageClass (SC) が設定されているとします。

$ tridentctl get backend -n trident
+----------+----------------+--------+---------+
|   NAME   | STORAGE DRIVER | STATE  | VOLUMES |
+----------+----------------+--------+---------+
| ontapnas | ontap-nas      | online |       0 |
+----------+----------------+--------+---------+

それでは、sample-nas-volume という名前のボリュームをインポートしていきます。まずは、インポートに使用する PVC を用意します。

$ cat sample-nas-volume-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: sample-nas-volume
  namespace: default
spec:
  storageClassName: ontap-file
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi

次に用意した PVC のマニフェストファイルを使って sample-nas-volume をインポートします。

$ tridentctl import volume ontapnas sample-nas-volume -f ./sample-nas-volume-pvc.yaml -n trident
+--------------------------+---------+-----------------+----------+----------+------+
|           NAME           |  SIZE   | STORAGE CLASS   | PROTOCOL | BACKEND  | POOL |
+--------------------------+---------+-----------------+----------+----------+------+
| default-ontap-file-f02a4 | 1.0 GiB | ontap-file      | file     | ontapnas |      |
+--------------------------+---------+-----------------+----------+----------+------+

$ kubectl get pv | grep ontap
default-ontap-file-f02a4            1073741824   RWO            Delete           Bound    default/ontap-file    ontap-file            35s

$ kubectl get pv default-ontap-file-f02a4 -oyaml
apiVersion: v1
kind: PersistentVolume
metadata:
  annotations:
    pv.kubernetes.io/provisioned-by: netapp.io/trident
    trident.netapp.io/notManaged: "false"
    volume.beta.kubernetes.io/storage-class: ontap-file
  creationTimestamp: "2019-06-06T02:51:14Z"
  finalizers:
  - kubernetes.io/pv-protection
  name: default-ontap-file-f02a4
  resourceVersion: "21148985"
  selfLink: /api/v1/persistentvolumes/default-ontap-file-f02a4
  uid: f2ed65a9-8805-11e9-ae99-fa163e526645
spec:
  accessModes:
  - ReadWriteOnce
  capacity:
    storage: "1073741824"
  claimRef:
    name: ontap-file
    namespace: default
    uid: f02a438a-8805-11e9-ae99-fa163e526645
  nfs:
    path: /******_default_ontap_file_dcaf6
    server: xx.xx.xx.xx
  persistentVolumeReclaimPolicy: Delete
  storageClassName: ontap-file
  volumeMode: Filesystem
status:
  phase: Bound

正しくインポートできました。

まとめ

ここでは、2019年4月にリリースされた NetApp/Trident v19.04.0 で導入された既存のボリュームのインポート機能を検証しました。ontap-san ドライバのサポートがまだないので、今後に期待しています。

  1. Trident v19.07.0 からインポートに使用する PVC マニフェストでストレージサイズ(.spec.resources.requests) の指定が必須ではなくなりました

6
3
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?