Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Job に挿入される sidecar を停止させる sidecar を挿入する話

Job に挿入される sidecar を停止させる sidecar を挿入する話

Job の Pod の istio-proxy を停止させるために envoy-sidecar-helper を Admission Webhook で挿入する

Teraoka Yoshinori

October 24, 2022
Tweet

More Decks by Teraoka Yoshinori

Other Decks in Technology

Transcript

  1. © 3-shake Inc. 2 自己紹介 - 所属 - 株式会社スリーシェイク Sreake

    事業部(2020年1月入社) - 最近ハマっているもの - COTEN RADIO 寺岡良矩 (@yteraoka)
  2. © 3-shake Inc. 3 目次 • Anthos Service Mesh とは

    • Sidecar injection の仕組み • Job における sidecar のつらみ • Job の sidecar を停止させる方法 • Sidecar を意識したくない • Sidecar を停止させる Sidecar を自動で挿入
  3. © 3-shake Inc. 5 Anthos Servive Mesh とは • Google

    Managed Istio • Managed な部分にバリエーションがある ◦ Control plane の一部 ◦ Control plane の全体 ◦ Control plane の全体 + Data plane • Cloud Monitoring との統合 ◦ 何もせずとも参照できるようになっている
  4. © 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)
  5. © 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
  6. © 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 が終了せずに 残り続けてしまう
  7. © 3-shake Inc. 11 Job における sidecar のつらみ • Job

    から生成される Pod にも他と同様の条件で istio-proxy が sidecar として挿入される • Job のメインのコンテナは処理が終われば終了する • Sidecar はメインのコンテナが起動していようが終了していようが動き続ける • Job の Pod は全てのコンテナが終了(停止)しないと終わらない • メインのコンテナは必要な処理が終わったら他のコンテナを停止させる必要がある • 開発者はどんな sidecar が inject されることを知っていなければならない ◦ Istio に限らない SQL Auth Proxy がいるかもしれない(今回は扱わない)
  8. © 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 が入っているかどうかもわからない。
  9. © 3-shake Inc. 13 Sidecar を意識したくない • Attack surface を減らしたくて

    Distroless を選んでいるのに shell なんて入れたくない • 簡単だからといってメインのコンテナが処理終了後に HTTP のリクエストを送るなんてコードも入れた くない
  10. © 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 • 求めていたものなのでは!?
  11. © 3-shake Inc. 16 envoy-sidecar-helper の仕組み Pod kube-api-server istio-proxy main

    envoy-sidecar-helper 自身の Pod の 状態を polling main のコンテ ナが終了してい たら istio-proxy (Envoy) を停止 させる
  12. © 3-shake Inc. 19 envoy-sidecar-helper をどうやって導入するのか? • Istio 環境で実行する場合には envoy-sidecar-helper

    を sidecar として入れたい • あれ?結局場合わけか? • 待てよ • istio-proxy だって自動で挿入されるのだから 同様に envoy-sidecar-helper も自動で挿入すればいいじゃない
  13. © 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
  14. © 3-shake Inc. 25 Admission Webhook 用サーバーに必要なもの • Webhook サーバーへのアクセスには

    TLS が必須でかつ、サーバー証明書も検証可能でなければ ならないらしい • ServerName は {service}.{namespace}.svc. • 検証可能にするために CA の証明書は MutatingWebhookConfiguration の clientConfig.caBundle にセットする必要がある • いつ証明書発行するの??? 🤔 TLS の CA とキーペア
  15. © 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 とキーペア
  16. © 3-shake Inc. 27 Admission Webhook 用サーバーに必要なもの • Kubernetes Cluster

    に cert-manager が導入されている、導入するなら cert-manager を使う方 がスマート TLS の CA とキーペア
  17. © 3-shake Inc. 28 Admission Webhook 用サーバーに必要なもの • Kubernetes Cluster

    に cert-manager が導入されている、導入するなら cert-manager を使う方 がスマート TLS の CA とキーペア
  18. © 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
  19. © 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
  20. © 3-shake Inc. 33 We are Hiring!! スリーシェイクでは一緒にSRE界隈を盛り上げてくれる仲間を募集中です! もしご興味をお持ちでしたら詳しいお話をさせてください! 専用フォームを用意しましたので、以下QRコードよりご登録お願いします。

    【カジュアル面談登録フォーム】 https://hrmos.co/pages/threeshake/jobs/E_9999/apply ※フォームの都合上、必須となっている項目がいくつか存在します。ご了承ください。
  21. © 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