Lock in $30 Savings on PRO—Offer Ends Soon! ⏳

Developing image pull secrets provisioner / Kub...

Developing image pull secrets provisioner / Kubernetes Meetup Tokyo #65

Kubernetes Meetup Tokyo #65 での発表資料です。
最近公開した https://github.com/pfnet/image-pull-secrets-provisioner について紹介します。
任意の Kubernetes クラスタで、クラウドサービス上のプライベートレジストリに格納したコンテナイメージを使うための認証をセキュアに構成する仕組みです。
開発の経緯や技術的な詳細、工夫した点などについてお話しします。

Preferred Networks

June 05, 2024
Tweet

More Decks by Preferred Networks

Other Decks in Technology

Transcript

  1. 2 • 薮内 秀仁 (YABUUCHI Hidehito) • Preferred Networks, Inc.

    (PFN) • 社内向け機械学習プラットフォーム & 社外向けクラウドサービス • 社内 CI/CD プラットフォーム 自己紹介
  2. 3 • Image pull secret を作成・更新する Kubernetes コントローラ • セキュア

    ◦ 有効期限の短い認証情報のみ • 汎用 ◦ 任意の Kubernetes クラスタに対応 ◦ OIDC による ID 連携をサポートする 任意のレジストリに対応 pfnet/image-pull-secrets-provisioner
  3. 4 1. レジストリ側で k8s ServiceAccount との ID 連携を構成しておく 2. SA

    のアノテーションに ID 連携の情報を書く 3. Pod で SA を使う 4. SA に紐づく image pull secret が pod に伝搬しイメージを取得できる 使いかた(ユーザ目線)
  4. 6 • マネージド(e.g., EKS + ECR)の場合 ◦ いい感じに統合されている • オンプレ/マルチ/ハイブリッドクラスタの場合

    ◦ レジストリの認証情報を image pull secret に格納する プライベートなコンテナイメージを使うには?
  5. 7 • 公式ドキュメントの説明* 1. docker login でアクセストークンを作成し、 2. kubectl create

    secret で トークンを格納した image pull secret を作る • 󰢄 アクセストークンが無期限 ◦ 漏れると誰でも・いつでもプライベートなコンテナイメージを 取得できてしまう ◦ 👉 有効期限の短い認証情報を作り自動更新しよう Image pull secret はどう作る? *: Pull an Image from a Private Registry | Kubernetes
  6. 8 • 󰢄 PFN には昔から image pull secret を作る仕組みがあったが Google

    Artifact Registry を前提としていた • Preferred Computing Platform (PFCP)* では お客様が使う他のレジストリにも対応したい ◦ Amazon ECR など • 👉 広く採用されている標準を使おう さまざまなレジストリに対応したい *: PFN が開発中の、MN-Core™ シリーズを利用できる AI クラウドサービス PFN、深層学習を高速化するプロセッサーMN-Core 2の開発および、MN-Coreシリーズのク ラウドサービス構想を発表 - 株式会社Preferred Networks
  7. 9 • レジストリの認証情報を発行し image pull secret に仕立てる 仕組みがほしい ◦ 有効期限が短い認証情報を発行し自動更新する

    ◦ 広く採用されている標準に従いレジストリの認証情報を得る • Kubernetes クラスタは OpenID プロバイダになれる* ◦ 👉 OpenID Connect (OIDC) による ID 連携を採用しよう 採用するプロトコル *: Configure Service Accounts for Pods | Kubernetes
  8. 10 • K8s ServiceAccount の ID トークンを クラウドリソース用のアクセストークンに交換できる ◦ クラウド側で

    SA を信頼しておく OIDC による ID 連携 アクセストークン ID トークン JWT (JSON Web Token) クラスタ c0 から来た k8s SA ns0/sa0 です ns0/sa0 リソース c0 の ns0/sa0 は リソースへのアクセス OK
  9. 13 • 事前にレジストリ側で k8s SA との OIDC による ID 連携を構成しておく

    • AWS での例 ◦ repo0 からイメージ取得できるポリシー pol0 ◦ K8s SA ns0/sa0 は pol0 を含む role0 を引き受ける • ns0/sa0 の ID トークンで role0 のトークンを取得できる ns0/sa0 repo0 pol0 / role0
  10. 15 • TokenRequest API で SA の ID トークンを取得 •

    トークンは JWT 形式 ◦ OIDC での ID トークンとして使える { "iss": "https://example.com", # トークンの発行者 "exp": 1731613413, # 有効期限 # トークンを発行した対象 "sub": "system:serviceaccount:ns0:sa0" } ns0/sa0
  11. 16 • SA の ID トークンを提示し レジストリ用のトークンを要求 (Token Exchange) •

    アノテーションに書かれた ID 連携情報にしたがう ns0/sa0 repo0 pol0 / role0 ※ 各プロバイダの SDK や CLI を使っていれば自動で トークン交換してくれるが今回は自分でしないといけない
  12. 17 • ID トークンの署名を検証 • トークン発行者 URL をもとに 公開鍵を取得 (OpenID

    Connect Discovery) ns0/sa0 • 署名検証鍵 (JWK) を公開 • 方法例 ◦ S3 に置いて CloudFront で配信
  13. 19 • トークンを image pull secret の 形式に変換し Secret を作成

    • SA に紐づけ • SA を使う pod に伝搬するように ns0/sa0 { "auths": [ { "REGISTRY": { "password": "ACCESS-TOKEN", # プロバイダごとに異なる "username": "USERNAME" } } ] }
  14. 22 • Image pull secret 作成・更新の成否と理由をユーザに伝えたい ◦ 󰢄 コントローラのログは読めない •

    👉 Kubernetes Event の作成で通知 ◦ EventRecorder を作り、 ServiceAccount に関するイベントとして Event リソースを作成 イベントによる通知 $ kubectl describe serviceaccount sa0 Events: Type Reason Age From Message ---- ------ ---- ---- ------- Warning FailedProvisioningImagePullSecret 57m image-pull-secrets-provisioner Failed to create or refresh ... Normal ProvisionedImagePullSecret 52m image-pull-secrets-provisioner Provisioned an image pull ...
  15. 23 • ServiceAccount に image pull secret が紐づけられると、 その後 SA

    を使う pod に image pull secret が伝搬する • 󰢄 Image pull secret 作成前からある pod には伝搬しない ◦ イメージ取得に失敗する • 👉 イメージ取得に失敗している pod を自動で evict(退去) Pod eviction
  16. 24 • pfnet/image-pull-secrets-provisioner は image pull secret を作成・更新する Kubernetes コントローラ

    • OIDC による ID 連携を採用 ◦ 有効期限の短い認証情報のみ ◦ 幅広いレジストリに対応 • イベントによるユーザ通知 • 古い pod を自動で evict まとめ
  17. 25 • Preferred Networks の計算基盤関連チームでは採用を実施中です! ◦ 機械学習プラットフォームエンジニア (クラスタのサービス化) ◦ ストレージエンジニア

    (ストレージの企画設計管理運用) ◦ 大規模計算基盤エンジニア/ネットワーク・インフラ運用エンジニア (クラスタの物理設計、MN-Core™ を含めた先端システム設計等) • カジュアル面談もやってます → We’re hiring!