Telepresence
Telepresenceとは
Telepresenceは CNCF(Cloud Native Computing Foundation)のSandboxプロジェクトの 1 つです。
Kubernetesからローカルへのリクエスト、ローカルからKubernetesへのリクエストをプロキシしてくれるツールです。
これだけだと意味がわからないので、具体的なユースケースを見ていきましょう。
ローカルのコンテナとKubernetes上のコンテナを入れ替える
マイクロサービスを開発する際の課題
マイクロサービス化が促進されればされるほど、ローカルで環境構築するのが困難になってきます。
docker-composeを使えばある程度緩和されますが、それでも本番環境とは構成が違ってきますし、ローカルのリソースを食います。
そこでTelepresenceを使って一連のマイクロサービスをKubernetes上に置き、開発対象のサービスだけローカルに置くことを考えます。
例として、サービスA、サービスBを想定します。
例えばサービスAの機能だけを修正したい場合、Telepresenceを使えば、ローカルのコンテナとKubernetes上のコンテナを置き替えることができます。
つまり
ブラウザからアクセス→サービスA(k8s上のコンテナ)→サービスB(k8s上のコンテナ)→DB
を
ブラウザからアクセス→サービスA(ローカル上のコンテナ)→サービスB(k8s上のコンテナ)→DB
にできます。
これにより、ローカルでサービス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が通信を仲介してくれています。
Kubernetesからローカルのportへリクエストを流す
ローカルでコンテナを動かさなくても、ローカルのportへリクエストを流すことができます。
新しいDeploymentを作成し、そこへのリクエストをローカルのportに流す
(ただし、Kubernetes上のserviceへは名前解決ができないためアクセスできない…。)
$ telepresence --new-deployment {新しいDeployment名} --expose 3000 --run bundle exec rails s
新しいDeployment名をservice-c
にした場合:
既存のDeploymentを置き換え、そこへのリクエストをローカルのportに流す
(ただし、Kubernetes上のserviceへは名前解決ができないためアクセスできない…。)
$ telepresence --swap-deployment {サービスBのDeployment名} --expose 3000 --run bundle exec rails s
Kubernetesクラスタ内のサービスにアクセスする
Telepresenceを使うとKubernetesクラスタ内のサービスに簡単にアクセスすることができます。
たとえば、KubernetesのサービスBのServiceに対してローカルからリクエストを投げることができます。
$ telepresence --run curl http://service-b:3000/users/hoge
--run
移行のコマンドは、Kubernetesのコンテナ内で実行されるため、curlの他にも様々なことができます。
KubernetesのServiceはクラスタ外からアクセスできるようになっているとは限らないので、そういった場合にこういう方法はデバッグする際に便利です。