Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Job に挿入される sidecar を停止させる sidecar を挿入する話
Search
Teraoka Yoshinori
October 24, 2022
Technology
200
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Job に挿入される sidecar を停止させる sidecar を挿入する話
Job の Pod の istio-proxy を停止させるために envoy-sidecar-helper を Admission Webhook で挿入する
Teraoka Yoshinori
October 24, 2022
More Decks by Teraoka Yoshinori
See All by Teraoka Yoshinori
What is the difference between docker and containerd about logging?
yteraoka
2
1.1k
Prometheus の relabeling
yteraoka
1
19k
GitLabサーバーのモニタリング / gitlab server monitoring
yteraoka
1
3k
Other Decks in Technology
See All in Technology
"計画的無茶振り"を通してAIネイティブ世代の新人を育てる
subroh0508
1
130
re:Inventで、人生は変わったのか? / growth-builders-hub-1-reinvent-2026
mhrtech
2
170
AI時代の開発はウォーターフォールに回帰する? / development-with-ai-back-to-wf
okamototakuyasr2
0
160
How we choose session proposals
kawaguti
PRO
1
190
Vue.jsのGitHubから学ぶ意思決定
yut0naga1_fa
1
340
基本から分かる!AWSセキュリティ運用の考え方と任せ方
cmusudakeisuke
1
260
キヨさん67歳 AIコーディングエージェント物語
happysamurai294
0
140
正解のない研修に放り出されて / Being thrown into a training program with no right answers
ohnoeight
1
170
日本AIベンチャーレポート2026
kentarofujii
0
260
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
480
Technical Project Manager の役割とやりがい、少しだけ AI
yoshiiryo1
0
360
(swiftc) NonCopyableとライフタイム修飾子
teamhimeh
0
160
Featured
See All Featured
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.4k
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
590
Optimising Largest Contentful Paint
csswizardry
37
4k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
950
We Analyzed 250 Million AI Search Results: Here's What I Found
joshbly
2
2.1k
The Spectacular Lies of Maps
axbom
PRO
1
1.1k
We Have a Design System, Now What?
morganepeng
55
8.4k
Building an army of robots
kneath
307
47k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
35
2.9k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
300
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.2k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.8k
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