Kubernetes で Yandex.Cloud 甚の CSI ドラむバヌを開発した経隓

Kubernetes で Yandex.Cloud 甚の CSI ドラむバヌを開発した経隓

Flant がリリヌスをリリヌスするこずで、Kubernetes 甚のオヌプン゜ヌス ツヌルぞの貢献を拡倧しおいるこずを発衚できるこずを嬉しく思いたす。 CSIドラむバヌのアルファ版 Yandex.Cloud の (コンテナ ストレヌゞ むンタヌフェむス)。

ただし、実装の詳现に進む前に、Yandex にはすでにサヌビスがあるのに、なぜこれが必芁なのかずいう質問に答えおみたしょう。 Kubernetes のマネヌゞド サヌビス.

導入

これはなぜですか

圓瀟では、実皌働環境で Kubernetes を䜿甚し始めた圓初から (぀たりここ数幎)、独自のツヌル (デッキハりス) を開発しおきたした。ちなみに、これも間もなくオヌプン゜ヌス プロゞェクトずしお利甚可胜にする予定です。 。 その助けを借りお、すべおのクラスタヌを均䞀に構成しおおり、珟圚、さたざたなハヌドりェア構成ず利甚可胜なすべおのクラりド サヌビス䞊に、すでに 100 を超えるクラスタヌが存圚しおいたす。

デッキハりスを䜿甚するクラスタヌには、バランサヌ、䟿利なチャヌトによるモニタリング、メトリックずアラヌト、すべおのダッシュボヌドにアクセスするための倖郚プロバむダヌによるナヌザヌ認蚌など、運甚に必芁なすべおのコンポヌネントが含たれおいたす。 このような「ポンプアップされた」クラスタヌを管理゜リュヌションにむンストヌルするこずは、倚くの堎合䞍可胜であるか、コンポヌネントの半分を無効にする必芁があるため、意味がありたせん。

NB: これは私たちの経隓であり、非垞に具䜓的です。 私たちは、誰もが既補の゜リュヌションを䜿甚するのではなく、独自に Kubernetes クラスタヌをデプロむする必芁があるず提案しおいるわけではありたせん。 ちなみに、私たちには Yandex から Kubernetes を運甚した実際の経隓はなく、この蚘事ではこのサヌビスの評䟡は行いたせん。

それは䜕ですか、誰のためですか?

したがっお、Kubernetes のストレヌゞに察する最新のアプロヌチに぀いおはすでに説明したした。 CSIはどのように機胜したすか? О コミュニティはどのようにしお生たれたのか このアプロヌチに。

珟圚、倚くの倧芏暡クラりド サヌビス プロバむダヌは、クラりド ディスクを Kubernetes の氞続ボリュヌムずしお䜿甚するためのドラむバヌを開発しおいたす。 サプラむダヌがそのようなドラむバヌを持っおいないが、必芁な機胜がすべお API 経由で提䟛されおいる堎合は、ドラむバヌを自分で実装するこずを劚げるものはありたせん。 これがYandex.Cloudで起こったこずです。

開発の基瀎ずしお採甚したした DigitalOcean クラりド甚の CSI ドラむバヌ そしおいく぀かのアむデアを GCP 甚ドラむバヌ、これらのクラりド (Google ず Yandex) の API ずのやり取りには倚くの類䌌点があるためです。 特に、API ず GCPそしおあなた Yandexの オブゞェクトを返す Operation 長時間実行操䜜 (新しいディスクの䜜成など) のステヌタスを远跡したす。 Yandex.Cloud API ず察話するには、次を䜿甚したす。 Yandex.Cloud Go SDK.

行われた䜜業の結果 GitHub で公開 たた、䜕らかの理由で、Yandex.Cloud 仮想マシン (ただし、既補のマネヌゞド クラスタヌではない) 䞊で独自の Kubernetes むンストヌルを䜿甚し、CSI を通じおディスクを䜿甚 (泚文) したい人にずっおは圹立぀かもしれたせん。

具珟化

䞻な機胜

珟圚、ドラむバヌは次の機胜をサポヌトしおいたす。

  • クラスタヌ内のノヌドのトポロゞヌに埓っお、クラスタヌのすべおのゟヌン内のディスクを順序付けしたす。
  • 以前に泚文したディスクを削陀する。
  • ディスクのオフラむン サむズ倉曎 (Yandex.Cloud) サポヌトしおいたせん 仮想マシンにマりントされるディスクを増やしたす)。 サむズ倉曎をできるだけ簡単に行うためにドラむバヌをどのように倉曎する必芁があるかに぀いおは、以䞋を参照しおください。

将来的には、ディスク スナップショットの䜜成ず削陀のサポヌトを実装する予定です。

䞻な困難ずそれを克服する方法

Yandex.Cloud API にはリアルタむムでディスクを増やす機胜がないため、PV (氞続ボリュヌム) のサむズ倉曎操䜜が耇雑になりたす。この堎合、ディスクを䜿甚するアプリケヌション ポッドを停止する必芁がありたす。これにより、アプリケヌションのダりンタむムが発生する可胜性がありたす。

による CSI仕様、CSI コントロヌラヌが「オフラむン」でのみディスクのサむズを倉曎できるず報告した堎合 (VolumeExpansion.OFFLINE)、ディスクを増やすプロセスは次のようになりたす。

プラグむンにのみある堎合 VolumeExpansion.OFFLINE 拡匵機胜ずボリュヌムが珟圚公開されおいるか、ノヌド䞊で利甚可胜である堎合 ControllerExpandVolume 次のいずれかの埌にのみ呌び出す必芁がありたす。

  • プラグむンにはコントロヌラヌがありたす PUBLISH_UNPUBLISH_VOLUME 胜力ず ControllerUnpublishVolume 正垞に呌び出されおいたす。

あるいはそれ以倖

  • プラグむンにはコントロヌラヌがありたせん PUBLISH_UNPUBLISH_VOLUME 機胜、プラグむンにはノヌドがありたす STAGE_UNSTAGE_VOLUME 胜力、そしお NodeUnstageVolume 正垞に完了したした。

あるいはそれ以倖

  • プラグむンにはコントロヌラヌがありたせん PUBLISH_UNPUBLISH_VOLUME 胜力もノヌドも STAGE_UNSTAGE_VOLUME 胜力、そしお NodeUnpublishVolume 正垞に完了したした。

これは基本的に、仮想マシンを拡匵する前にディスクを仮想マシンから切り離す必芁があるこずを意味したす。

ただし、残念ながら 実装 サむドカヌを介した CSI 仕様は、次の芁件を満たしおいたせん。

  • サむドカヌコンテナ内 csi-attacherマりント間に必芁なギャップが存圚する原因ずなるはずですが、この機胜は単にオフラむン サむズ倉曎では実装されおいたせん。 これに぀いおの議論が始たりたした ここで.
  • この文脈におけるサむドカヌ コンテナずは正確には䜕でしょうか? CSI プラグむン自䜓は Kubernetes API ず察話せず、サむドカヌ コンテナヌによっお送信された gRPC 呌び出しにのみ応答したす。 最新 開発䞭です Kubernetes コミュニティによる。

私たちの堎合 (CSI プラグむン)、ディスクを増やす操䜜は次のようになりたす。

  1. gRPC 呌び出しを受信したす ControllerExpandVolume;
  2. API でディスクを増やそうずしおいたすが、ディスクがマりントされおいるため操䜜を実行できないずいう゚ラヌが衚瀺されたす。
  3. 増加操䜜を実行する必芁があるディスクを含むマップにディスク識別子を保存したす。 以䞋では、簡朔にするために、このマップを次のように呌びたす。 volumeResizeRequired;
  4. ディスクを䜿甚しおいるポッドを手動で削陀したす。 Kubernetes が再起動したす。 ディスクをマりントする時間がないように (ControllerPublishVolume) マりントしようずするずきに増加操䜜を完了する前に、指定されたディスクがただ存圚するこずを確認したす。 volumeResizeRequired そしお゚ラヌを返したす。
  5. CSI ドラむバヌは、サむズ倉曎操䜜の再実行を詊行したす。 操䜜が成功した堎合は、ディスクを次から取り倖したす。 volumeResizeRequired;
  6. なぜならディスク ID がありたせん volumeResizeRequired, ControllerPublishVolume 成功するず、ディスクがマりントされ、ポッドが開始されたす。

すべおが非垞に単玔に芋えたすが、い぀ものように萜ずし穎がありたす。 ディスクを拡倧したす 倖郚リサむザヌ、操䜜䞭に゚ラヌが発生した堎合 キュヌを䜿甚する タむムアりト時間は最倧 1000 秒たで指数関数的に増加したす。

func DefaultControllerRateLimiter() RateLimiter {
  return NewMaxOfRateLimiter(
  NewItemExponentialFailureRateLimiter(5*time.Millisecond, 1000*time.Second),
  // 10 qps, 100 bucket size.  This is only for retry speed and its only the overall factor (not per item)
  &BucketRateLimiter{Limiter: rate.NewLimiter(rate.Limit(10), 100)},
  )
}

これにより、ディスク拡匵操䜜が 15 分以䞊延長され、察応するポッドが䜿甚できなくなるこずが定期的に発生する可胜性がありたす。

朜圚的なダりンタむムを非垞に簡単か぀苊痛なく削枛できる唯䞀のオプションは、最倧タむムアりト制限を備えたバヌゞョンの external-resizer を䜿甚するこずでした。 5秒以内に:

workqueue.NewItemExponentialFailureRateLimiter(5*time.Millisecond, 5*time.Second)

ディスクのオフラむン サむズ倉曎は、たもなくすべおのクラりド プロバむダヌから廃止される先祖返りであるため、緊急に議論を開始しお倖郚リサむザヌにパッチを適甚する必芁があるずは考えたせんでした。

䜿甚を開始するにはどうすればよいですか?

このドラむバヌは、Kubernetes バヌゞョン 1.15 以降でサポヌトされおいたす。 ドラむバヌが動䜜するには、次の芁件を満たす必芁がありたす。

  • Ѐлаг --allow-privileged 倀に蚭定 true API サヌバヌず kubelet の堎合。
  • 付属 --feature-gates=VolumeSnapshotDataSource=true,KubeletPluginsWatcher=true,CSINodeInfo=true,CSIDriverRegistry=true API サヌバヌず kubelet の堎合。
  • マりント䌝播 (マりント䌝播) をクラスタヌ䞊で有効にする必芁がありたす。 Docker を䜿甚する堎合、共有マりントを蚱可するようにデヌモンを構成する必芁がありたす。

むンストヌル自䜓に必芁なすべおの手順 READMEに蚘茉されおいる。 むンストヌルには、マニフェストから Kubernetes にオブゞェクトを䜜成するこずが含たれたす。

ドラむバヌが動䜜するには、次のものが必芁です。

  • マニフェストでディレクトリ識別子を指定したす (folder-id) Yandex.Cloud (ドキュメントを参照しおください);
  • Yandex.Cloud API ず察話するために、CSI ドラむバヌはサヌビス アカりントを䜿甚したす。 マニフェストでは Secret を枡す必芁がありたす 認可されたキヌ サヌビスアカりントから。 ドキュメントでは 説明された、サヌビス アカりントを䜜成しおキヌを取埗する方法。

党䜓ずしお - 詊しおみるフィヌドバックをお埅ちしおおりたす。 新しい問題䜕か問題が発生した堎合は

さらなるサポヌト

その結果、この CSI ドラむバヌを実装したのは、Go でアプリケヌションを楜しく曞きたいずいう匷い願望からではなく、瀟内での緊急の必芁性からであるこずに泚意しおください。 私たちにずっお、独自の実装を維持するこずは珟実的ではないず思われるため、Yandex が関心を瀺し、ドラむバヌのサポヌトを継続するこずを決定した堎合は、喜んでリポゞトリを圌らに転送したす。

さらに、Yandex はおそらく、マネヌゞド Kubernetes クラスタヌに CSI ドラむバヌの独自の実装を持っおおり、オヌプン゜ヌスでリリヌスできたす。 たた、この開発オプションは有利であるず考えおいたす。コミュニティは、サヌドパヌティ䌁業ではなく、サヌビス プロバむダヌの実瞟のあるドラむバヌを䜿甚できるようになりたす。

PS

私たちのブログもお読みください:

出所 habr.com

コメントを远加したす