LoginSignup
32

More than 3 years have passed since last update.

TelepresenceとKubernetesを使って迅速な開発を行う

Last updated at Posted at 2019-07-07

Telepresence

Telepresenceとは

Telepresenceは CNCF(Cloud Native Computing Foundation)Sandboxプロジェクトの 1 つです。
Kubernetesからローカルへのリクエスト、ローカルからKubernetesへのリクエストをプロキシしてくれるツールです。
これだけだと意味がわからないので、具体的なユースケースを見ていきましょう。

ローカルのコンテナとKubernetes上のコンテナを入れ替える

マイクロサービスを開発する際の課題

マイクロサービス化が促進されればされるほど、ローカルで環境構築するのが困難になってきます。
docker-composeを使えばある程度緩和されますが、それでも本番環境とは構成が違ってきますし、ローカルのリソースを食います。
そこでTelepresenceを使って一連のマイクロサービスをKubernetes上に置き、開発対象のサービスだけローカルに置くことを考えます。
例として、サービスA、サービスBを想定します。
スクリーンショット 2019-07-05 11.00.35.png

例えばサービスAの機能だけを修正したい場合、Telepresenceを使えば、ローカルのコンテナとKubernetes上のコンテナを置き替えることができます。

つまり
ブラウザからアクセス→サービスA(k8s上のコンテナ)→サービスB(k8s上のコンテナ)→DB
スクリーンショット 2019-07-05 11.00.35.png


ブラウザからアクセス→サービスA(ローカル上のコンテナ)→サービスB(k8s上のコンテナ)→DB
スクリーンショット 2019-07-05 11.20.57.png

にできます。
これにより、ローカルでサービスBの環境を構築しなくてもよくなります。

コマンドは以下です。

$ telepresence --swap-deployment {サービスAのDeployment名} --docker-run --rm -it {サービスAのDocker Image名}

ローカルのvolumeをマウントしてコンテナを動かしたい場合は以下のようにします。こうするとソースを変更してもイメージを再作成しなくてもよいので迅速な開発が可能になります。

$ telepresence --swap-deployment {サービスAのDeployment名} --docker-run --rm -v /Users/akira/work/service_a:/var/app/current -p 3000:3000 {サービスAのDocker Image名}

上の図は簡略化された図ですが、正確には以下のようにTelepresence ProxyとTelepresence Clientが通信を仲介してくれています。
スクリーンショット 2019-07-07 14.30.38.png

Kubernetesからローカルのportへリクエストを流す

ローカルでコンテナを動かさなくても、ローカルのportへリクエストを流すことができます。

新しいDeploymentを作成し、そこへのリクエストをローカルのportに流す

(ただし、Kubernetes上のserviceへは名前解決ができないためアクセスできない…。)

$ telepresence --new-deployment {新しいDeployment名} --expose 3000 --run bundle exec rails s

新しいDeployment名をservice-cにした場合:
スクリーンショット 2019-07-07 14.49.09.png

既存のDeploymentを置き換え、そこへのリクエストをローカルのportに流す

(ただし、Kubernetes上のserviceへは名前解決ができないためアクセスできない…。)

$ telepresence --swap-deployment {サービスBのDeployment名} --expose 3000 --run bundle exec rails s

スクリーンショット 2019-07-07 14.51.01.png

Kubernetesクラスタ内のサービスにアクセスする

Telepresenceを使うとKubernetesクラスタ内のサービスに簡単にアクセスすることができます。
たとえば、KubernetesのサービスBのServiceに対してローカルからリクエストを投げることができます。

$ telepresence --run curl http://service-b:3000/users/hoge

スクリーンショット 2019-07-07 14.51.01.png

--run移行のコマンドは、Kubernetesのコンテナ内で実行されるため、curlの他にも様々なことができます。

KubernetesのServiceはクラスタ外からアクセスできるようになっているとは限らないので、そういった場合にこういう方法はデバッグする際に便利です。

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32