Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
Developing image pull secrets provisioner Kubernetes Meetup Tokyo #65 (2024-06-06) 薮内秀仁, Preferred Networks, Inc.
Slide 2
Slide 2 text
2 ● 薮内 秀仁 (YABUUCHI Hidehito) ● Preferred Networks, Inc. (PFN) ● 社内向け機械学習プラットフォーム & 社外向けクラウドサービス ● 社内 CI/CD プラットフォーム 自己紹介
Slide 3
Slide 3 text
3 ● Image pull secret を作成・更新する Kubernetes コントローラ ● セキュア ○ 有効期限の短い認証情報のみ ● 汎用 ○ 任意の Kubernetes クラスタに対応 ○ OIDC による ID 連携をサポートする 任意のレジストリに対応 pfnet/image-pull-secrets-provisioner
Slide 4
Slide 4 text
4 1. レジストリ側で k8s ServiceAccount との ID 連携を構成しておく 2. SA のアノテーションに ID 連携の情報を書く 3. Pod で SA を使う 4. SA に紐づく image pull secret が pod に伝搬しイメージを取得できる 使いかた(ユーザ目線)
Slide 5
Slide 5 text
5 PFN Confidential 開発の背景
Slide 6
Slide 6 text
6 ● マネージド(e.g., EKS + ECR)の場合 ○ いい感じに統合されている ● オンプレ/マルチ/ハイブリッドクラスタの場合 ○ レジストリの認証情報を image pull secret に格納する プライベートなコンテナイメージを使うには?
Slide 7
Slide 7 text
7 ● 公式ドキュメントの説明* 1. docker login でアクセストークンを作成し、 2. kubectl create secret で トークンを格納した image pull secret を作る ● アクセストークンが無期限 ○ 漏れると誰でも・いつでもプライベートなコンテナイメージを 取得できてしまう ○ 👉 有効期限の短い認証情報を作り自動更新しよう Image pull secret はどう作る? *: Pull an Image from a Private Registry | Kubernetes
Slide 8
Slide 8 text
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
Slide 9
Slide 9 text
9 ● レジストリの認証情報を発行し image pull secret に仕立てる 仕組みがほしい ○ 有効期限が短い認証情報を発行し自動更新する ○ 広く採用されている標準に従いレジストリの認証情報を得る ● Kubernetes クラスタは OpenID プロバイダになれる* ○ 👉 OpenID Connect (OIDC) による ID 連携を採用しよう 採用するプロトコル *: Configure Service Accounts for Pods | Kubernetes
Slide 10
Slide 10 text
10 ● K8s ServiceAccount の ID トークンを クラウドリソース用のアクセストークンに交換できる ○ クラウド側で SA を信頼しておく OIDC による ID 連携 アクセストークン ID トークン JWT (JSON Web Token) クラスタ c0 から来た k8s SA ns0/sa0 です ns0/sa0 リソース c0 の ns0/sa0 は リソースへのアクセス OK
Slide 11
Slide 11 text
11 PFN Confidential Image pull secrets provisioner
Slide 12
Slide 12 text
12 Image pull secret 作成・更新の流れ
Slide 13
Slide 13 text
13 ● 事前にレジストリ側で k8s SA との OIDC による ID 連携を構成しておく ● AWS での例 ○ repo0 からイメージ取得できるポリシー pol0 ○ K8s SA ns0/sa0 は pol0 を含む role0 を引き受ける ● ns0/sa0 の ID トークンで role0 のトークンを取得できる ns0/sa0 repo0 pol0 / role0
Slide 14
Slide 14 text
14 ● SA をウォッチ ● ID 連携情報がアノテーションにある SA を reconcile ns0/sa0
Slide 15
Slide 15 text
15 ● TokenRequest API で SA の ID トークンを取得 ● トークンは JWT 形式 ○ OIDC での ID トークンとして使える { "iss": "https://example.com", # トークンの発行者 "exp": 1731613413, # 有効期限 # トークンを発行した対象 "sub": "system:serviceaccount:ns0:sa0" } ns0/sa0
Slide 16
Slide 16 text
16 ● SA の ID トークンを提示し レジストリ用のトークンを要求 (Token Exchange) ● アノテーションに書かれた ID 連携情報にしたがう ns0/sa0 repo0 pol0 / role0 ※ 各プロバイダの SDK や CLI を使っていれば自動で トークン交換してくれるが今回は自分でしないといけない
Slide 17
Slide 17 text
17 ● ID トークンの署名を検証 ● トークン発行者 URL をもとに 公開鍵を取得 (OpenID Connect Discovery) ns0/sa0 ● 署名検証鍵 (JWK) を公開 ● 方法例 ○ S3 に置いて CloudFront で配信
Slide 18
Slide 18 text
18 レジストリからコンテナイメージを 取得するためのトークンを返す ns0/sa0 repo0 pol0 / role0
Slide 19
Slide 19 text
19 ● トークンを image pull secret の 形式に変換し Secret を作成 ● SA に紐づけ ● SA を使う pod に伝搬するように ns0/sa0 { "auths": [ { "REGISTRY": { "password": "ACCESS-TOKEN", # プロバイダごとに異なる "username": "USERNAME" } } ] }
Slide 20
Slide 20 text
20 ● トークンには有効期限がある ● 期限前に reconcile されるよう requeue ● トークンを再発行し image pull secret を更新 ns0/sa0
Slide 21
Slide 21 text
21 PFN Confidential 工夫した点
Slide 22
Slide 22 text
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 ...
Slide 23
Slide 23 text
23 ● ServiceAccount に image pull secret が紐づけられると、 その後 SA を使う pod に image pull secret が伝搬する ● Image pull secret 作成前からある pod には伝搬しない ○ イメージ取得に失敗する ● 👉 イメージ取得に失敗している pod を自動で evict(退去) Pod eviction
Slide 24
Slide 24 text
24 ● pfnet/image-pull-secrets-provisioner は image pull secret を作成・更新する Kubernetes コントローラ ● OIDC による ID 連携を採用 ○ 有効期限の短い認証情報のみ ○ 幅広いレジストリに対応 ● イベントによるユーザ通知 ● 古い pod を自動で evict まとめ
Slide 25
Slide 25 text
25 ● Preferred Networks の計算基盤関連チームでは採用を実施中です! ○ 機械学習プラットフォームエンジニア (クラスタのサービス化) ○ ストレージエンジニア (ストレージの企画設計管理運用) ○ 大規模計算基盤エンジニア/ネットワーク・インフラ運用エンジニア (クラスタの物理設計、MN-Core™ を含めた先端システム設計等) ● カジュアル面談もやってます → We’re hiring!
Slide 26
Slide 26 text
Making the real world computable