Slide 1

Slide 1 text

Trident Deep Dive 2022年2⽉ @bells17_がコードから読み解く! 株式会社IDCフロンティア エンジニアリング本部 ソフトウェアエンジニア 早川 ⼤貴 ネットアップ合同会社 クラウド営業部 クラウドソリューションアーキテクト 藤原 善基

Slide 2

Slide 2 text

▶ @bells17 ▶ Software Engineer@IDC Frontier inc. ▶ 普段やってること: + Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_

Slide 3

Slide 3 text

#kubenews ほぼ毎週⾦曜22:00~YouTubeで配信中 Kubernetes/Cloud Native関連のニュースを中⼼に技術雑談してます

Slide 4

Slide 4 text

今⽇話すこと ▶ Tridentの概要 ▶ KubernetesとCSIについて ▶ Tridentの実装

Slide 5

Slide 5 text

注意点 ▶ 発表者はストレージの専⾨家ではありません(特にiSCSIとかNFSとか..) ▶ Tridentのバージョンはv21.07.2を想定しています ▶ Tridentは以下の設定で利⽤することを想定しています + KubernetesからTridentを利⽤ + Tridentのインストールは基本的にTrident Operatorを利⽤(後述) ▶ あくまでTridentの実装を追った結果での理解の説明になるので、⼀部実際 の挙動と異なるケースもあるかもしれません

Slide 6

Slide 6 text

Cloud Native Storage Meetup #1でNetAppの⼤野さんもTridentの アーキテクチャについて解説しているのでそちらも参考にしてください https://youtu.be/2xEUyAzoNmY?t=3583

Slide 7

Slide 7 text

Tridentとは?

Slide 8

Slide 8 text

Tridentとは? ▶ TridentはNetApp社の様々なストレージ製品(e.g. ONTAP, E-Series, Cloud Volumes Service for AWS, etc )を扱うためのアプリケーション ▶ Tridentを利⽤することで、Kubernetesなどコンテナ環境でNetApp社のストレージ製品をいい感じに 扱うことができるようになる ▶ 現在対応しているプラットフォームは以下の2つ + Kubernetes ← 今回はこちらのケースでどのようにTridentが動作するかをお話しします + Docker ▶ 製品はOSSとして公開されている(https://github.com/NetApp/trident) ▶ NetApp社が提供しているKubernetesのための製品である”Astra”に含まれるアプリケーションの1 つ ▶ AstraはTridentに加え以下のアプリケーションによって構成されている + Astra Control: Kubernetesクラスターの管理・運⽤コンソール + Astra Data Store: Kubernetesネイティブな共有ファイルサービス

Slide 9

Slide 9 text

https://docs.netapp.com/us-en/astra-family/intro-family.html

Slide 10

Slide 10 text

Trident Components

Slide 11

Slide 11 text

Trident Components ▶ Trident(Core): Trident本体で、Kubernetesと協調動作するためのCSIドライバーや tridentctlのためのRest APIサーバー、その他Tridentの状態をコントロールするための各種 コントローラーなどで構成されている ▶ tridentctl: Tridentの操作をcliから⾏うためのコマンドラインツール ▶ Trident Operator: KubernetesクラスターにTridentをインストール・アップグレードといっ た管理を⾏うためのKubernetes Operator + Tridentがv20.04.0のタイミングで追加された + tridentのインストールはTrident Operatorの他にtridentctl installコマンドでも可能

Slide 12

Slide 12 text

Tridentのインストール例

Slide 13

Slide 13 text

ONTAP StorageVMを作成(ONTAPを使う場合)

Slide 14

Slide 14 text

Trident Operatorをインストール XHFUIUUQTHJUIVCDPN/FU"QQUSJEFOUSFMFBTFTEPXOMPBEWUSJEFOU JOTUBMMFSUBSH[ UBSYGUSJEFOUJOTUBMMFSUBSH[ DEUSJEFOUJOTUBMMFS IFMNJOTUBMMUSJEFOUPQFSBUPSOUSJEFOUIFMNUSJEFOUPQFSBUPSUH[ LVCFDUMOUSJEFOUHFUEFQMPZUSJEFOUPQFSBUPS /".&3&"%:6150%"5&"7"*-"#-&"(& USJEFOUPQFSBUPSE

Slide 15

Slide 15 text

TridentOrchastratorリソースを作成して Tridentをインストール LVCFDUMBQQMZGEFQMPZDSETUSJEFOUPSDIFTUSBUPS@DSZBNM LVCFDUMHFUUSJEFOUPSDIFTUSBUPS /".&"(& USJEFOUE LVCFDUMOUSJEFOUHFUEFQMPZUSJEFOUDTJ /".&3&"%:6150%"5&"7"*-"#-&"(& USJEFOUDTJE LVCFDUMOUSJEFOUHFUETUSJEFOUDTJ /".&%&4*3&%$633&/53&"%:6150%"5&"7"*-"#-&/0%&4&-&$503 "(& USJEFOUDTJLVCFSOFUFTJP BSDIBNE LVCFSOFUFTJPPTMJOVYE

Slide 16

Slide 16 text

TridentBackendConfigを作成 DBU&0'cLVCFDUMBQQMZG BQJ7FSTJPOUSJEFOUOFUBQQJPW LJOE5SJEFOU#BDLFOE$POpH NFUBEBUB OBNFPOUBQTBOEFGBVMU TQFD TUPSBHF%SJWFS/BNFPOUBQTBO NBOBHFNFOU-*' EBUB-*' TWNUSJEFOU@TWN DSFEFOUJBMT OBNFCBDLFOEUCDPOUBQTBOTFDSFU &0'

Slide 17

Slide 17 text

StorageClassを作成 DQTBNQMFJOQVUTUPSBHFDMBTTDTJZBNMUFNQMTBNQMFJOQVUTUPSBHFDMBTTCBTJD DTJZBNM WJTBNQMFJOQVUTUPSBHFDMBTTCBTJDDTJZBNM LVCFDUMDSFBUFGTBNQMFJOQVUTUPSBHFDMBTTCBTJDDTJZBNM LVCFDUMHFUTUPSBHFDMBTT /".&1307*4*0/&33&$-"*.10-*$:70-6.*/%*/(.0%& "--0870-6.&&91"/4*0/"(& JTDTJYGTDTJUSJEFOUOFUBQQJP%FMFUF*NNFEJBUFGBMTF E OGTDTJ EFGBVMU DTJUSJEFOUOFUBQQJP%FMFUF*NNFEJBUFGBMTF E

Slide 18

Slide 18 text

TridentとKubernetes

Slide 19

Slide 19 text

TridentとKubernetes ▶ TridentはKubernetesで各種ストレージ管理を⾏うためにTridentをCSIドライバーとして動 作させている ▶ また、Trident管理のために複数のKubernetesコントローラーを実装している ▶ そのため、Tridentの実装に⼊る前にまずは + Kubernetes Operator(Kubernetesコントローラー) + CSI(ドライバー) ▶ などの概要について知っておいたほうが良い

Slide 20

Slide 20 text

Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている

Slide 21

Slide 21 text

https://github.com/kubernetes/website/blob/fb6364da0afd19e8a9515aaae2de9bc74a0a6abd/static/images/docs/components-of-kubernetes.png

Slide 22

Slide 22 text

Tridentが利⽤しているKubernetes拡張⽅法 ▶ Kubernetes Operator + CRD + Kubernetesコントローラー ▶ CSIドライバー

Slide 23

Slide 23 text

https://github.com/NetApp/trident/blob/v21.07.2/operator/controllers/orchestrator/apis/netapp/v1/types.go CRD

Slide 24

Slide 24 text

Kubernetes Controller

Slide 25

Slide 25 text

https://github.com/kubernetes/sample-controller/blob/master/docs/images/client-go-controller-interaction.jpeg Controllerの動作イメージ

Slide 26

Slide 26 text

▶ Kubernetesのコードリーディングをする上で知っておくと良さそうなこと ▶ Kubernetes Internal #1 Kubernetesコントローラー実装周りの詳細についてはこちら

Slide 27

Slide 27 text

KubernetesとCSI

Slide 28

Slide 28 text

CSI ▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター (CO)でストレージを利⽤するための共通の仕様を定義したもの + なのでKubernetes⽤の仕様、というわけでない + 例えばHashicorp NomadなどはすでにCSIを利⽤している ▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけ で、Kubernetesでもその他のCOでも利⽤できるものを⽬指している ▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにある spec.mdファイルで定義されている

Slide 29

Slide 29 text

CSIで定義されている仕様 ▶ CSI Driverの通信⽅法・提供⽅法について ▶ CSI Driverが提供する機能について ▶ COがCSI Driverを利⽤するためのgRPCのProtocol Buffers

Slide 30

Slide 30 text

CSI Driverの通信⽅法・提供⽅法について ▶ コンテナイメージ形式(Docker, OCIなど)で提供する必要あり ▶ CSI DriverとCO間の通信は + UNIXドメインソケットを介して + gRPCプロトコルを利⽤する必要がある

Slide 31

Slide 31 text

CSIが提供する機能 ▶ ボリュームの作成/削除 ▶ ノードへのボリュームのアタッチ/デタッチ ▶ ボリュームのマウント/アンマウント ▶ ボリュームのスナップショットの作成/削除 ▶ etc...

Slide 32

Slide 32 text

Protocol Buffersで定義されているgRPCの インターフェイス ▶ Controller Plugin ▶ Node Plugin

Slide 33

Slide 33 text

Controller Plugin ▶ CSI Driverのcontrol plane として動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの + Controller Service + Identity Service ▶ ボリュームやスナップショット⾃体をコントロールする機能を提供する ▶ 具体的には以下のような機能を提供する + ボリュームの作成/削除 + ノードへのボリュームのアタッチ/デタッチ + ボリュームのスナップショットの作成/削除

Slide 34

Slide 34 text

Node Plugin ▶ COに参加している各Worker Nodeで動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの + Node Service + Identity Service ▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する ▶ 主に以下の機能を提供する + ノードにアタッチされたボリュームのフォーマット + ボリュームのマウント/アンマウント

Slide 35

Slide 35 text

No content

Slide 36

Slide 36 text

ボリュームライフサイクル

Slide 37

Slide 37 text

CSIまとめ ▶ CSIとはストレージプロバイダがボリュームプラグインをCOに提供する ために定義された共通の仕様 ▶ 具体的には以下のようなものを定義している + CSI Driverの動作環境や通信⽅法の定義 + コンテナイメージ形式 + UNIXドメインソケット/gRCPプロトコル + RPCインターフェイスの定義 + Controller Plugin + Node Plugin

Slide 38

Slide 38 text

Kubernetesとボリュームプラグイン

Slide 39

Slide 39 text

Kubernetesのボリュームプラグインには 以下の3つがある ▶ In-Tree Volume + Kubernetesのコード内部に実装されているボリュームプラグイン + ConfigMap/Secret/EmptyDirなどはここに該当 ▶ FlexVolume + CSI登場前に作成されたプラグイン(v1.8) + Kubernetesの内部実装に関する知識が必要ということで、あまり使われてはない模様 + 現在はDeprecated ▶ CSI Driver + v1.9よりAlpha提供開始 + KubernetesがCSI Driverと連携を⾏うサイドカーアプリケーションを提供してくれている ため、Kubernetesの内部実装の知識を必要とせずにボリュームプラグインを提供できる

Slide 40

Slide 40 text

KubernetesとCSI Driverとの連携

Slide 41

Slide 41 text

サイドカーアプリケーションによる連携 https://github.com/kubernetes/community/blob/d83cd53979d08ac0e0e33704c6aec6b1c3cb7c8d/contributors/design-proposals/storage/container-storage-interface_diagram1.png

Slide 42

Slide 42 text

ボリューム作成時の処理フロー

Slide 43

Slide 43 text

Controller Sidecar external-provisioner ボリュームの作成/削除を⾏う external-attacher ボリュームのアタッチ/デタッチを⾏う external-resizer ボリュームのリサイズを⾏う external-snapshotter スナップショットの作成/削除を⾏う livenessprobe Liveness Probe⽤HTTPプロキシ

Slide 44

Slide 44 text

Node Sidecar node-driver-registrar KubeletにあるPlugin Watcherという機能を利⽤して CSIドライバをKubeletに登録する機能を提供する

Slide 45

Slide 45 text

▶ CSI⼊⾨(スライド) ▶ CSI⼊⾨(セッション動画) KubernetesとCSIについてのより詳しい解説についてはこちら

Slide 46

Slide 46 text

Tridentの実装

Slide 47

Slide 47 text

Trident Components(再掲)

Slide 48

Slide 48 text

Trident Overview

Slide 49

Slide 49 text

Trident Operator

Slide 50

Slide 50 text

Trident Core(setup)

Slide 51

Slide 51 text

Trident Core(PVC作成~ボリュームmount)

Slide 52

Slide 52 text

Trident Core: その他のコンポーネント ▶ TransactionMonitor: ボリューム作成などを管理するためのTridentTransactionリソースを 利⽤した実⾏処理タスクの管理コントローラー ▶ PeriopdicallyReconcileNodeAccessOnBackends: 各ノードと各TridentBackendが接続で きるように適切なポリシー設定が⾏われているかチェックするコントローラー ▶ k8shelper + Node Controller: ノード削除時に対象のTridentNodeを削除し、各TridentBackendの ポリシーから対象ノードの情報を削除するコントローラー ▶ CRD Controllers + reconcileTMR: TridentMirrorRelationshipリソースに応じたsnap mirrorの設定を⾏い、 TridentMirrorRelationshipのステータスを更新する ▶ etc

Slide 53

Slide 53 text

Tridentが利⽤するCRD $3%໊ ༻్ 5SJEFOU0SDIBTUSBUPS 5SJEFOU0QFSBUPS͕5SJEFOUͷΠϯετʔϧʹར༻ 5SJEFOU#BDLFOE$POpH 5SJEFOU͕઀ଓ͢Δ0/5"1ͳͲͷετϨʔδ৘ใΛ؅ཧ͢Δ5SJEFOU#BDLFOEΛੜ੒͢ΔͨΊ ͷϦιʔε 5SJEFOU#BDLFOE 5SJEFOU͕઀ଓ͢Δ0/5"1ͳͲͷετϨʔδ৘ใΛ؅ཧ͢ΔͨΊʹར༻͞ΕΔ 5SJEFOU#BDLFOE$POpHPSUSJEFODUMDSFBUFCBDLFOE Λར༻ͯ͠࡞੒͢Δ 5SJEFOU4UPSBHF$MBTT ,T4UPSBHF$MBTTʹରԠͨ͠5SJEFOU͕ॲཧΛߦ͏ͨΊͷϦιʔε ࣮૷ΛݟΔݶΓଟ෼ӬଓԽ͠ͳͯ͘΋ࠔΒͳ͍ 5SJEFOU/PEF 5SJEFOUͷͨΊͷϊʔυ৘ใΛอଘ͢ΔͨΊͷϦιʔε $4*/PEF͔Βੜ੒͞Εɺϊʔυ͕࡟আ͞ΕͨΒ$4*4FSWFSଆͰ࡟আ͞ΕΔ ֤αʔόʔ͕֤छ#BDLFOEʹ઀ଓͰ͖ΔΑ͏ʹϙϦγʔΛઃఆ͢ΔͨΊʹར༻͞ΕΔ 5SJEFOU7PMVNF 5SJEFOUܦ༝Ͱ෷͍ग़ͨ͠ϘϦϡʔϜΛ؅ཧ͢ΔͨΊͷϦιʔε ࣮૷ΛݟΔݶΓଟ෼ӬଓԽ͠ͳͯ͘΋ࠔΒͳ͍ 5SJEFOU7FSTJPO ίϯτϩʔϥʔଆͰ࣮ߦ͞Ε͍ͯΔ5SJEFOUόʔδϣϯΛอଘ͢ΔͨΊͷϦιʔε /PEFଆͰ࣮ߦ͞Ε͍ͯΔ5SJEFOUόʔδϣϯͱҰக͍ͯ͠Δ͔Λ֬ೝ͢ΔͨΊʹར༻͞ΕΔ 5SJEFOU.JSSPS3FMBUJPOTIJQ ϘϦϡʔϜʹTOBQNJSSPSઃఆΛߦ͏ͨΊͷϦιʔε 5SJEFOU5SBOTBDUJPO ϘϦϡʔϜͷ࡞੒ͳͲͷॲཧঢ়گΛ؅ཧ͢ΔͨΊͷϦιʔε Ұ෦ϦιʔεΛ೷͍࣮ͯߦ͕࣌ؒ௕ظԽ͢Δͱॲཧ͕ϩʔϧόοΫ͞ΕΔ その他にもcRDはあるが実質使われてなさそう

Slide 54

Slide 54 text

tridentctl/Rest API

Slide 55

Slide 55 text

まとめ

Slide 56

Slide 56 text

実装を読んでみた感想 ▶ TridentBackendを利⽤して複数のNetApp社ストレージに1つのTridentから利⽤できるの は特徴的で⾯⽩かった ▶ ⼀⽅、TridentBackendやStorageClassの設定⽅法などが複雑なため使い始めるまでが苦労 しそうな印象を受けた ▶ ⽐較的古い時期から開発されていた関係か現在は使われていないと思われる機能やリソー ス定義が散⾒された(e.g. Snapshotリソースなど)ため、機能や実装、サポート範囲を再定 義することでアプリケーションの実装をシンプルに保つことができそうな印象を受けた

Slide 57

Slide 57 text

参考資料 ▶ https://youtu.be/2xEUyAzoNmY?t=3583 ▶ https://github.com/NetApp/trident/tree/v21.07.2 ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/dag/kubernetes/index.html ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/kubernetes/deploying/operator-deploy.html ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/kubernetes/operations/tasks/managing-backends/tbc.html ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/kubernetes/operations/tasks/monitoring.html#trident-autosupport-telemetry ▶ https://hub.docker.com/r/netapp/trident-autosupport ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/kubernetes/concepts/objects.html ▶ https://library.netapp.com/ecmdocs/ECMLP2372138/html/GUID-3FC8A37A-FFCC-4070-A9F0-1B9B3FB79BF8.html ▶ https://milestone-of-se.nesuke.com/sv-basic/architecture/disk-term/ ▶ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/dm_multipath/mpio_overview ▶ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/dm_multipath/mpio_description ▶ https://qiita.com/ochiba/items/39dbcda84ec17aefed07 ▶ https://tech-mmmm.blogspot.com/2020/05/iscsi-dm-multipathrheliscsi.html ▶ https://milestone-of-se.nesuke.com/sv-basic/architecture/iscsi-summary/ ▶ https://library.netapp.com/ecmdocs/ECMLP2573234/html/GUID-EC3C367B-79E0-4DBA-8036-22094557357A.html ▶ https://qiita.com/OPySPGcLYpJE0Tc/items/be9daae23b80478b81ff ▶ https://qiita.com/hana_shin/items/cbd428faf92534e25f7b ▶ https://atmarkit.itmedia.co.jp/ait/articles/0807/02/news142.html ▶ https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/managing_storage_devices/getting-started-with-iscsi_managing-storage-devices ▶ https://docs.netapp.com/ja-jp/ontap/system-admin/command-line-interface-concept.html ▶ https://docs.netapp.com/ja-jp/ontap/volumes/commands-manage-flexvol-volumes-reference.html ▶ http://docs.netapp.com/ontap-9/topic/com.netapp.doc.dot-cm-cmpr-9101/home.html ▶ https://docs.netapp.com/us-en/ontap/concepts/snapmirror-cloud-backups-object-store-concept.html ▶ https://netapp-trident.readthedocs.io/en/stable-v21.07/kubernetes/operations/tasks/volumes/topology.html?highlight=supportedtopology

Slide 58

Slide 58 text

Thanks / Question? ▶ @bells17 ▶ Slide: https://speakerdeck.com/bells17 ▶ @bells17_

Slide 59

Slide 59 text

・コードを読み解いてみて気になった点 ・セッションを聞いてみて気になった点 Discussion/Q&A

Slide 60

Slide 60 text

• セッションコード:1689 ⼊⾨ タイトル:クラウド知っ得シリーズ NetApp Astra スピーカ:ネットアップ合同会社 ソリューション技術本部 SE第1部 ソリューションズエンジニア Zhao Mandy • セッションコード:1687 中級 タイトル:クラウドネイティブアプリケーションの採 ⽤を加速する「Astra Data Store」とは︖ スピーカ:ネットアップ合同会社 ソリューションアーキテクト部 シニアソリューションアーキテクト ⼤削 緑 • セッションコード:1740 中級 タイトル: NetApp Astraを利⽤したKubernetes環境の データポータビリティの実現 スピーカ:ネットワンシステムズ株式会社 ビジネス開発本部 第1応⽤技術部 クラウドインフラチーム ⾦只 圭司 関連セッション: Trident(⼀部)

Slide 61

Slide 61 text

Meet the Specialists

Slide 62

Slide 62 text

Appendix

Slide 63

Slide 63 text

k8s helper ▶ PVC Controller: PVCのリサイズが⾏われた際にPV(C)リソースのサイズ変更を⾏う + CSIドライバーのサイドカー”csi-resizer”がPV(C)のリサイズを⾏うはずなので不要のように思える ▶ PV Controller: 削除されたPVに紐づくボリュームの削除を⾏う + 削除処理⾃体はCSIドライバー側で⾏っているため、何らかの影響でボリュームの削除が成功しなかったものの削除 を再試⾏するためのものだと思われる ▶ StorageClass Controller: k8s StorageClassの作成に応じてTridentStorageClassの⽣成を⾏う + また、v1以前のk8s StorageClassが作成された場合にはv1 k8s StorageClassを⽣成する ▶ Node Controller: ノード削除時に対象のTridentNodeを削除し、各TridentBackendの ポリシーから対象ノードの情報を削除する ▶ reconcileNodes: TridentNodeとk8s Nodeを⽐較し、k8s Nodeが存在しない場合にそのTridentNodeを削除する ▶ handleFailedPVUpgrades: PVのアップグレード処理が完了していないトランザクションがあれば、PVのアップグ レードを中⽌し、作成を⾏おうとしていたPVを削除して、古い設定のPVを作成する + PVのアップグレードとはtridentctlでのみ利⽤する機能となっているようだが、利⽤⽤途は不明 + PVのアップグレードはアップグレード元のPVをインポートした新しいPVを作成して差し替えるというもののよう

Slide 64

Slide 64 text

CRD Controllers ▶ reconcileBackendConfig: TridentBackendConfigをTridentBackendに変換して保存する + TridentBackendConfigの秘密情報を持ったk8s secretのイベントが発⽣した場合は k8s secretのデータを含めたTridentBackendConfigを⽣成してreconcileBackendConfigの イベントを実⾏する + TridentBackendリソースが削除された場合、紐づくTridentBackendConfigを元にTridentBackendリソー スを再⽣成するためにreconcileBackendConfigを実⾏する ▶ reconcileTMR: TridentMirrorRelationshipリソースに応じたsnap mirrorの設定を⾏い、 TridentMirrorRelationshipのステータスを更新する ▶ handleTridentSnapshotInfo: TridentSnapshotInfoリソースに保存されているsnapshotName からk8sのVolumeSnapshot(Content)を取得し、そのSnapshotHandle(≒Snapshot ID)を TridentSnapshotInfoのステータスに保存する + ただしTridentSnapshotInfoリソースはその他では⼀切使われていないようにみえるので、 そもそもこの調整ループが動作することはなさそうに思える

Slide 65

Slide 65 text

その他のコントローラー ▶ TransactionMonitor: ボリューム作成などを管理するためのTridentTransactionリソースを 利⽤した実⾏処理タスクの管理コントローラー ▶ PeriopdicallyReconcileNodeAccessOnBackends: 各ノードと各TridentBackendが接続で きるように適切なポリシー設定が⾏われているかチェックするコントローラー

Slide 66

Slide 66 text

nodePrep ▶ NFS/iSCSIに必要なパッケージを⾃動インストール~Service起動してくれる機能(まだベータの機能のよう) ▶ 対応Linuxディストリビューションは以下 + Ubuntu + RHEL/CentOS ▶ インストールされるパッケージ + NFS + Ubuntu: nfs-common + RHEL/CentOS: nfs-utils + iSCSI + Ubuntu: lsscsi, sg3-utils, scsitools, open-iscsi, multipath-tools + RHEL/CentOS: lsscsi, sg3_utils, iscsi-initiator-utils, device-mapper-multipath ▶ 起動されるService + NFS + rpc-statd + iSCSI: + Ubuntu: iscsid, multipathd + RHEL/CentOS: iscsid, open-iscsi, multipathd

Slide 67

Slide 67 text

CSIドライバーのmount⼿順(NFS) ▶ NodeStageVolume: + nodePrep処理が有効であればパッケージのインストールなどを実⾏ + mountOptions, NFS Server IP, NFS Pathといった情報をvolumePublishInfo.jsonという ファイルとして書き込む + KubernetesのCSI Sidecarが⽤意している対象ボリュームのためのパス内にこのファイ ルを作成する ▶ NodePublishVolume: + volumePublishInfo.jsonから情報を取り出す + mount先のディレクトリを作成 + mount -t nfs コマンドでNFSのボリュームをmount

Slide 68

Slide 68 text

CSIドライバーのmount⼿順(iSCSI) ▶ NodeStageVolume: + nodePrep処理が有効であればパッケージのインストールなどを実⾏ + iscsiadmコマンドでiSCSIのターゲットを作成し、ログインを⾏う + 特定のLUNへのパスをスキャンし、そのLUNのすべてのSCSI disk-by-pathが作成される まで待機する + multipathデバイスが作成されるまで待機する + その後Raw Block Volume以外のファイルシステムを指定した場合はformatを⾏う + 利⽤可能なファイルシステム: xfs/ext3/ext4 ▶ NodePublishVolume: + mountコマンドでデバイスをマウント

Slide 69

Slide 69 text

Storage Pool ▶ TridentのStorage PoolはPVが払い出されるリソースのPool ▶ このStoragePoolは以下に分類される + Physical Storage Pool + Virtual Storage Pool ▶ Physical Storage PoolはONTAPの場合はAggregatorとなる + Aggregator=RAIDを束ねストレージの性能とスケーラビリティを⾼めたもの ▶ Virtual Storage Pool + ⼀つの Pysical Storage Poolを 複数のPoolにしたもの + IOPSなどの異なる複数のVirtual Storage Poolを設定して必要な要件に応じて払い出し分ける + 複数の Physical Storage Poolを⼀つのPoolにする + 物理的な配置、ネットワークTopologyの異なる Physical Storage Poolを、⼀つのVirtual Storage Poolとしてまとめ適切なTopologyにスケジュールされるようにする

Slide 70

Slide 70 text

TridentMirrorRelationshipとSnap Mirror ▶ TridentMirrorRelationshipリソースを使うとボリュームのsnap mirrorを設定できる ▶ ただしこの機能はまだ開発中のようでドキュメントなども記載は無い ▶ Snap Mirror=rsyncのように他のボリュームとデータをミラーリングできる ▶ 基本的にはIncremental Foreverによって書き込み内容のログが追記されていく ▶ また、StorageVM丸ごとミラーリングすることも可能(Tridentでは不可能のように思える) ▶ SnapMirror CloudというS3(プロトコルを使えるオブジェクトストレージ)への転送も可能