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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
Teraoka Yoshinori
October 24, 2022
Technology
160
0
Share
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
18k
GitLabサーバーのモニタリング / gitlab server monitoring
yteraoka
1
2.9k
Other Decks in Technology
See All in Technology
生成AIが変える SaaS の競争原理と弁護士ドットコムのプロダクト戦略
bengo4com
0
710
Amazon S3 Filesについて
yama3133
2
210
最近の技術系の話題で気になったもの色々(IoT系以外も) / IoTLT 花見予定会(たぶんBBQ) @都立潮風公園バーベキュー広場
you
PRO
1
240
Oracle AI Database@AWS:サービス概要のご紹介
oracle4engineer
PRO
4
2.4k
実践ハーネスエンジニアリング:TAKTで実現するAIエージェント制御 / Practical Harness Engineering: AI Agent Control Enabled by TAKT
nrslib
11
4.6k
AI時代における技術的負債への取り組み
codenote
1
1.5k
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
23k
M5Stack CoreS3とZephyr(RTOS)で Edge AIっぽいことしてみた
iotengineer22
0
200
Do Vibe Coding ao LLM em Produção para Busca Agêntica - TDC 2026 - Summit IA - São Paulo
jpbonson
3
120
エージェントスキルを作って自分のインプットに役立てよう
tsubakimoto_s
0
360
ぼくがかんがえたさいきょうのあうとぷっと
yama3133
0
190
#jawsugyokohama 100 LT11, "My AWS Journey 2011-2026 - kwntravel"
shinichirokawano
0
350
Featured
See All Featured
Believing is Seeing
oripsolob
1
110
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
Balancing Empowerment & Direction
lara
6
1.1k
Joys of Absence: A Defence of Solitary Play
codingconduct
1
350
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
490
Accessibility Awareness
sabderemane
1
100
sira's awesome portfolio website redesign presentation
elsirapls
0
220
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
35
2.4k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
The Invisible Side of Design
smashingmag
303
52k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
1.9k
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