Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Trident Deep Dive

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for bells17 bells17
February 25, 2022

Trident Deep Dive

NetApp INSIGHT Japan 2022( https://insight.netapp.com/ja/ )のセッション資料です。

セッション動画: http://netapp.tv/details/28744

セッションリスト
https://insight.netapp.com/INSIGHTJapanSession.pdf

Avatar for bells17

bells17

February 25, 2022
Tweet

More Decks by bells17

Other Decks in Programming

Transcript

  1. ▶ @bells17 ▶ Software Engineer@IDC Frontier inc. ▶ 普段やってること: +

    Kubernetes 関連コンポーネントの開発 + Kubernetes as a Service開発 ▶ Kubernetes SIG-Docs Japanese localization reviewer ▶ Kubernetes Internal Organizer ▶ #kubenews ▶ @bells17_
  2. 注意点 ▶ 発表者はストレージの専⾨家ではありません(特にiSCSIとかNFSとか..) ▶ Tridentのバージョンはv21.07.2を想定しています ▶ Tridentは以下の設定で利⽤することを想定しています + KubernetesからTridentを利⽤ +

    Tridentのインストールは基本的にTrident Operatorを利⽤(後述) ▶ あくまでTridentの実装を追った結果での理解の説明になるので、⼀部実際 の挙動と異なるケースもあるかもしれません
  3. 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ネイティブな共有ファイルサービス
  4. 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コマンドでも可能
  5. Kubernetes とは? ▶ Kubernetesはコンテナオーケストレーターの1つ ▶ etcd/control plane/worker nodeによって構成されたクラスターを構築し、 様々なコンテナをKubernetes上のnodeで動作させたり、動作させてるコン テナとネットワークをいい感じに連携できるようにすることができる

    ▶ デプロイするコンテナなどをmanifestファイルで宣⾔的に記述することで、 宣⾔した状態になるようにKubernetesがいい感じに調整処理を⾏ってくれる ▶ Googleが内部で運⽤していたコンテナ基盤であるBorgをOSS向けに作り直 したコンテナオーケストレーター ▶ また、KubernetesはCloud Native Computing Foundation(CNCF)に寄贈さ れており、CNCFのGraduatedプロジェクトとしてコミュニティベースで管理 されている
  6. CSI ▶ KubernetesやMesos、Cloud Foundryなどコンテナオーケストレーター (CO)でストレージを利⽤するための共通の仕様を定義したもの + なのでKubernetes⽤の仕様、というわけでない + 例えばHashicorp NomadなどはすでにCSIを利⽤している

    ▶ ストレージプロバイダは⼀度CSIに対応したドライバーを書いておくだけ で、Kubernetesでもその他のCOでも利⽤できるものを⽬指している ▶ CSIの仕様はGithubのcontainer-storage-interface/specリポジトリにある spec.mdファイルで定義されている
  7. Controller Plugin ▶ CSI Driverのcontrol plane として動くgRPCサーバー ▶ 以下のgRPCのサービスを実装したもの +

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

    + Identity Service ▶ ボリュームを対象Worker Nodeで利⽤するための機能を提供する ▶ 主に以下の機能を提供する + ノードにアタッチされたボリュームのフォーマット + ボリュームのマウント/アンマウント
  9. Kubernetesのボリュームプラグインには 以下の3つがある ▶ In-Tree Volume + Kubernetesのコード内部に実装されているボリュームプラグイン + ConfigMap/Secret/EmptyDirなどはここに該当 ▶

    FlexVolume + CSI登場前に作成されたプラグイン(v1.8) + Kubernetesの内部実装に関する知識が必要ということで、あまり使われてはない模様 + 現在はDeprecated ▶ CSI Driver + v1.9よりAlpha提供開始 + KubernetesがCSI Driverと連携を⾏うサイドカーアプリケーションを提供してくれている ため、Kubernetesの内部実装の知識を必要とせずにボリュームプラグインを提供できる
  10. Trident Core: その他のコンポーネント ▶ TransactionMonitor: ボリューム作成などを管理するためのTridentTransactionリソースを 利⽤した実⾏処理タスクの管理コントローラー ▶ PeriopdicallyReconcileNodeAccessOnBackends: 各ノードと各TridentBackendが接続で

    きるように適切なポリシー設定が⾏われているかチェックするコントローラー ▶ k8shelper + Node Controller: ノード削除時に対象のTridentNodeを削除し、各TridentBackendの ポリシーから対象ノードの情報を削除するコントローラー ▶ CRD Controllers + reconcileTMR: TridentMirrorRelationshipリソースに応じたsnap mirrorの設定を⾏い、 TridentMirrorRelationshipのステータスを更新する ▶ etc
  11. 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はあるが実質使われてなさそう
  12. 参考資料 ▶ 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
  13. • セッションコード:1689 ⼊⾨ タイトル:クラウド知っ得シリーズ NetApp Astra スピーカ:ネットアップ合同会社 ソリューション技術本部 SE第1部 ソリューションズエンジニア

    Zhao Mandy • セッションコード:1687 中級 タイトル:クラウドネイティブアプリケーションの採 ⽤を加速する「Astra Data Store」とは︖ スピーカ:ネットアップ合同会社 ソリューションアーキテクト部 シニアソリューションアーキテクト ⼤削 緑 • セッションコード:1740 中級 タイトル: NetApp Astraを利⽤したKubernetes環境の データポータビリティの実現 スピーカ:ネットワンシステムズ株式会社 ビジネス開発本部 第1応⽤技術部 クラウドインフラチーム ⾦只 圭司 関連セッション: Trident(⼀部)
  14. 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を作成して差し替えるというもののよう
  15. 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リソースはその他では⼀切使われていないようにみえるので、 そもそもこの調整ループが動作することはなさそうに思える
  16. 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
  17. 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
  18. CSIドライバーのmount⼿順(iSCSI) ▶ NodeStageVolume: + nodePrep処理が有効であればパッケージのインストールなどを実⾏ + iscsiadmコマンドでiSCSIのターゲットを作成し、ログインを⾏う + 特定のLUNへのパスをスキャンし、そのLUNのすべてのSCSI disk-by-pathが作成される

    まで待機する + multipathデバイスが作成されるまで待機する + その後Raw Block Volume以外のファイルシステムを指定した場合はformatを⾏う + 利⽤可能なファイルシステム: xfs/ext3/ext4 ▶ NodePublishVolume: + mountコマンドでデバイスをマウント
  19. 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にスケジュールされるようにする
  20. TridentMirrorRelationshipとSnap Mirror ▶ TridentMirrorRelationshipリソースを使うとボリュームのsnap mirrorを設定できる ▶ ただしこの機能はまだ開発中のようでドキュメントなども記載は無い ▶ Snap Mirror=rsyncのように他のボリュームとデータをミラーリングできる

    ▶ 基本的にはIncremental Foreverによって書き込み内容のログが追記されていく ▶ また、StorageVM丸ごとミラーリングすることも可能(Tridentでは不可能のように思える) ▶ SnapMirror CloudというS3(プロトコルを使えるオブジェクトストレージ)への転送も可能