Telepresenceハンズオン2019/08/08 岡野兼也(@Juju_62q)
View Slide
Telepresenceハンズオンにようこそ22
Okano Kenya / @Juju_62qBelonging:- “CyberAgent, Inc”Team:- “OpenSaaS Studio”- “Simply Pay”Role:- “Site Reliability Engineer”- “EKS Cluster Admin”- “ほうれん草エバンジェリスト”Interest:- “CloudNative”- “Developer Experience”33
アンケート44
コンテナ使っている人?55
Kubernetes使っている人?66
マイクロサービスやってる人?77
開発めっちゃ楽になった人?88
正直しんどい人?99
今日はそんな悩みを少しでも解決できたらと思ってます!1010
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ1111
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ1212
Telepresenceってなんですか?1313
Telepresenceってなんですか?1414● CNCFのSandboxプロジェクト● Pythonで作られたOSS● Kubernetes上で”楽に”マイクロサービスを開発するためのツール● 環境の差分を極力減らすためのツール
具体的にはなんですか?1515あなたの開発機とKubernetesをいい感じに接続します
具体的にはなんですか?1616ローカルマシンで動作しているものをKubernetesのDeploymentとして動かせます
つまり!1717
開発機をK8sクラスタの一部と見立てることで環境差分の影響を減らし,簡単に開発をするためのツール(正確な物言いではありません)1818
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ1919
Microservice, K8sをなぜ使う?2020● 開発速度の向上● dev, stg, prdでの環境一致● 抽象化された基盤利用での可搬性の担保● 柔軟なスケール● Declarativeなリソース作成
Microservice, K8sをなぜ使う?2121● 開発速度の向上● dev, stg, prdでの環境一致● 抽象化された基盤利用での可搬性の担保● 柔軟なスケール● Declarativeなリソース作成Operatorが嬉しい
Microservice, K8sをなぜ使う?2222● 開発速度の向上● dev, stg, prdでの環境一致● 抽象化された基盤利用での可搬性の担保● 柔軟なスケール● Declarativeなリソース作成Developerが嬉しい…?
開発速度について2323
K8sで動くアプリの開発サイクル2424① コンテナで動く アプリケーションを開発② CIがコンテナレジストリに イメージをPush③ K8sのyamlを編集 (自動化してる場合もある)④ 更新したyamlをapply
VMで動くアプリの開発サイクル2525① アプリケーションを開発② CDやsshによるデプロイ
VMで動くアプリの開発サイクル2626① アプリケーションを開発② CDやsshによるデプロイアプリケーションエンジニアからみた試行錯誤の速度の低下
さらに?2727
GitOps(CIOps含む)2828● weaveworksが提唱した,K8sの運用,管理手法● kubectlを人間が使わず,ツールで変更を行う● PRベースでクラスタの状態を変更する● GitリポジトリをSingle Source of Truthとして扱う
GitOpsでの開発サイクル2929① コンテナで動く アプリケーションを開発② CIがコンテナレジストリに イメージをPush③ K8sのyamlを編集 (自動化してる場合もある)④ 変更をPRに出す
GitOpsでの開発サイクル3030① コンテナで動く アプリケーションを開発② CIがコンテナレジストリに イメージをPush③ K8sのyamlを編集 (自動化してる場合もある)④ 変更をPRに出す● ちょっと新しいイメージで試したいだけなのに…● サービス間の疎通確認をサクッととりたいんだけど● 試行錯誤の記録が全部Gitに残っちゃう
K8sの導入で?3131● やらなきゃならないことが増えた● 試したいだけなのに自分以外が関わることが増えた開発のサイクルの速度低下…?
環境一致について3232
コンテナ,K8sの導入で?3333● 同一イメージをdev, stg, prdで同じように使うように● 12 Factor Appsやステートレスなアプリを意識,どこでも同じように走り出すアプリケーション● イミュータブルインフラストラクチャによるわかりやすさ
Microserviceを取り巻く開発環境3434● サービスをスケールさせることが大事● 運用,開発コストを下げていく● パブリッククラウドのマネージドサービスをフル活用● コンテナにより動作環境の差を保証…?
Microserviceを取り巻く開発環境3535● サービスをスケールさせることが大事● 運用,開発コストを下げていく● パブリッククラウドのマネージドサービスをフル活用● コンテナにより動作環境の差を保証…?結局ここに強く依存しているのでlocalに閉じた開発とクラウドで動かした時の挙動は必ずしも一致しない
環境一致,本当にできてる?3636● マネージドサービスの利活用によって生まれるオンプレと実環境の違い● ローカルでそれっぽいものを動かすツールは確かにある○ LocalStack○ datastore-emulator○ microk8s, kind
環境一致,本当にできてる?3737● localと実際の環境の違い○ 実際にはK8sで動かすが開発はdocker-compose○ 実際にはCloudSQLやAuroraだけどMySQL● さらに,データストアやエミュレータを使うと開発機がエフェメラルに保てない● 開発機で環境変数管理するのアンセキュア
従来の開発での問題点まとめ3838● 開発速度○ K8sやDockerの利用でアプリ開発者の責務は大きくなっている○ ちょっと試したい時にもGitリポジトリの書き換え?● 環境一致○ マネージド環境の利用により生まれる開発機と実際に動作する環境の差異○ 開発機のストレージに動作が依存している場合も
その他の問題点3939● マイクロサービスの開発をする際に複数のアプリを起動しなければならず煩わしい● localstackなどを起動すると開発機のリソースをめちゃくちゃくう● 開発機唸りがち(特にSimply PayではKotlinを採用しているせいでひどく唸る)
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ4040
Telepresenceはこれらの問題を緩和しうるツールです4141
開発速度について4242
GitOpsでの開発サイクル4343① コンテナで動く アプリケーションを開発② CIがコンテナレジストリに イメージをPush③ K8sのyamlを編集 (自動化してる場合もある)④ 変更をPRに出す
Telepresenceでできること4444ローカルマシンで動かしているコンテナを任意の場所にあるK8sのPodとして動かせます
Telepresenceを使った開発サイクル4545① コンテナで動く アプリケーションを開発② ローカルマシンに コンテナがあればいい③ イメージの差し替えを せずにクラスタで動作確認④ Telepresenceコマンド で動作確認
Telepresenceを使った開発サイクル4646① コンテナで動く アプリケーションを開発② ローカルマシンに コンテナがあればいい③ イメージの差し替えを せずにクラスタで動作確認④ Telepresenceコマンド で動作確認telepresence \--swap-deployment ${deployment_name} \--docker-run --rm \-p ${container_port}:${local_port} \${container_image}
環境一致について4747
Telepresenceでできること4848あなたの開発機とKubernetesをいい感じに接続します
アプリケーションを考える4949
アプリケーションを考える5050
Telepresenceを使ってみる5151
クラウドの資源を使いながら開発機の変更を反映可能5252
Telepresenceの恩恵5353● K8sのSecretリソースに定義のままアクセス可能● 開発機で走るコンテナはあくまで1つだけ● マイクロサービスの前後関係を含むE2Eテストが容易● 開発機でデータを持つ必要がないのでエフェメラルに保てる
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ5454
Telepresenceの基本的な挙動5555App 1 App 2
Telepresenceの基本的な挙動5656App 1 App 2App 2の挙動を確かめるぞ
Telepresenceの基本的な挙動5757App 1 App 2App 2へのアクセスをジャッククラスタと開発機の間に双方向プロキシは確立
Telepresenceの基本的な挙動5858App 1 App 2Deploymentに当てられているConfigMap,Secretを取得
Telepresenceの基本的な挙動5959App 1 App 2プロキシを経由してK8sで動く別サービスにアクセス可能
Telepresenceの基本的な挙動6060App 1 App 2ここにアクセスすればE2Eで動作確認可能
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ6161
ハンズオンhttps://github.com/Juju-62q/telepresence-handson6262
注意事項6363● 各人で進められるようにはしておいてあるので,全体で同期を取ることはあまりしません.● 詰まったらなんでも聞いてください.● 時間余った人はメンターお手伝いか,advancedなもの,試してみたいことをやってみましょう!● Dockerfileやアプリケーションの品質については何も言わないでください
Setup6464書いてある通りにやればクラスタ立ち上がると信じてます
時間かかるのでTips6565● プロキシの通信経路確保の都合上localhostへのアクセスは開発機へのアクセスになる(Pod IPを指定すればアクセス可能)● ファイアウォールが悪さをする場合があるので設定注意● 複数コンテナを同時に変化させるのは難しい参考: https://www.telepresence.io/reference/limitations割とマメに更新されてる印象です
swap-deployment6666既存のdeploymentを更新してみましょうtelepresence \--swap-deployment ${deployment_name} \--docker-run --rm \-p ${container_port}:${local_port} \${container_image}docker runのオプションは概ね使えます
use-secret6767環境変数を持たずとも,変数を利用できることを確認するtelepresence \--swap-deployment ${deployment_name} \--docker-run --rm \-p ${container_port}:${local_port} \-e TEST=hogehoge \${container_image}-eオプションで上書きもできる
use-secret6868環境変数を持たずとも,変数を利用できることを確認するtelepresence \--swap-deployment ${deployment_name} \--docker-run --rm \-p ${container_port}:${local_port} \-e TEST=hogehoge \${container_image}-eオプションで上書きもできる
create-new-deployment6969新規のdeploymentをTelepresenceで作成できることを確認telepresence \--new-deployment ${deployment_name} \--expose ${local_port}:${service_port} \--docker-run --rm \-p ${container_port}:${local_port} \${container_image}ClusterIPのServiceとDeploymentがクラスタに生える
advanced7070● ぜひ色んなことを試してみて欲しいです!(下記は例)○ secretやconfigMapのファイル版を作成して,それがpodから読み取れることを確認する○ Telepresenceから同一Podへの通信がlocalhostでできないことを確認する(PodIPによる指定も確認してみる)○ 複数のコンテナがあるポッドでデフォルトコンテナじゃないコンテナを入れ替えてみる○ --docker-runではなく,shellで動くアプリをdeploymentにしてみる
こんなときどうする?7171● 複数のコンテナを同時に試したい-> 基本的には無理,docker-composeで無理やりなら● コンテキストを切り替えたいんだけど-> `--context=${context_name}`で可能です!● デフォルトコンテナ以外を変更したいんだけど-> `${deployment_name}:${container_name}`で可能です
本日の予定● Telepresenceってなんですか?● K8sでの開発はなぜしんどい?● 開発手法から見るTelepresence● How to work Telepresence?● 試してわかるTelepresence● まとめ7272
まとめ7373● K8s,マイクロサービスの導入で開発が大変になっている部分があり,技術で対応する必要がある● TelepresenceはK8s上のマイクロサービスを素早く,環境差異を減らしつつ開発するための便利ツール● 本当に大変なのは布教です