Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Job に挿入される sidecar を停止させる sidecar を挿入する話
Search
Teraoka Yoshinori
October 24, 2022
Technology
0
140
Job に挿入される sidecar を停止させる sidecar を挿入する話
Job の Pod の istio-proxy を停止させるために envoy-sidecar-helper を Admission Webhook で挿入する
Teraoka Yoshinori
October 24, 2022
Tweet
Share
More Decks by Teraoka Yoshinori
See All by Teraoka Yoshinori
What is the difference between docker and containerd about logging?
yteraoka
2
970
Prometheus の relabeling
yteraoka
1
18k
GitLabサーバーのモニタリング / gitlab server monitoring
yteraoka
1
2.8k
Other Decks in Technology
See All in Technology
バクラクによるコーポレート業務の自動運転 #BetAIDay
layerx
PRO
1
950
Claude Codeは仕様駆動の夢を見ない
gotalab555
23
6.6k
AIに目を奪われすぎて、周りの困っている人間が見えなくなっていませんか?
cap120
1
640
Infrastructure as Prompt実装記 〜Bedrock AgentCoreで作る自然言語インフラエージェント〜
yusukeshimizu
1
120
Telemetry APIから学ぶGoogle Cloud ObservabilityとOpenTelemetryの現在 / getting-started-telemetry-api-with-google-cloud
k6s4i53rx
0
150
AIに頼りすぎない新人育成術
cuebic9bic
3
310
ユーザー課題を愛し抜く――AI時代のPdM価値
kakehashi
PRO
1
120
[OCI Technical Deep Dive] OracleのAI戦略(2025年8月5日開催)
oracle4engineer
PRO
1
170
Eval-Centric AI: Agent 開発におけるベストプラクティスの探求
asei
0
120
Claude Codeから我々が学ぶべきこと
oikon48
10
2.8k
テストを実行してSorbetのsigを書こう!
sansantech
PRO
1
100
Jamf Connect ZTNAとMDMで実現! 金融ベンチャーにおける「デバイストラスト」実例と軌跡 / Kyash Device Trust
rela1470
1
200
Featured
See All Featured
Fantastic passwords and where to find them - at NoRuKo
philnash
51
3.4k
Optimizing for Happiness
mojombo
379
70k
Code Reviewing Like a Champion
maltzj
524
40k
Keith and Marios Guide to Fast Websites
keithpitt
411
22k
How STYLIGHT went responsive
nonsquared
100
5.7k
Facilitating Awesome Meetings
lara
54
6.5k
The Cost Of JavaScript in 2023
addyosmani
51
8.8k
Rebuilding a faster, lazier Slack
samanthasiow
83
9.1k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
36
2.5k
The Pragmatic Product Professional
lauravandoore
36
6.8k
The Straight Up "How To Draw Better" Workshop
denniskardys
235
140k
Testing 201, or: Great Expectations
jmmastey
45
7.6k
Transcript
Job に挿入される sidecar を停止させる sidecar を挿入する話 2022-10-24
© 3-shake Inc. 2 自己紹介 - 所属 - 株式会社スリーシェイク Sreake
事業部(2020年1月入社) - 最近ハマっているもの - COTEN RADIO 寺岡良矩 (@yteraoka)
© 3-shake Inc. 3 目次 • Anthos Service Mesh とは
• Sidecar injection の仕組み • Job における sidecar のつらみ • Job の sidecar を停止させる方法 • Sidecar を意識したくない • Sidecar を停止させる Sidecar を自動で挿入
© 3-shake Inc. 4 Anthos Servive Mesh とは
© 3-shake Inc. 5 Anthos Servive Mesh とは • Google
Managed Istio • Managed な部分にバリエーションがある ◦ Control plane の一部 ◦ Control plane の全体 ◦ Control plane の全体 + Data plane • Cloud Monitoring との統合 ◦ 何もせずとも参照できるようになっている
© 3-shake Inc. 6 Service Mesh のメリット • Service 間通信の制御
◦ L4, L7 で制御可能(HTTP なら Request 内容でも) • timeout や retry の制御 ◦ Sidecar の Envoy が Proxy を行い、retry なども Envoy が行ってくれる ◦ circuit breaker でエラーの続く endpoint を一時的に外せる • 振り分け ◦ gRPC でもリクエスト単位で転送先 Pod が別になる ◦ 同一 zone 内を優先させることも可能 • 可視化 ◦ Envoy のメトリクスから latency や status の割合を可視化できる ◦ Topology View グラフィカルに確認( OSS なら Kiali)
© 3-shake Inc. 7 Sidecar Injection の仕組み
© 3-shake Inc. 8 Sidecar Injection の仕組み • Sidecar は
Admission Webhook (MutatingWebhookConfiguration) によって Pod の作成時に Controle Plane (istiod) によって挿入される • namespace の label や Pod の label によって Inject されるかどうかが決まるが、条件の詳細は MutatingWebhookConfiguration の中身を見るとわかる kubectl get mutatingwebhookconfiguration istio-sidecar-injector-asm-1144-2 -o yaml
© 3-shake Inc. 9 Job における Sidecar のつらみ
© 3-shake Inc. 10 Job における sidecar のつらみ • Job
が終了しない apiVersion: batch/v1 kind: Job metadata: name: example spec: template: metadata: name: example spec: containers: - name: myjob image: busybox command: ["/bin/sh", "-c"] args: ["sleep 3"] restartPolicy: Never 例えば左のような Job を deploy してみると $ kubectl get pod NAME READY STATUS RESTARTS AGE example-wrfrj 1/2 NotReady 0 4m47s sleep が終わった後も sidecar の istio-proxy が終了せずに 残り続けてしまう
© 3-shake Inc. 11 Job における sidecar のつらみ • Job
から生成される Pod にも他と同様の条件で istio-proxy が sidecar として挿入される • Job のメインのコンテナは処理が終われば終了する • Sidecar はメインのコンテナが起動していようが終了していようが動き続ける • Job の Pod は全てのコンテナが終了(停止)しないと終わらない • メインのコンテナは必要な処理が終わったら他のコンテナを停止させる必要がある • 開発者はどんな sidecar が inject されることを知っていなければならない ◦ Istio に限らない SQL Auth Proxy がいるかもしれない(今回は扱わない)
© 3-shake Inc. 12 Job における sidecar のつらみ #!/bin/bash “$@”
r=$? curl -s -X POST http://localhost:15020/quitquitquit exit $r shell で wrap する例 Manifest の containers で command や args を指定してある場合は Helm Chart でこんな処理を差し 込むことが可能だが、未指定で Container Image の Build 時に指定したもを実行する場合はそれができ ない。そもそも shell が入っているかどうかもわからない。
© 3-shake Inc. 13 Sidecar を意識したくない • Attack surface を減らしたくて
Distroless を選んでいるのに shell なんて入れたくない • 簡単だからといってメインのコンテナが処理終了後に HTTP のリクエストを送るなんてコードも入れた くない
© 3-shake Inc. 14 救世主現る
© 3-shake Inc. 15 救世主現わる • みんな困っている • Istio のコミュニティサイトに
Best practices for jobs という記事があった • envoy-sidecar-helper というものがあるらしい • https://discuss.istio.io/t/best-practices-for-jobs/4968 • https://github.com/maksim-paskal/envoy-sidecar-helper • 求めていたものなのでは!?
© 3-shake Inc. 16 envoy-sidecar-helper の仕組み Pod kube-api-server istio-proxy main
envoy-sidecar-helper 自身の Pod の 状態を polling main のコンテ ナが終了してい たら istio-proxy (Envoy) を停止 させる
© 3-shake Inc. 17 envoy-sidecar-helper をどうやって導入するのか? • Istio 環境で実行する場合には envoy-sidecar-helper
を sidecar として入れたい • あれ?結局場合わけか?
© 3-shake Inc. 18 envoy-sidecar-helper をどうやって導入するのか? • Istio 環境で実行する場合には envoy-sidecar-helper
を sidecar として入れたい • あれ?結局場合わけか? • 待てよ
© 3-shake Inc. 19 envoy-sidecar-helper をどうやって導入するのか? • Istio 環境で実行する場合には envoy-sidecar-helper
を sidecar として入れたい • あれ?結局場合わけか? • 待てよ • istio-proxy だって自動で挿入されるのだから 同様に envoy-sidecar-helper も自動で挿入すればいいじゃない
© 3-shake Inc. 20 envoy-sidecar-helper をどうやって導入するのか? • istio-proxy がどうやって挿入されるのかは見たことあるぞ
© 3-shake Inc. 21 envoy-sidecar-helper をどうやって導入するのか? • istio-proxy がどうやって挿入されるのかは見たことあるぞ •
MutatingWebhookConfiguration のやつだ
© 3-shake Inc. 22 envoy-sidecar-helper をどうやって導入するのか? • istio-proxy がどうやって挿入されるのかは見たことあるぞ •
MutatingWebhookConfiguration のやつだ • 作れそう
© 3-shake Inc. 23 Webhook Server を作る
© 3-shake Inc. 24 Admission Webhook 用サーバーに必要なもの • Pod の
manifest (AdmissionReview) を受け取って、変更内容を Patch の形式で返す • Patch !? • 作るの面倒そう • Istio のコードをカンニング • jsonpatch.CreatePatch(original, injected) • 便利パッケージ発見 https://pkg.go.dev/gomodules.xyz/jsonpatch/v3 Webhook Server
© 3-shake Inc. 25 Admission Webhook 用サーバーに必要なもの • Webhook サーバーへのアクセスには
TLS が必須でかつ、サーバー証明書も検証可能でなければ ならないらしい • ServerName は {service}.{namespace}.svc. • 検証可能にするために CA の証明書は MutatingWebhookConfiguration の clientConfig.caBundle にセットする必要がある • いつ証明書発行するの??? 🤔 TLS の CA とキーペア
© 3-shake Inc. 26 Admission Webhook 用サーバーに必要なもの • Webhook サーバーへのアクセスには
TLS が必須でかつ、サーバー証明書も検証可能でなければ ならないらしい • ServerName は {service}.{namespace}.svc. • 検証可能にするために CA の証明書は MutatingWebhookConfiguration の clientConfig.caBundle にセットする必要がある • いつ証明書発行するの??? 🤔 • Nginx Ingress Controller や Prometheus Operator の Helm Chart をカンニング • kube-webhook-certgen というやつを Helm の Hook で Job として実行し、証明書発行と WebhookConfiguration への caBundle の patch を当ててくれる TLS の CA とキーペア
© 3-shake Inc. 27 Admission Webhook 用サーバーに必要なもの • Kubernetes Cluster
に cert-manager が導入されている、導入するなら cert-manager を使う方 がスマート TLS の CA とキーペア
© 3-shake Inc. 28 Admission Webhook 用サーバーに必要なもの • Kubernetes Cluster
に cert-manager が導入されている、導入するなら cert-manager を使う方 がスマート TLS の CA とキーペア
© 3-shake Inc. 29 envoy-sidecar-helper を機能させるための権限設定 • envoy-sidecar-helper は kube
api server にアクセスする必要がある • serviceAccount に必要な Role を bind する必要がある apiVersion: batch/v1 kind: Job metadata: name: example spec: template: metadata: name: example spec: serviceAccountName: example containers: - name: myjob image: busybox command: ["/bin/sh", "-c"] args: ["sleep 3"] restartPolicy: Never apiVersion: v1 kind: ServiceAccount metadata: name: example --- apiVersion: rbac.authorization.k8s.io/v1 kind: Role metadata: name: example rules: - apiGroups: [""] resources: ["pods"] verbs: ["get"] --- apiVersion: rbac.authorization.k8s.io/v1 kind: RoleBinding metadata: name: example roleRef: kind: Role name: example apiGroup: rbac.authorization.k8s.io subjects: - kind: ServiceAccount name: example
© 3-shake Inc. 30 完成
© 3-shake Inc. 31 試してみる 成功 🎉 $ kubectl get
job NAME COMPLETIONS DURATION AGE example 1/1 10s 7m34s $ kubectl get pod NAME READY STATUS RESTARTS AGE example-8zjqc 0/3 Completed 0 7m34s
© 3-shake Inc. 32 まとめ • 検索すればサンプルコードも出てくるしコントローラーを書くよりは難易度は低いはず • こういうことができるというのを知っておくといつか役に立つかも
© 3-shake Inc. 33 We are Hiring!! スリーシェイクでは一緒にSRE界隈を盛り上げてくれる仲間を募集中です! もしご興味をお持ちでしたら詳しいお話をさせてください! 専用フォームを用意しましたので、以下QRコードよりご登録お願いします。
【カジュアル面談登録フォーム】 https://hrmos.co/pages/threeshake/jobs/E_9999/apply ※フォームの都合上、必須となっている項目がいくつか存在します。ご了承ください。
© 3-shake Inc. 34 参考資料 • https://cloud.google.com/service-mesh/docs/overview • https://istio.io/ •
https://kubernetes.io/docs/reference/access-authn-authz/extensible-admission-controllers/ • https://github.com/jet/kube-webhook-certgen • https://github.com/kubernetes/ingress-nginx/ • https://github.com/maksim-paskal/envoy-sidecar-helper • https://github.com/istio/istio/blob/de7e074dd1c25507f884c70ff4a9c376ed22fe52/pkg/kube/inject/we bhook.go#L516-L526