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
Tweet

More Decks by yamatcha

Other Decks in Programming

Transcript

  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