【DeNATechCon2024】Argo CD + External Secrets Operator との適切な付き合い方

4K Views

February 29, 24

スライド概要

Argo CD を活用して Kubernetes マニュフェストを GitOps で管理する場合、API キーなどの秘匿データはシークレット管理ツールを活用するのが通例です。この時 Secret リソースが更新されても Kubernetes の Pod での再読み込みは行われないため、意図しない構成になる場合があります。

DeNA ではこの問題に対して、シークレット管理ツールの External Secrets Operator を用いた解決策を導入しました。External Secrets Operator が生成する Secret と Deployment の反映順序を保証するために、Argo CD 上での External Secret リソースのヘルスチェックの方法を変更しています。

本登壇では、ヘルスチェックを変更した結果どのように運用の安定性が向上したかお話しします。

profile-image

DeNA が社会の技術向上に貢献するため、業務で得た知見を積極的に外部に発信する、DeNA 公式のアカウントです。DeNA エンジニアの登壇資料をお届けします。

シェア

またはPlayer版

埋め込む »CMSなどでJSが使えない場合

関連スライド

各ページのテキスト
1.

Argo CD + External Secrets Operator との適切な付き合い方 IT本部IT基盤部第四グループ 藤⽥隼⽃ © DeNA Co., Ltd. 1

2.

⾃⼰紹介 藤⽥隼⽃ ● 2022 年 DeNA 新卒⼊社 ● IT本部IT基盤部第四グループ ● インフラエンジニア 大規模ゲームタイトルのインフラ運用を 担当 2023 年 4 月から K8s を運用 © DeNA Co., Ltd. 2

3.

Kubernetes の機密情報管理をどうしてますか? ● ● © DeNA Co., Ltd. DB パスワード TLS key 3

4.

ゴール ● K8s 上の機密情報の管理を他のリソースと同様に管理、 なおかつ安全、可⽤性が⾼く、楽に扱う ○ Code で管理 (Infrastructure as Code, IaC) ○ 継続的デリバリー (Continuous Delivery, CD) © DeNA Co., Ltd. 4

5.

⽬次 1. 機密情報管理の IaC 化 2. 機密情報を含む K8s Resource の CD の実現 © DeNA Co., Ltd. 5

6.

1. 機密情報管理の IaC 化 © DeNA Co., Ltd. 6

7.

1. 機密情報管理の IaC 化 K8s の機密情報管理リソース ● K8s には Secret Resource という機密情報を管理する リソースが存在 ○ K8s 内で安全に機密情報を管理可能 K8s 外で Secret Resource による機密情報漏洩の可能性に 焦点を当てる © DeNA Co., Ltd. 7

8.

1.機密情報管理の IaC 化 > 機密情報漏洩の可能性 Secret Resource による機密情報漏洩の可能性 !? Secret Resource のマニフェストファイルのリポジトリの Read 権限で機密情報を閲覧可能 kind: Secret … data: secret: VGVjaENvbg== 機密情報 閲覧可能 base64 decode TechCon © DeNA Co., Ltd. Read Users 8

9.

1.機密情報管理の IaC 化 > External Secrets Operator External Secrets Operator (ESO) 外部のシークレットマネージャーで機密情報を管理 Secret ③ 外部のシークレット マネージャー ②機密情報を取得 権限付与 Secret を作成 ESO controller Git での管理対象 ExternalSecret ① シークレット メタ情報を取得 Git で管理するものはメタ情報のみのファイルに This slide is not affiliated with or otherwise sponsored by CNCF. © DeNA Co., Ltd. 9

10.

1.機密情報管理の IaC 化 1. 機密情報管理の IaC 化 まとめ Secret Resource だと Git で管理しにくい External Secrets Operator (ESO) を使い、 Secret Resource を Git で管理 機密情報を含めて IaC 化 達成 © DeNA Co., Ltd. 10

11.

2. 機密情報を含む K8s Resource の CD の実現 © DeNA Co., Ltd. 11

12.

2.機密情報も含む K8s Resource の CD の実現 Argo CD を使⽤ 機密情報管理のコード化は External Secrets Operator (ESO) で可能に コード化の次は反映も⾃動でさせたい Argo CD で CD したい © DeNA Co., Ltd. 12

13.

2.機密情報も含む K8s Resource の CD の実現 Argo CD の説明 Argo CD はKubernetes ⽤の宣⾔型 GitOps CDツール Argo CD manifest 取得 © DeNA Co., Ltd. Sync 13

14.

2.機密情報も含む K8s Resource の CD の実現 > Argo CD の考慮点 今回 Argo CD を使⽤する上での考慮点 Argo CD + External Secrets Operator と適切に付き合う ために以下の 2 点を考慮 1. 依存 Resource の更新 2. Argo CD による依存 Resource の反映順序制御 © DeNA Co., Ltd. 14

15.

2.機密情報も含む K8s Resource の CD の実現 > Argo CD の考慮点 > ①依存 Resource の更新 依存 Resource の更新の必要性 Secret Resource を更新したとしても、参照が切り替わらな いため、更新が必要 Secret (更新前) file mount (subPath) Pod 更新 Secret (更新後) © DeNA Co., Ltd. ⾃動で 切り替わらない 15

16.

2.機密情報も含む K8s Resource の CD の実現 > Argo CD の考慮点 > ①依存 Resource の更新 依存 Resource を⼿動で更新 ⾃動で切り替わらないため、 Pod も更新するように通知 Secret (更新前) file mount 更新 Secret (更新後) © DeNA Co., Ltd. Pod (更新前) こちらも更新 file mount Pod (更新後) 16

17.

2.機密情報も含む K8s Resource の CD の実現 > Argo CD の考慮点 > ②依存 Resource の反映順序制御 依存 Resource との反映順序 反映順序を間違うと Pod の Secret Resource の更新がされな い Secret (更新前) file mount ②次に更新 Secret (更新後) © DeNA Co., Ltd. Pod (更新前) ①Pod が先に更新 古いものを 参照 Pod (更新後) 17

18.

2.機密情報も含む K8s Resource の CD の実現 > Argo CD の考慮点 Argo CD の考慮点 まとめ ● Secret Resource を更新したとしても、Pod 等の参照は⾃ 動で切り替わらない ● ⾃動で切り替わらないため、別途で Pod も更新が必要 ● 反映順序を間違うと Pod の Secret Resource の更新がさ れない © DeNA Co., Ltd. 18

19.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み 具体的にどうするか? 3 つの取り組み 1. checksum の作成 a. 依存 Resource の更新を⾃動化 2. Argo CD の sync-wave 設定を追加 a. 反映順序を指定 3. Argo CD の health check を変更 a. 反映順序が狂う例外に対応 © DeNA Co., Ltd. 19

20.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ①checksum の作成 ① checksum の作成 シークレットメタ情報に結び付く annotation を⽤意するこ とで Pod も Argo CD の更新対象に追加し、更新を⾃動化 ESO で Secret Resource を管理する Resource kind: ExternalSecret … - remoteRef: key: techcon version: 1 © DeNA Co., Ltd. hash 化した 値を挿⼊ kind: Pod … metadata: annotations: checksum: xxx 20

21.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ②Argo CD の sync-wave 設定を追加 具体的にどうするか?3 つの取り組み 1. checksum の作成 a. 依存 Resource の更新を⾃動化 2. Argo CD の sync-wave 設定を追加 a. 反映順序を指定 3. Argo CD の health check を変更 a. 反映順序が狂う例外に対応 © DeNA Co., Ltd. 21

22.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ②Argo CD の sync-wave 設定を追加 ② Argo CD の sync-wave とは 以下の優先順位で Resource の反映順序が決定 sync-wave は phase を除いて最も優先して、順序を制御可能 ● The phase sync-wave は wave を指定 ● The wave they are in (lower values first) ● By kind (e.g. namespaces first and then other Kubernetes resources, followed by custom resources) ● By name https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/ より引用 © DeNA Co., Ltd. 22

23.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ②Argo CD の sync-wave 設定を追加 ② 今回の Argo CD のデフォルト反映順序 Pod → ExternalSecret → Secret の順で反映のため NG 時間経過 → wave: 0 Pod External Secrets Operator © DeNA Co., Ltd. ExternalSecret 変更を検知 Secret 更新 23

24.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ②Argo CD の sync-wave 設定を追加 ② Argo CD の sync-wave 設定を追加 Argo CD が正しい順序で反映可能 時間経過 → wave: 1 delay wave: 2 変更を検知 ExternalSecret External Secrets Operator © DeNA Co., Ltd. Secret Pod 更新 24

25.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 具体的にどうするか?3 つの取り組み 1. checksum の作成 a. 依存 Resource の更新を⾃動化 2. Argo CD の sync-wave 設定を追加 a. 反映順序を指定 3. Argo CD の health check を変更 a. 反映順序が狂う例外に対応 © DeNA Co., Ltd. 25

26.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ 可⽤性に関して気になる記載 「リソース更新後に他の controller (今回で⾔うと ESO controller ) が反応するために wave 間に 2秒 の delay があり ます」 Note that there's currently a delay between each sync wave in order give other controllers a chance to react to the spec change that we just applied. This also prevent Argo CD from assessing resource health too quickly (against the stale object), causing hooks to fire prematurely. The current delay between each sync wave is 2 seconds and can be configured via environment variable ARGOCD_SYNC_WAVE_DELAY. https://argo-cd.readthedocs.io/en/stable/user-guide/sync-waves/ より引用 © DeNA Co., Ltd. 26

27.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ 気になる記載の説明 delay より遅く作成された場合はどのようになるか? 時間経過 → delay (2秒) wave: 1 wave: 2 変更を検知 ExternalSecret External Secrets Operator © DeNA Co., Ltd. 反応が遅れた場合 Pod Secret 27

28.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ 気になる記載の説明 Secret Resource が作成されない場合はどのようになるか? 時間経過 → delay (2秒) wave: 1 wave: 2 変更を検知 ExternalSecret External Secrets Operator © DeNA Co., Ltd. 作成されない場合 Pod Secret 28

29.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ 動作検証結果: health check が重要 ● 設定ミスによる Secret 作成失敗の場合は正常に失敗 ○ Health status = Degraded で更新停⽌ ● ESO controller が 動作不能の場合に問題発⽣ ○ Health status = Healthy が維持 ○ Secret が更新されないまま Pod が更新 Font Awesome Free 6.5.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free Copyright 2024 Fonticons, Inc. © DeNA Co., Ltd. 29

30.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ Argo CD の health check による挙動 wave ごとに health check が存在し、healthy になるまで待機 時間経過 → wave: 1 delay ExternalSecret Degraded であれば正常に更新停⽌ © DeNA Co., Ltd. wave: 2 Pod wave=1 が healthy になるまで 待機 30

31.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ ESO controller が 動作不能の場合の反映状況 Argo CD は正常と誤検知 時間経過 → wave: 1 ExternalSecret External Secrets Operator delay wave: 2 Pod Healthy controller の replica=0 で検証 © DeNA Co., Ltd. 31

32.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ なぜ動いていないのに Healthy か ExternalSecret Resource の health check が ESO controller が変更する値に依存 正常系の status 遷移 ESOが変更 Healthy © DeNA Co., Ltd. ESOが変更 Progressing Healthy 32

33.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ なぜ動いていないのに Healthy か Secret Resource が更新されない異常系でも Healthy ESO が down の場合の status 遷移 ESOが変更 Healthy ESOが変更 Progressing Healthy Healthy のまま遷移しない © DeNA Co., Ltd. 33

34.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ health check の修正⽅針 最初の status 遷移は Argo CD 単体で完結させ、 Healthy で留 まることを防ぐ status 遷移 修正後 ESO が変更 Argo CD が変更 Healthy © DeNA Co., Ltd. Progressing Healthy 34

35.
[beta]
2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更

③ health check の修正箇所
Argo CD により更新する generation と
ESO が設定する generation を⽰す値と⽐較し
同じなら Healthy
ESO が更新
kind: ExternalSecret
metadata:
Progressing
generation: 5
…
status:
syncedResourceVersion: 4-{{hash}}

© DeNA Co., Ltd.

Argo CD が
更新する値
ESO が
更新する値

kind: ExternalSecret
metadata:
Healthy
generation: 5
…
status:
syncedResourceVersion: 5-{{hash}}

35

36.

2.機密情報も含む K8s Resource の CD の実現 > 3 つの取り組み > ③Argo CD による health check の変更 ③ どう変わった? Progressing となることで、誤った更新はされない 時間経過 → wave: 1 wave 2 は実⾏されない delay (2s) ExternalSecret External Secrets Operator © DeNA Co., Ltd. wave: 2 Pod Progressing が継続 controller の replica=0 で検証 36

37.

まとめ ● K8s での機密情報を IaC + CD で管理する⽅法紹介 ● IaC は External Secrets Operator (ESO) で実現 ● CD は Argo CD で、 ESO との付き合い⽅を紹介 © DeNA Co., Ltd. 37