Slide 1

Slide 1 text

Telepresenceハンズオン 2019/08/08 岡野兼也(@Juju_62q)

Slide 2

Slide 2 text

Telepresenceハンズオンにようこそ 2 2

Slide 3

Slide 3 text

Okano Kenya / @Juju_62q Belonging: - “CyberAgent, Inc” Team: - “OpenSaaS Studio” - “Simply Pay” Role: - “Site Reliability Engineer” - “EKS Cluster Admin” - “ほうれん草エバンジェリスト” Interest: - “CloudNative” - “Developer Experience” 3 3

Slide 4

Slide 4 text

アンケート 4 4

Slide 5

Slide 5 text

コンテナ使っている人? 5 5

Slide 6

Slide 6 text

Kubernetes使っている人? 6 6

Slide 7

Slide 7 text

マイクロサービスやってる人? 7 7

Slide 8

Slide 8 text

開発めっちゃ楽になった人? 8 8

Slide 9

Slide 9 text

正直しんどい人? 9 9

Slide 10

Slide 10 text

今日はそんな悩みを少しでも 解決できたらと思ってます! 10 10

Slide 11

Slide 11 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 11 11

Slide 12

Slide 12 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 12 12

Slide 13

Slide 13 text

Telepresenceってなんですか? 13 13

Slide 14

Slide 14 text

Telepresenceってなんですか? 14 14 ● CNCFのSandboxプロジェクト ● Pythonで作られたOSS ● Kubernetes上で”楽に”マイクロサービスを開発するため のツール ● 環境の差分を極力減らすためのツール

Slide 15

Slide 15 text

具体的にはなんですか? 15 15 あなたの開発機とKubernetesをいい感じに接続します

Slide 16

Slide 16 text

具体的にはなんですか? 16 16 ローカルマシンで動作しているものをKubernetesの Deploymentとして動かせます

Slide 17

Slide 17 text

つまり! 17 17

Slide 18

Slide 18 text

開発機をK8sクラスタの一部と見立てることで 環境差分の影響を減らし,簡単に開発をするためのツール (正確な物言いではありません) 18 18

Slide 19

Slide 19 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 19 19

Slide 20

Slide 20 text

Microservice, K8sをなぜ使う? 20 20 ● 開発速度の向上 ● dev, stg, prdでの環境一致 ● 抽象化された基盤利用での可搬性の担保 ● 柔軟なスケール ● Declarativeなリソース作成

Slide 21

Slide 21 text

Microservice, K8sをなぜ使う? 21 21 ● 開発速度の向上 ● dev, stg, prdでの環境一致 ● 抽象化された基盤利用での可搬性の担保 ● 柔軟なスケール ● Declarativeなリソース作成 Operatorが嬉しい

Slide 22

Slide 22 text

Microservice, K8sをなぜ使う? 22 22 ● 開発速度の向上 ● dev, stg, prdでの環境一致 ● 抽象化された基盤利用での可搬性の担保 ● 柔軟なスケール ● Declarativeなリソース作成 Developerが嬉しい…?

Slide 23

Slide 23 text

開発速度について 23 23

Slide 24

Slide 24 text

K8sで動くアプリの開発サイクル 24 24 ① コンテナで動く   アプリケーションを開発 ② CIがコンテナレジストリに   イメージをPush ③ K8sのyamlを編集   (自動化してる場合もある) ④ 更新したyamlをapply

Slide 25

Slide 25 text

VMで動くアプリの開発サイクル 25 25 ① アプリケーションを開発 ② CDやsshによるデプロイ

Slide 26

Slide 26 text

VMで動くアプリの開発サイクル 26 26 ① アプリケーションを開発 ② CDやsshによるデプロイ アプリケーションエンジニアからみた 試行錯誤の速度の低下

Slide 27

Slide 27 text

さらに? 27 27

Slide 28

Slide 28 text

GitOps(CIOps含む) 28 28 ● weaveworksが提唱した,K8sの運用,管理手法 ● kubectlを人間が使わず,ツールで変更を行う ● PRベースでクラスタの状態を変更する ● GitリポジトリをSingle Source of Truthとして扱う

Slide 29

Slide 29 text

GitOpsでの開発サイクル 29 29 ① コンテナで動く   アプリケーションを開発 ② CIがコンテナレジストリに   イメージをPush ③ K8sのyamlを編集   (自動化してる場合もある) ④ 変更をPRに出す

Slide 30

Slide 30 text

GitOpsでの開発サイクル 30 30 ① コンテナで動く   アプリケーションを開発 ② CIがコンテナレジストリに   イメージをPush ③ K8sのyamlを編集   (自動化してる場合もある) ④ 変更をPRに出す ● ちょっと新しいイメージで試したいだけ なのに… ● サービス間の疎通確認をサクッと とりたいんだけど ● 試行錯誤の記録が全部Gitに残っちゃう

Slide 31

Slide 31 text

K8sの導入で? 31 31 ● やらなきゃならないことが増えた ● 試したいだけなのに自分以外が関わることが増えた 開発のサイクルの速度低下…?

Slide 32

Slide 32 text

環境一致について 32 32

Slide 33

Slide 33 text

コンテナ,K8sの導入で? 33 33 ● 同一イメージをdev, stg, prdで同じように使うように ● 12 Factor Appsやステートレスなアプリを意識, どこでも同じように走り出すアプリケーション ● イミュータブルインフラストラクチャによるわかりやすさ

Slide 34

Slide 34 text

Microserviceを取り巻く開発環境 34 34 ● サービスをスケールさせることが大事 ● 運用,開発コストを下げていく ● パブリッククラウドのマネージドサービスをフル活用 ● コンテナにより動作環境の差を保証…?

Slide 35

Slide 35 text

Microserviceを取り巻く開発環境 35 35 ● サービスをスケールさせることが大事 ● 運用,開発コストを下げていく ● パブリッククラウドのマネージドサービスをフル活用 ● コンテナにより動作環境の差を保証…? 結局ここに強く依存しているのでlocalに閉じた開発とクラ ウドで動かした時の挙動は必ずしも一致しない

Slide 36

Slide 36 text

環境一致,本当にできてる? 36 36 ● マネージドサービスの利活用によって生まれる オンプレと実環境の違い ● ローカルでそれっぽいものを動かすツールは確かにある ○ LocalStack ○ datastore-emulator ○ microk8s, kind

Slide 37

Slide 37 text

環境一致,本当にできてる? 37 37 ● localと実際の環境の違い ○ 実際にはK8sで動かすが開発はdocker-compose ○ 実際にはCloudSQLやAuroraだけどMySQL ● さらに,データストアやエミュレータを使うと開発機が エフェメラルに保てない ● 開発機で環境変数管理するのアンセキュア

Slide 38

Slide 38 text

従来の開発での問題点まとめ 38 38 ● 開発速度 ○ K8sやDockerの利用でアプリ開発者の責務は 大きくなっている ○ ちょっと試したい時にもGitリポジトリの書き換え? ● 環境一致 ○ マネージド環境の利用により生まれる開発機と実際に 動作する環境の差異 ○ 開発機のストレージに動作が依存している場合も

Slide 39

Slide 39 text

その他の問題点 39 39 ● マイクロサービスの開発をする際に複数のアプリを起動 しなければならず煩わしい ● localstackなどを起動すると開発機のリソースを めちゃくちゃくう ● 開発機唸りがち(特にSimply PayではKotlinを採用してい るせいでひどく唸る)

Slide 40

Slide 40 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 40 40

Slide 41

Slide 41 text

Telepresenceは これらの問題を緩和しうるツールです 41 41

Slide 42

Slide 42 text

開発速度について 42 42

Slide 43

Slide 43 text

GitOpsでの開発サイクル 43 43 ① コンテナで動く   アプリケーションを開発 ② CIがコンテナレジストリに   イメージをPush ③ K8sのyamlを編集   (自動化してる場合もある) ④ 変更をPRに出す

Slide 44

Slide 44 text

Telepresenceでできること 44 44 ローカルマシンで動かしているコンテナを 任意の場所にあるK8sのPodとして動かせます

Slide 45

Slide 45 text

Telepresenceを使った開発サイクル 45 45 ① コンテナで動く   アプリケーションを開発 ② ローカルマシンに   コンテナがあればいい ③ イメージの差し替えを   せずにクラスタで動作確認 ④ Telepresenceコマンド   で動作確認

Slide 46

Slide 46 text

Telepresenceを使った開発サイクル 46 46 ① コンテナで動く   アプリケーションを開発 ② ローカルマシンに   コンテナがあればいい ③ イメージの差し替えを   せずにクラスタで動作確認 ④ Telepresenceコマンド   で動作確認 telepresence \ --swap-deployment ${deployment_name} \ --docker-run --rm \ -p ${container_port}:${local_port} \ ${container_image}

Slide 47

Slide 47 text

環境一致について 47 47

Slide 48

Slide 48 text

Telepresenceでできること 48 48 あなたの開発機とKubernetesをいい感じに接続します

Slide 49

Slide 49 text

アプリケーションを考える 49 49

Slide 50

Slide 50 text

アプリケーションを考える 50 50

Slide 51

Slide 51 text

Telepresenceを使ってみる 51 51

Slide 52

Slide 52 text

クラウドの資源を使いながら 開発機の変更を反映可能 52 52

Slide 53

Slide 53 text

Telepresenceの恩恵 53 53 ● K8sのSecretリソースに定義のままアクセス可能 ● 開発機で走るコンテナはあくまで1つだけ ● マイクロサービスの前後関係を含むE2Eテストが容易 ● 開発機でデータを持つ必要がないのでエフェメラルに 保てる

Slide 54

Slide 54 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 54 54

Slide 55

Slide 55 text

Telepresenceの基本的な挙動 55 55 App 1 App 2

Slide 56

Slide 56 text

Telepresenceの基本的な挙動 56 56 App 1 App 2 App 2の挙動を確かめるぞ

Slide 57

Slide 57 text

Telepresenceの基本的な挙動 57 57 App 1 App 2 App 2へのアクセスをジャック クラスタと開発機の間に 双方向プロキシは確立

Slide 58

Slide 58 text

Telepresenceの基本的な挙動 58 58 App 1 App 2 Deploymentに当てられている ConfigMap,Secretを取得

Slide 59

Slide 59 text

Telepresenceの基本的な挙動 59 59 App 1 App 2 プロキシを経由してK8sで動く 別サービスにアクセス可能

Slide 60

Slide 60 text

Telepresenceの基本的な挙動 60 60 App 1 App 2 ここにアクセスすればE2Eで 動作確認可能

Slide 61

Slide 61 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 61 61

Slide 62

Slide 62 text

ハンズオン https://github.com/Juju-62q/telepresence-handson 62 62

Slide 63

Slide 63 text

注意事項 63 63 ● 各人で進められるようにはしておいてあるので,全体で 同期を取ることはあまりしません. ● 詰まったらなんでも聞いてください. ● 時間余った人はメンターお手伝いか,advancedなもの, 試してみたいことをやってみましょう! ● Dockerfileやアプリケーションの品質については 何も言わないでください

Slide 64

Slide 64 text

Setup 64 64 書いてある通りにやればクラスタ立ち上がると信じてます

Slide 65

Slide 65 text

時間かかるのでTips 65 65 ● プロキシの通信経路確保の都合上localhostへの アクセスは開発機へのアクセスになる (Pod IPを指定すればアクセス可能) ● ファイアウォールが悪さをする場合があるので設定注意 ● 複数コンテナを同時に変化させるのは難しい 参考: https://www.telepresence.io/reference/limitations 割とマメに更新されてる印象です

Slide 66

Slide 66 text

swap-deployment 66 66 既存のdeploymentを更新してみましょう telepresence \ --swap-deployment ${deployment_name} \ --docker-run --rm \ -p ${container_port}:${local_port} \ ${container_image} docker runのオプションは概ね使えます

Slide 67

Slide 67 text

use-secret 67 67 環境変数を持たずとも,変数を利用できることを確認する telepresence \ --swap-deployment ${deployment_name} \ --docker-run --rm \ -p ${container_port}:${local_port} \ -e TEST=hogehoge \ ${container_image} -eオプションで上書きもできる

Slide 68

Slide 68 text

use-secret 68 68 環境変数を持たずとも,変数を利用できることを確認する telepresence \ --swap-deployment ${deployment_name} \ --docker-run --rm \ -p ${container_port}:${local_port} \ -e TEST=hogehoge \ ${container_image} -eオプションで上書きもできる

Slide 69

Slide 69 text

create-new-deployment 69 69 新規の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がクラスタに生える

Slide 70

Slide 70 text

advanced 70 70 ● ぜひ色んなことを試してみて欲しいです!(下記は例) ○ secretやconfigMapのファイル版を作成して,それがpodから読み取れ ることを確認する ○ Telepresenceから同一Podへの通信がlocalhostでできないことを 確認する(PodIPによる指定も確認してみる) ○ 複数のコンテナがあるポッドでデフォルトコンテナじゃないコンテナを 入れ替えてみる ○ --docker-runではなく,shellで動くアプリをdeploymentにしてみる

Slide 71

Slide 71 text

こんなときどうする? 71 71 ● 複数のコンテナを同時に試したい -> 基本的には無理,docker-composeで無理やりなら ● コンテキストを切り替えたいんだけど -> `--context=${context_name}`で可能です! ● デフォルトコンテナ以外を変更したいんだけど -> `${deployment_name}:${container_name}`で可能です

Slide 72

Slide 72 text

本日の予定 ● Telepresenceってなんですか? ● K8sでの開発はなぜしんどい? ● 開発手法から見るTelepresence ● How to work Telepresence? ● 試してわかるTelepresence ● まとめ 72 72

Slide 73

Slide 73 text

まとめ 73 73 ● K8s,マイクロサービスの導入で開発が大変になっている 部分があり,技術で対応する必要がある ● TelepresenceはK8s上のマイクロサービスを素早く, 環境差異を減らしつつ開発するための便利ツール ● 本当に大変なのは布教です