@_k_e_k_e)です。マイクロサービスは、サービスのスケーラビリティ、新技術への親和性、ベロシティ、モジュラティの観点から、より早く「価値」を届けることにつながり、ソフトウェア開発としても、ビジネスとしても非常に重要です。本記事はKubernetesクラスタに構築されたマイクロサービスをより効率的に開発するためのツールであるTelepresenceの記事です。Telepresenceを体験してもらえるように簡単なサービスのアプリケーションコードを用意したので「Telepresenceを使うためのサービスがない」という状況でも簡単に試してみることができます。本記事は以下のように構成されています。興味のあるセクションだけでもご覧ください。知っている方は多いと思いますがメルカリではMicroservice化が進んでおり、Kubernetesクラスタの上でいくつものサービスが構築されています。マイクロサービスを導入する理由としては、サービス毎の独立したスケーラビリティ、新技術への親和性、ベロシティ、モジュラティの高さなど挙げられます。それらはより早く価値を届けることにつながり、ビジネスとしても非常に重要です。https://github.com/warmchang/KubeCon-North-America-2018それに伴って、サービスごとでチームの編成が、逆コンウェイの戦略と知られる、マイクロサービスのアーキテクチャを真似た開発の組織構造になりやすくなります。サービスごとに疎な結合を目指す一方で、依存関係があるサービスももちろんあるので、開発をする、テストをする中でそれらがマイクロサービスでの障壁となります。一方で、モノリシックなサービスの場合は、3層アーキテクチャであり、バックエンドは基本的にはすべて単体で完結するのでそのような問題は少ないです。3層アーキテクチャこれを解決するために、オープンソースなTelepresenceというリモートクラスタと透過的に双方向プロキシを行ってくれるツールがあります。GitOpsや継続的デリバリーの概念を満たしながらも、サービス間または環境間での依存性を(透過的に)解決して、より効率よくローカル開発環境を構築できます。以下のバージョンで開発をしています。TelepresenceってなにTelepresenceとはリモートクラスタに対してより早く、ローカルで開発することを支援するツールです。現時点(2019/05/28)での最新バージョンは0.99です。「より早く、ローカルで開発するのを支援するツール」ができることは、大きくまとめると以下の2つです。クラスタのDeploymentをローカルサーバーと置き換えるクラスタにローカルからアクセスをするこれらの恩恵としてローカルサーバーのリモートクラスタの他サービスへアクセスローカルサーバーのKuberenetesクラスタのリソースであるsecretsやConfigMapのアクセスリモートクラスタのローカルサーバーへのアクセスが挙げられ、より簡単に開発をできるようになります。以下のようなサービスがあるとします。このサービスがやることは以下の通りです。クライアントからメッセージを受け取るメッセージに対して返答を取得し、環境変数ENVとともにJSONでクライアントに返すSecretが読み込まれているのを見せるためにSecretをレスポンスに含めて返していますが、本来の使い方ではないことに留意してください。本記事ではIngressを使いません。"Hi"}'ENVとメッセージの返答が返ってくるサービスです。pushしてCircleCIが走るのを待たないといけないチームです。Aをチームで機能を追加したいとなったときに、どのように開発したらいいでしょうか。Composeなどでリモートクラスタを再現することです。Composeによる構築しかし、いくつも問題があります。A)を置き換えることができます。ローカルでサーバーを立ち上げてTelepresenceを使うと以下のように双方向プロキシを構成してくれます。TelepresenceでDeploymentを置き換えるこれによって、先ほどの問題を解決することができます。クラスタにローカルからアクセスをする新しくサービスを作りたいけど、ひとまず他のサービスを試しにアクセスしてみたいというときはどのようにしましょう。forwardingです。Forwardingこれによってlocalhostでアクセスをできるようになります。単一Podへのアクセスはできたにしろ、例えば内部DNSなどKubernetes内部のリソースにはアクセスをすることができません。Telepresenceを使うと透過的にアクセスをできるようになるため以下のように内部DNSへ問い合わせてServiceへアクセスをすることが可能になります。Telepresenceによる透過的なアクセス内部DNSへ問い合わせてClusterIPへアクセスすることはKubernetesクラスタ内で一つのサービスがすることなので、本来の形で試せることになります。以下の準備物が既にインストールされていることを前提にしています。今回は皆さんが簡単にTelepresenceのユースケースを確認できるように、この簡単なサービスのソースコードを用意しました。以下のrepositoryをcloneしてください。Platformを使用します。GKEクラスタを作ります。initデフォルトでは以下のspecになっています。RegistoryへPushします。build次にHelmを使ってDeploymentをクラスタへデプロイします。deployあとはそれを確認できたら準備は終了です。準備といえど、インストールするだけです。macOSの場合はHomebrewを使って、以下のようにインストールしてください。クラスタのDeploymentをローカルサーバーと置き換える今回はクライアント、ServiceBとKubernetesのリソースであるconfigMapに板挟みになっているServiceAを置き換えてみましょう。やることは、TelepresenceでServiceAに機能を追加したServiceA`をローカルで開発することです。"Hi"}'に対して以下のように返していました。Hi"}しかし、チームで機能を追加しないといけないため、以下のようにしたいです。1558850051}新機能としてはdateTimeフィールドにタイムスタンプを返します。図にすると以下のような感じです。開発段階なので、ローカルでさくさく開発したいです。そのようなときはServiceAをServiceA’に置き換えます。手元でソースコードを以下のように変更しました。time.Now().Unix(),}そして、置き換えるために、以下のコマンドを実行します。service-a再度、実行します。"Hi"}'すると以下のように返ってきました。Imageと入れ替わっています。main.goでも可能です。ここでSecretを変更してみます。serviceB/templates/secret.yamlそしてアクセスすると以下のようになります。"Hi"}'すると以下のように変わっていました。クラスタにローカルからアクセスをするTelepresenceでアクセスをするPublicIPを持たないServiceBがあったとし、自分たちのチームはそのAPIを使ってServiceAを作るとします。試しにServiceBへアクセスしてみましょう。内部DNSを引いてアクセスするため以下のように実行します。ContainerのときPodにいくつもコンテナがあるときにはどのようにしましょう。carがコンテがあることが多いと思います。名]を指定し以下のコマンドを実行すると置き換えることができます。service-a:0.6.0図的には以下のようになっています。containerでも問題はありません。以下のようにcontextとnamespaceを指定することができます。注意点としては、単一サービスしか置き換えることができないところです。まとめTelepresenceはマイクロサービスを構成するサービスをより効率的に開発するためにはうってつけのツールであると感じました。pushしてdev環境へデリバリーすることを待ってからフィードバックを受けるのは時間の無駄です。このツールを使うことによってローカル環境でなるべくリモートクラスタのリソースを使うことにより、開発環境とクラスタ間の乖離を少なくして、効率よくアプリケーションを書くことができるのではないかと思います。単一のデプロイメントがローカルサーバーにトラフィックが流れるだけで、環境的には本番もしくは開発環境と同等なのでシークレットや環境変数をKubernetes上で共通化でき、開発機が持つ必要がなくなるという面も重要でしょう。これからKubernetesを触る人はぜひ使ってみてください。