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
980
Prometheus の relabeling
yteraoka
1
18k
GitLabサーバーのモニタリング / gitlab server monitoring
yteraoka
1
2.8k
Other Decks in Technology
See All in Technology
スマートファクトリーの第一歩 〜AWSマネージドサービスで 実現する予知保全と生成AI活用まで
ganota
2
280
slog.Handlerのよくある実装ミス
sakiengineer
4
420
Firestore → Spanner 移行 を成功させた段階的移行プロセス
athug
1
490
「全員プロダクトマネージャー」を実現する、Cursorによる仕様検討の自動運転
applism118
22
12k
株式会社ログラス - 会社説明資料【エンジニア】/ Loglass Engineer
loglass2019
4
65k
La gouvernance territoriale des données grâce à la plateforme Terreze
bluehats
0
190
DDD集約とサービスコンテキスト境界との関係性
pandayumi
3
290
新アイテムをどう使っていくか?みんなであーだこーだ言ってみよう / 20250911-rpi-jam-tokyo
akkiesoft
0
310
初めてAWSを使うときのセキュリティ覚書〜初心者支部編〜
cmusudakeisuke
1
270
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
300
サラリーマンの小遣いで作るtoCサービス - Cloudflare Workersでスケールする開発戦略
shinaps
2
470
Django's GeneratedField by example - DjangoCon US 2025
pauloxnet
0
150
Featured
See All Featured
Agile that works and the tools we love
rasmusluckow
330
21k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Facilitating Awesome Meetings
lara
55
6.5k
Done Done
chrislema
185
16k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
9
810
Faster Mobile Websites
deanohume
309
31k
KATA
mclloyd
32
14k
How GitHub (no longer) Works
holman
315
140k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
285
13k
Fantastic passwords and where to find them - at NoRuKo
philnash
52
3.4k
Git: the NoSQL Database
bkeepers
PRO
431
66k
Site-Speed That Sticks
csswizardry
10
820
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