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