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
950
Prometheus の relabeling
yteraoka
1
18k
GitLabサーバーのモニタリング / gitlab server monitoring
yteraoka
1
2.8k
Other Decks in Technology
See All in Technology
助けて! XからWaylandに移行しないと新しいGNOMEが使えなくなっちゃう 2025-07-12
nobutomurata
2
130
ビジネス職が分析も担う事業部制組織でのデータ活用の仕組みづくり / Enabling Data Analytics in Business-Led Divisional Organizations
zaimy
1
290
TLSから見るSREの未来
atpons
2
200
ABEMAの本番環境負荷試験への挑戦
mk2taiga
5
620
ポストコロナ時代の SaaS におけるコスト削減の意義
izzii
1
190
【LT会登壇資料】TROCCO新コネクタ「スマレジ」を活用した直営店データの分析
kazari0425
1
140
How Do I Contact HP Printer Support? [Full 2025 Guide for U.S. Businesses]
harrry1211
0
130
SREのためのeBPF活用ステップアップガイド
egmc
1
780
NewSQLや分散データベースを支えるRaftの仕組み - 仕組みを理解して知る得意不得意
hacomono
PRO
3
210
DatabricksにOLTPデータベース『Lakebase』がやってきた!
inoutk
0
150
Enhancing SaaS Product Reliability and Release Velocity through Optimized Testing Approach
ropqa
1
250
SRE不在の開発チームが障害対応と 向き合った100日間 / 100 days dealing with issues without SREs
shin1988
1
1.1k
Featured
See All Featured
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.6k
The Cost Of JavaScript in 2023
addyosmani
51
8.5k
How STYLIGHT went responsive
nonsquared
100
5.6k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
357
30k
Done Done
chrislema
184
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
Product Roadmaps are Hard
iamctodd
PRO
54
11k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.4k
The Invisible Side of Design
smashingmag
301
51k
Docker and Python
trallard
44
3.5k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
Build The Right Thing And Hit Your Dates
maggiecrowley
36
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