Slide 1

Slide 1 text

mirrordでKubernetes環境での開発体験を向上させる! Kubernetes Novice Tokyo #33 2024/7/30 @mishio-n

Slide 2

Slide 2 text

自己紹介 Mishio Nagadome (@mishio-n) Sky株式会社 社内システムの開発、運用 SRE、プラットフォームエンジニアリング Kubernetes歴2年 CI/CD BackStageプラグイン作成 *発表内容は私自身の見解であり、必ずしも所属する企業や組織の立場、戦略、意見を代表するものではありません。

Slide 3

Slide 3 text

mirrordはKubernetes環境でローカルプロセスを実行できる、シンプルかつパワフルなツールです。 Kubernetes、あるいはマイクロサービスでの開発において、動作確認のためのデータがローカル環境に用意で きなかったり、サービス同士の依存関係により書いたコードをステージング環境にデプロイしないと動作を確 認できない、といった課題がありました。 これらを改善すべくmirrordを導入した話や、mirrordを使った開発体験を紹介したいと思います。

Slide 4

Slide 4 text

mirrordはKubernetes環境でローカルプロセスを実行できる、シンプルかつパワフルなツールです。 Kubernetes、あるいはマイクロサービスでの開発において、動作確認のためのデータがローカル環境に用意で きなかったり、サービス同士の依存関係により書いたコードをステージング環境にデプロイしないと動作を確 認できない、といった課題がありました。 これらを改善すべくmirrordを導入した話や、mirrordを使った開発体験を紹介したいと思います。 → mirrordというツールの紹介をします!

Slide 5

Slide 5 text

ローカル環境で開発していて、こんな経験ありませんか? フロントエンドを修正したいだけなのに、バックエンド、DBをローカルで用意しないと確認できない 開発するとき、システムが依存するサービス全てを手元で立ち上げないといけない 動くか不明だけど、開発・ステージング環境でないと検証できないからとりあえずマージ/デプロイする 何かよくわからないエラーが発生、それっぽいところにログを仕込んでデプロイする(をN回繰り返す) コードをプッシュして、CIでデプロイされるまで10分待ちぼうけになる

Slide 6

Slide 6 text

🥺 つらい、めんどい、やりたくない  🥺

Slide 7

Slide 7 text

こんなことできたらいいな、と思ったことないですか? 手元の環境から直接、ステージングにデプロイされているサービスにリクエストを送りたい ローカルでも、実際の認証認可処理を通過したリクエストを検証したい デプロイしているアプリケーションのコードを直接いじってデバッグしたい 手元の修正コードを一瞬だけデプロイして確認したい

Slide 8

Slide 8 text

🪞 できます。そう、mirrordならね。  🪞

Slide 9

Slide 9 text

No content

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

https://mirrord.dev/ https://github.com/metalbear-co/mirrord 「Develop Locally with Your Kubernetes Environment」 mirrord lets developers run local processes in the context of their Kubernetes environment. It’s meant to provide the benefits of running your service on a cloud environment (e.g. staging) without actually going through the hassle of deploying it there, and without disrupting the environment by deploying untested code. ”デプロイすることなく、Kubernetes環境でコードを動かせる”

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

mirrordのアーキテクチャ https://mirrord.dev/docs/reference/architecture/

Slide 14

Slide 14 text

mirrordの使い方 VSCode拡張 IntelliJプラグイン CLIツール(バイナリ) CLIのインストール https://github.com/metalbear-co/mirrord?tab=readme-ov-file#cli-tool homebrew brew install metalbear-co/mirrord/mirrord bash curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash

Slide 15

Slide 15 text

mirrordの使い方 VSCode拡張 IntelliJプラグイン CLIツール(バイナリ) CLIのインストール https://github.com/metalbear-co/mirrord?tab=readme-ov-file#cli-tool homebrew brew install metalbear-co/mirrord/mirrord bash curl -fsSL https://raw.githubusercontent.com/metalbear-co/mirrord/main/scripts/install.sh | bash

Slide 16

Slide 16 text

mirrordの使い方 ミラーリングしたいワークロードと動かすローカルプロセスをコマンドで指定して実行する mirrord exec --target/-t # example mirrord exec -t pod/nginx node dist/main.js

Slide 17

Slide 17 text

どんなことができるの? 🤔

Slide 18

Slide 18 text

ネットワークのミラーリング/スチール Kubernetesクラスター内のネットワークトラフィックを用いてローカルプロセスを動かす トラフィックのミラーリングとスチールの両方が可能 スチールした場合は全てのトラフィックがローカルに転送される 対象とするトラフィックをHTTPヘッダーやアドレスなどで条件指定することも可能 例えば、 ステージング環境に流れるリクエストを使ってローカルでデバッグ、動作確認 ミラーリングしたリクエストに対し、手元のコードにのみデバッグログを仕込んで中身を確認 とかができる!

Slide 19

Slide 19 text

リモートコンテキストを使用したリクエストの送信 ローカルプロセスから送信されるリクエストはリモートのコンテキストで実行される 名前解決もリモートコンテキストで実行されるので、後続のサービス間通信がそのまま行える Kubernetes → ローカル → Kubernetesのようなイメージ DB等、アクセス元が制限されているケースでも突破できる 逆に後続処理は別のローカルプロセスに転送したい場合など、挙動を細かくカスタマイズすることもできる 依存関係があっても、修正したいアプリケーションだけ手元で起動すればOK!

Slide 20

Slide 20 text

環境変数の継承 mirrordがターゲットのPodの持つ環境変数をローカルプロセスにも設定してくれる DBの接続情報や依存サービスの宛先を環境変数で管理していても、そのまま活用できる KubernetesのSecretが読み取り放題になってしまうのは注意点かも

Slide 21

Slide 21 text

デモ https://github.com/mishio-n/mirrord-demo 適当なHTTPサーバー3つ用意しました リクエスト-> service-a -> service-b -> service-c の順にトラフィックが流れます デプロイ済みのワークロードに対し、mirrordを使って挙動を変えてみます

Slide 22

Slide 22 text

デモできなくてごめんなさい 🙇

Slide 23

Slide 23 text

mirrordの設定 mirror と steal 2つのモードが用意されており、 デフォルトは mirror で通信をミラーリングする挙動になります。 このようなデフォルトの設定を変更する場合、jsonで設定ファイルを書いて読み込ませる必要があります。 // VS Code拡張を入れている場合、`mirrord.json`というファイル名にすると補完が効きます { "feature": { "network": { "incoming": "steal" } } } *現在はIstioなどサービスメッシュだとミラーリングはサポートされてないらしいです

Slide 24

Slide 24 text

その他のオプション ミラーリング・スチールする通信の条件を設定して、対象を限定することができます。 例えばHTTPヘッダーにアクセス者の情報が含まれている場合、自分にだけ影響を絞ることも可能です。 { "feature": { "network": { "incoming": { "mode":"steal", // X-Real-IPとかでIPで制御もできるかも "http_filter": { "header_filter": "access-user-account: mishio" } } } } }

Slide 25

Slide 25 text

その他のオプション ポートを合わせなくても、マッピングすることが可能です。 { "feature": { "network": { "incoming": { "mode": "steal", // ローカルが3000で、リモート(ポッド)が3030 "port_mapping": [[3000, 3030]] } } } }

Slide 26

Slide 26 text

その他のオプション コマンドでターゲット(Pod)を指定しない場合、 ターゲットレスモード になります。 ネットワークのミラーリング・スチールは行われませんが、 送信時のコンテキストはリモートのものを活用できるので、 新規のワークロードからサービス間通信を試したい場合に有効かもしれません mirrord exec

Slide 27

Slide 27 text

Telepresenseとの比較 https://mirrord.dev/compare/telepresence/

Slide 28

Slide 28 text

Awesome!

Slide 29

Slide 29 text

● メモ・補足 本番でやるのはNG。ステージングまでにしましょう ローカルプロセスに対しては、localhostでのリクエストももちろんOK mac以外で動くか検証できてない(WSLだとうまく動かなかった) フレームワークとの相性など、他にも動かない条件はそこそこあるかも。。。 内部的にポートフォワードを使うので、権限管理している場合は注意 ● ミラーリングとスチールの使い分け スチールは本来のリクエストを奪うので、場合によっては他の人に影響がでる。 ステージングなど安定性が求められる環境の場合は周知するのが吉。 ミラーリングは影響が少ない反面、書き込み処理が2重に走る可能性があるので 検証内容によってはうまく使えない。

Slide 30

Slide 30 text

まとめ ● ローカル開発環境、たくさんつらみあるよね ● mirrordを使ってKubernetes環境をうまく使えばもっと楽になるかも

Slide 31

Slide 31 text

よきKubernetesライフを! ご清聴ありがとうございました