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

序章

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

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

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

このチュートリアルでは、Ubuntu 20.04を実行しているローカルマシンで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 Linux用の最新のバイナリ(約50 MB)をダウンロードするには:

  1. sudo curl -fL https://app.getambassador.io/download/tel2/linux/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 ... Connected to context default (https://<cluster public IP>)

Telepresenceが接続しない場合は、 kubectl 構成。

テレプレゼンスが正しく機能していることを確認するには、KubernetesAPIサーバーに接続します。 status 指図:

  1. telepresence status

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

Output
Root Daemon: Running Version : v2.1.4 (api 3) Primary DNS : "" Fallback DNS: "" User Daemon: Running Version : v2.1.4 (api 3) Ambassador Cloud : Logged out Status : Connected Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.k8s.ondigitalocean.com Kubernetes context: <your_kubernetes_context> Telepresence proxy: ON (networking to the cluster is enabled) Intercepts : 0 total Connected Context: do-tor1-k8s-bg-telepresence (https://bee66877-1b07-4bb1-8c8f-4fd62e416865.k8s.ondigitalocean.com) 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を使用している場合、外部IP値は LoadBalancer として表示されます <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 <ip_address>:9001

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

Output
Hello, Node V2!

ただし、このサービスはローカルでのみ実行されます。 リモートサーバーにアクセスしようとすると、現在バージョン1が実行されています。 hello-node. これを修正するには、インターセプトを有効にして、 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.1.4 (api 3) Primary DNS : "" Fallback DNS: "" User Daemon: Running Version : v2.1.4 (api 3) Ambassador Cloud : Logged out Status : Connected Kubernetes server : https://7c10e553-10d1-4fee-9b7d-1ccbce4cdd34.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 <ip-address>:9001

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

Output
Hello, Node V2!

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

結論

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