著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。

序章

Kubernetesでマイクロサービスを構築するアプリケーション開発者は、多くの場合、速度を低下させる2つの大きな問題に遭遇します。

  • 遅いフィードバックループ。 コードを変更したら、テストするためにKubernetesにデプロイする必要があります。 これには、コンテナのビルド、コンテナレジストリへのプッシュ、Kubernetesへのデプロイが必要です。 これにより、すべてのコード反復に数分が追加されます。
  • ローカルのメモリとCPUが不足しています。 開発者は、 minikube または同等のものを使用してローカルでKubernetesを実行することにより、フィードバックループを高速化しようとします。 ただし、リソースを大量に消費するアプリケーションは、ローカルで使用可能なコンピューティングとメモリをすぐに超えます。

Telepresence は、Kubernetesでの高速で効率的な開発のためのCloud-NativeComputingFoundationプロジェクトです。 Telepresenceを使用すると、サービスをローカルで実行し、残りのアプリケーションをクラウドで実行します。 Telepresenceは、Kubernetesクラスターとローカルワークステーションの間に双方向ネットワーク接続を作成します。 このようにして、ローカルで実行しているサービスはクラスター内のサービスと通信でき、その逆も可能です。 これにより、クラスターのコンピューティングリソースとメモリリソースを使用できますが、変更ごとに完全な展開サイクルを実行する必要はありません。

このチュートリアルでは、MacOSを実行しているローカルマシンでTelepresenceを構成して、Kubernetesクラスターで動作するようにします。 クラスタへのトラフィックを傍受し、ローカル環境にリダイレクトします。

前提条件

このチュートリアルを完了するには、次のものが必要です。

ステップ1—Telepresenceのインストール

このステップでは、Telepresenceをインストールし、Kubernetesクラスターに接続します。 まず、kubectlが設定されていることと、ローカルワークステーションからKubernetesクラスタに接続できることを確認してください。 get servicesコマンドを使用して、クラスターのステータスを確認します。

  1. kubectl get services

出力は次のようになり、独自のクラスターのIPアドレスがリストされます。

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 116m

次に、Telepresenceをローカルにインストールします。 テレプレゼンスは単一のバイナリとして提供されます。

curlを使用して、MacOS用の最新のバイナリ(約60 MB)をダウンロードします。

  1. sudo curl -fL https://app.getambassador.io/download/tel2/darwin/amd64/latest/telepresence -o /usr/local/bin/telepresence

次に、chmodを使用して、バイナリを実行可能にします。

  1. sudo chmod a+x /usr/local/bin/telepresence

Telepresenceがローカルにインストールされたので、Kubernetesクラスターに接続してTelepresenceが機能したことを確認できます。

  1. telepresence connect

次の出力が表示されます。

Output
Launching Telepresence Daemon v2.2.0 (api v3) Connecting to traffic manager... Connected to context default (https://<cluster public URL)

Telepresenceが接続しない場合は、kubectlの構成を確認してください。

statusコマンドを使用してKubernetesAPIサーバーに接続し、Telepresenceが正しく機能していることを確認します。

  1. telepresence status

次の出力が表示されます。 Telepresence Proxy: ONは、Telepresenceがクラスター上のサービスにアクセスするためのプロキシーを構成したことを示します。

Output
Root Daemon: Running Version : v2.2.0 (api 3) Primary DNS : "" Fallback DNS: "" User Daemon: Running Version : v2.2.0 (api 3) Ambassador Cloud : Logged out Status : Connected Kubernetes server : https://e5488ea3-6455-4fc7-be25-09d1d90bde82.k8s.ondigitalocean.com Kubernetes context: your_kubernetes_context Telepresence proxy: ON (networking to the cluster is enabled) Intercepts : 0 total

サーバー側でtelepresence connectを使用すると、Telepresenceはambassadorという名前空間を作成し、トラフィックマネージャーを実行します。 クライアント側では、Telepresenceはリモートサーバーへのローカルアクセスを可能にするDNSを設定します。 つまり、ローカルサービスへのアクセスを手動で構成するためにkubectl port-forwardを使用する必要はありません。 リモートサービスにアクセスすると、DNSは特定のIPアドレスに解決されます。 詳細については、Telepresenceアーキテクチャのドキュメントを参照してください。

これで、Kubernetesクラスタがラップトップで実行されているかのように、ローカルワークステーションからリモートKubernetesクラスタに接続できます。 次に、サンプルアプリケーションを試してみます。

ステップ2—サンプルのNode.jsアプリケーションを追加する

このステップでは、単純なNode.jsアプリケーションを使用して、Kubernetesクラスターで実行されている複雑なサービスをシミュレートします。 ファイルをローカルで作成する代わりに、 DockerHub からファイルにアクセスし、そこからクラスターにデプロイします。 このファイルはhello-nodeと呼ばれ、テキスト文字列を返します。

var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.write('Hello, Node!');
  response.end();
};

http.createServer(handleRequest).listen(9001);
console.log('Use curl <hostname>:9001 to access this server...');

kubectl create deploymentコマンドを使用して、hello nodeという名前の展開を作成します。

  1. kubectl create deployment hello-node --image=docommunity/hello-node:1.0

次の出力が表示されます。

Output
deployment.apps/hello-node created

get podコマンドを使用して、デプロイが行われ、アプリがクラスター上で実行されていることを確認します。

  1. kubectl get pod

出力には、READYステータスの1/1が表示されます。

Output
NAME READY STATUS RESTARTS AGE hello-node-86b49779bf-9zqvn 1/1 Running 0 11s

expose deploymentコマンドを使用して、アプリケーションをポート9001で使用できるようにします。

  1. kubectl expose deployment hello-node --type=LoadBalancer --port=9001

出力は次のようになります。

Output
service/hello-node exposed

kubectl get svcコマンドを使用して、ロードバランサーが実行されていることを確認します。

  1. kubectl get svc

出力は次のようになり、独自のIPアドレスが使用されます。

Output
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE hello-node LoadBalancer 10.245.75.48 <pending> 9001:30682/TCP 4s kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 6d

ロードバランサーをサポートせずにローカルKubernetesを使用している場合、LoadBalancerの外部IP値は<pending>として永続的に表示されます。 これは、このチュートリアルの目的には問題ありません。 DigitalOcean Kubernetesを使用している場合は、外部IP値が遅延後にIPアドレスを表示することを確認する必要があります。

次に、curlを使用してロードバランサーにアクセスし、アプリケーションが実行されていることを確認します。

  1. curl <ip-address>:9001

ロードバランサーを実行していない場合は、curlを使用してサービスに直接アクセスできます。

  1. curl <servicename>.<namespace>:9001

出力は次のようになります。

Output
Hello, Node!

次に、telepresence connectコマンドを使用して、Telepresenceをクラスターに接続します。

  1. telepresence connect

これにより、すべてのリモートサービスにローカルであるかのようにアクセスできるため、次の名前でサービスにアクセスできます。

  1. curl hello-node.default:9001

IPを介してサービスにアクセスしたときと同じ応答を受け取ります。

Output
Hello, Node!

サービスはクラスター上で稼働しており、リモートでアクセスできます。 hello-node.jsアプリに変更を加える場合は、次の手順を実行する必要があります。

  • アプリを変更します。
  • コンテナイメージを再構築します。
  • コンテナレジストリにプッシュします。
  • Kubernetesにデプロイします。

それは多くのステップです。 ツール( Skaffold などの自動パイプライン)を使用して、手作業を減らすことができます。 ただし、手順自体をバイパスすることはできません。

次に、hello-node appの別のバージョンをビルドし、Telepresenceを使用して、コンテナーイメージをビルドしたり、レジストリにプッシュしたり、Kubernetesにデプロイしたりせずにテストします。

ステップ3—新しいバージョンのサービスをローカルで実行する

この手順では、ローカルマシン上の既存のhello-nodeアプリケーションを変更します。 次に、テレプレゼンスを使用して、テレプレゼンスインターセプトを使用してトラフィックをローカルバージョンにルーティングします。 インターセプトは、クラスター向けのトラフィックを取得し、それをローカルバージョンのサービスに再ルーティングするため、開発環境での作業を継続できます。

サンプルアプリケーションの変更バージョンを含む新しいファイルを作成します。

  1. nano hello-node-v2.js

次のコードを新しいファイルに追加します。

hello-node-v2.js
var http = require('http');

var handleRequest = function(request, response) {
  console.log('Received request for URL: ' + request.url);
  response.writeHead(200, {'Content-Type': 'text/plain'});
  response.write('Hello, Node V2!');
  response.end();
};

http.createServer(handleRequest).listen(9001);

ファイルを保存して終了します。

Nodeでサービスを開始します。

  1. node hello-node-v2.js

サービスを実行したままにして、新しいターミナルウィンドウを開き、サービスにアクセスします。

  1. curl localhost:9001

出力は次のようになります。

Output
Hello, Node V2!

ただし、このサービスはローカルでのみ実行されます。 リモートサーバーにアクセスしようとすると、現在hello-nodeのバージョン1が実行されています。 これを修正するには、インターセプトを有効にして、クラスター内のhello-nodeサービスに向かうすべてのトラフィックをローカルバージョンのサービスにルーティングします。

interceptコマンドを使用して、インターセプトを設定します。

  1. telepresence intercept hello-node --port 9001

出力は次のようになります。

Output
Using deployment hello-node intercepted Intercept name : hello-node State : ACTIVE Destination : 127.0.0.1:9001 Volume Mount Error: sshfs is not installed on your local machine Intercepting : all TCP connections

statusコマンドを使用して、インターセプトが正しく設定されていることを確認します。

  1. telepresence status

出力は次のようになります。

Output
Root Daemon: Running Version : v2.2.0 (api 3) Primary DNS : "" Fallback DNS: "" User Daemon: Running Version : v2.2.0 (api 3) Ambassador Cloud : Logged out Status : Connected Kubernetes server : https://e5488ea3-6455-4fc7-be25-09d1d90bde82.k8s.ondigitalocean.com Kubernetes context: <your_kubernetes_context> Telepresence proxy: ON (networking to the cluster is enabled) Intercepts : 1 total hello-node: user@context

以前と同じように、curlを使用してリモートサービスにアクセスします。

  1. curl hello-node.default:9001

出力は次のようになります。

Output
Hello, Node V2!

これで、クラスター上のサービスに送信されたメッセージはすべてローカルサービスにリダイレクトされます。 これは、コードへの個々の変更ごとにデプロイメントループ(ビルド、プッシュ、デプロイ)を回避できるため、開発段階で役立ちます。

結論

このチュートリアルでは、ローカルマシンにTelepresenceをインストールし、変更を加えるたびにKubernetesにデプロイすることなく、ローカル環境でコードを変更する方法を示しました。 Telepresenceに関するその他のチュートリアルと情報については、Telepresenceのドキュメントを参照してください。