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

分散コンテナレジストリミラーを活用したコンテナイメージ取得時間の改善

yamatcha
October 22, 2023

 分散コンテナレジストリミラーを活用したコンテナイメージ取得時間の改善

サイボウズではコンテナレジストリの可用性を高めるため、コンテナレジストリミラーをクラスタ内にデプロイしています。 しかし、大規模クラスタではコンテナイメージを大量に Pull するためレジストリミラーの負荷が高まりやすく、スケールアウトやチューニングが必要となります。

大量のコンテナイメージの Pull に伴う負荷増大に対処するため、OSS のステートレスな分散レジストリミラーである、Spegel の動作を検証しました。 また、キャッシュミス時に複数のノードが同時に Pull を実行する動作を改善するため、Kubernetes 1.26 にて alpha となった Pod Scheduling Readiness を使ったカスタムコントローラーを開発・検証しました。

yamatcha

October 22, 2023

Transcript

35 slides
  1. Kubernetesにおけるイメージ取得 5 - Pod起動時、ノードのcontainerdがコンテナイメージをコンテナレジストリか ら取得する Node Container Registry Kubelet 3.

    Image取得 コンテナ 4. 起動 Kubernetesコントロール プレーン 2. Podの作成 を検知 ⼈ 1. Pod作成 containerd イメージ
  2. 検討したレジストリミラー 9 - Kraken - P2Pベースのレジストリ - ミラーからイメージを取得する際にアップストリームと別のURLを指定する必要がある - Dragonfly

    - 豊富な機能を備えたレジストリ - HAにはキャッシュやデータベースなどのステートフルなコンポーネントが必要 - Spegel - ステートレスなコンテナレジストリ - 運⽤が複雑にならない
  3. 検討したレジストリミラー 10 - Kraken - P2Pベースのレジストリ - ミラーからイメージを取得する際にアップストリームと別のURLを指定する必要がある - Dragonfly

    - 豊富な機能を備えたレジストリ - HAにはキャッシュやデータベースなどのステートフルなコンポーネントが必要 - Spegel - ステートレスなコンテナレジストリ - 運⽤が複雑にならない 採⽤!
  4. Spegelの概要 12 - Xenit社が開発するステートレスな分散コンテナレ ジストリ - https://github.com/XenitAB/spegel - ⾃前でストレージやキャッシュなどは持たない -

    containerdをノード間で連携させるシンプルな構成 - OCIに準拠 - 現在はcontainerdにのみ対応 https://github.com/XenitAB/spegel
  5. Spegelのデプロイ構成 13 - SpegelをDaemonSetで各ノードにデプロイ - 各ノードのSpegel間はP2P通信する - Spegelとcontainerd間で通信できるように 設定 -

    containerd側でレジストリとしてSpegelを指定 - SpegelのAPIはcontainerdにプロキシする Kubernetes Cluster Node Node Node Spegel containerd Spegel containerd Spegel containerd
  6. クラスタでの検証 17 - 検証⽅法 - 80ノードほどのクラスタで検証 - テスト⽤イメージでDaemonSetをデプロイし、その後DaemonSetのイメージを更新する - デプロイ時、更新時それぞれのイメージの取得時間を計測

    - 更新時は⼀台ずつRolling Updateされる - ⼤規模クラスタで⼤量にイメージ取得が発⽣するシナリオを再現 Kubernetes Cluster Node Node Node Kubernetes Cluster Node Node Node Daemonset Image A:v0.0.1 Kubernetes Cluster Node Node Node Daemonset Image A:v0.0.2 デプロイ 更新
  7. クラスタでの検証 18 - 計測項⽬ - 各ノードの単体のイメージ取得時間 - デプロイ、更新の開始から完了までかかった時間 Kubernetes Cluster

    Node DaemonSet Image A Pod Image A Pod Image A Node Node Node Pod Image A Pod Image A DaemonSetの デプロイ/更新 Registry Registry 単体の イメージ取得
  8. 検証結果: イメージ取得時間 19 - デプロイ時 - Spegelの有無に関わらず、全てのノードで並列にアップストリームへイメージを取得 - Spegelありの場合、Spegelから取得する際のtimeoutがあるため結果的に遅くなってし まった

    Spegel デプロイ時 Best [s] 更新時初回[s] 更新時 Best[s] なし 15 8.6 6.8 あり 52.0 49.6 5.2 Kubernetes Cluster Node Node Node Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.1 デプロイ
  9. 検証結果: イメージ取得時間 20 - 更新時 - 初回はアップストリームから取得する - Spegelありの場合、2回⽬以降はキャッシュにヒットし⾼速に取得できた Spegel

    デプロイ時 Best [s] 更新時初回[s] 更新時 Best[s] なし 15 8.6 6.8 あり 52.0 49.6 5.2 Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.1 Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.2 更新
  10. 検証結果: 合計時間 21 - デプロイ時 - 全ノードでアップストリームから取得した場合、単体での取得より時間がかかっている Spegel の有無 デプロイ時

    [s] 更新時 [s] なし 27.62 839.52 あり 66.64 916.87 Kubernetes Cluster Node Node Node Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.1 デプロイ
  11. 検証結果: 合計時間 22 - 更新時 - 初回の取得に時間がかかり、最終的にはSpegelなしの場合よりも時間がかかった - より⼤きなクラスタであれば、Spegelありの場合の⽅が短い時間で完了できるはず Spegel

    の有無 デプロイ時 [s] 更新時 [s] なし 27.62 839.52 あり 66.64 916.87 Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.1 Kubernetes Cluster Node Node Node DaemonSet Image A:v0.0.2 更新
  12. Pod Scheduling Readinessについて 28 - Kubernetes 1.26でAlphaになった機能 - 通常、Podは作成直後にkube-schedulerによってノードにスケジュールされる -

    以下のように schedulingGates を指定すると特定のPodのスケジュールを⽌め ることができる - 削除するとスケジューリングされる apiVersion: v1 kind: Pod metadata: name: sample spec: schedulingGates: - name: my-scheduling-gate containers: - name: ubuntu image: ubuntu:22.04 これがついている間は スケジュールされない
  13. まとめ 35 - ステートレスな分散レジストリミラーであるSpegelを検証をしました - Pod Scheduling Readinessを利⽤したコントローラの開発と検証をし、イ メージ取得時間を短縮できた -

    本発表はサイボウズサマーインターンシップ2023で実施した内容です - ブログにまとまってます - https://blog.cybozu.io/entry/2023/09/21/161930

More Decks by yamatcha

Other Decks in Programming