MacOSでの迅速な開発のためにKubernetesでテレプレゼンスを使用する方法
著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。
序章
Kubernetesでマイクロサービスを構築するアプリケーション開発者は、多くの場合、速度を低下させる2つの大きな問題に遭遇します。
- 遅いフィードバックループ。 コードを変更したら、テストするためにKubernetesにデプロイする必要があります。 これには、コンテナのビルド、コンテナレジストリへのプッシュ、Kubernetesへのデプロイが必要です。 これにより、すべてのコード反復に数分が追加されます。
- ローカルのメモリとCPUが不足しています。 開発者は、 minikube または同等のものを使用してローカルでKubernetesを実行することにより、フィードバックループを高速化しようとします。 ただし、リソースを大量に消費するアプリケーションは、ローカルで使用可能なコンピューティングとメモリをすぐに超えます。
Telepresence は、Kubernetesでの高速で効率的な開発のためのCloud-NativeComputingFoundationプロジェクトです。 Telepresenceを使用すると、サービスをローカルで実行し、残りのアプリケーションをクラウドで実行します。 Telepresenceは、Kubernetesクラスターとローカルワークステーションの間に双方向ネットワーク接続を作成します。 このようにして、ローカルで実行しているサービスはクラスター内のサービスと通信でき、その逆も可能です。 これにより、クラスターのコンピューティングリソースとメモリリソースを使用できますが、変更ごとに完全な展開サイクルを実行する必要はありません。
このチュートリアルでは、MacOSを実行しているローカルマシンでTelepresenceを構成して、Kubernetesクラスターで動作するようにします。 クラスタへのトラフィックを傍受し、ローカル環境にリダイレクトします。
前提条件
このチュートリアルを完了するには、次のものが必要です。
-
DigitalOceanKubernetesなどのKubernetesクラスター。 チュートリアルではDigitalOceanKubernetesを使用しますが、既存のKubernetesクラスター(ローカルまたはクラウド)を使用することもできます。
-
kubectlがワークステーションにローカルにインストールされ、Kubernetesクラスターに接続するように構成されている
-
Node.jsのローカル開発環境。 Node.jsをインストールしてローカル開発環境を作成する方法に従うことができます。
ステップ1—Telepresenceのインストール
このステップでは、Telepresenceをインストールし、Kubernetesクラスターに接続します。 まず、kubectl
が設定されていることと、ローカルワークステーションからKubernetesクラスタに接続できることを確認してください。 get services
コマンドを使用して、クラスターのステータスを確認します。
- kubectl get services
出力は次のようになり、独自のクラスターのIPアドレスがリストされます。
OutputNAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.245.0.1 <none> 443/TCP 116m
次に、Telepresenceをローカルにインストールします。 テレプレゼンスは単一のバイナリとして提供されます。
curl
を使用して、MacOS用の最新のバイナリ(約60 MB)をダウンロードします。
- sudo curl -fL https://app.getambassador.io/download/tel2/darwin/amd64/latest/telepresence -o /usr/local/bin/telepresence
次に、chmod
を使用して、バイナリを実行可能にします。
- sudo chmod a+x /usr/local/bin/telepresence
Telepresenceがローカルにインストールされたので、Kubernetesクラスターに接続してTelepresenceが機能したことを確認できます。
- 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が正しく機能していることを確認します。
- 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
という名前の展開を作成します。
- kubectl create deployment hello-node --image=docommunity/hello-node:1.0
次の出力が表示されます。
Outputdeployment.apps/hello-node created
get pod
コマンドを使用して、デプロイが行われ、アプリがクラスター上で実行されていることを確認します。
- kubectl get pod
出力には、READY
ステータスの1/1
が表示されます。
OutputNAME READY STATUS RESTARTS AGE
hello-node-86b49779bf-9zqvn 1/1 Running 0 11s
expose deployment
コマンドを使用して、アプリケーションをポート9001
で使用できるようにします。
- kubectl expose deployment hello-node --type=LoadBalancer --port=9001
出力は次のようになります。
Outputservice/hello-node exposed
kubectl get svc
コマンドを使用して、ロードバランサーが実行されていることを確認します。
- kubectl get svc
出力は次のようになり、独自のIPアドレスが使用されます。
OutputNAME 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
を使用してロードバランサーにアクセスし、アプリケーションが実行されていることを確認します。
- curl <ip-address>:9001
ロードバランサーを実行していない場合は、curl
を使用してサービスに直接アクセスできます。
- curl <servicename>.<namespace>:9001
出力は次のようになります。
OutputHello, Node!
次に、telepresence connect
コマンドを使用して、Telepresenceをクラスターに接続します。
- telepresence connect
これにより、すべてのリモートサービスにローカルであるかのようにアクセスできるため、次の名前でサービスにアクセスできます。
- curl hello-node.default:9001
IPを介してサービスにアクセスしたときと同じ応答を受け取ります。
OutputHello, Node!
サービスはクラスター上で稼働しており、リモートでアクセスできます。 hello-node.js
アプリに変更を加える場合は、次の手順を実行する必要があります。
- アプリを変更します。
- コンテナイメージを再構築します。
- コンテナレジストリにプッシュします。
- Kubernetesにデプロイします。
それは多くのステップです。 ツール( Skaffold などの自動パイプライン)を使用して、手作業を減らすことができます。 ただし、手順自体をバイパスすることはできません。
次に、hello-node app
の別のバージョンをビルドし、Telepresenceを使用して、コンテナーイメージをビルドしたり、レジストリにプッシュしたり、Kubernetesにデプロイしたりせずにテストします。
ステップ3—新しいバージョンのサービスをローカルで実行する
この手順では、ローカルマシン上の既存のhello-node
アプリケーションを変更します。 次に、テレプレゼンスを使用して、テレプレゼンスインターセプトを使用してトラフィックをローカルバージョンにルーティングします。 インターセプトは、クラスター向けのトラフィックを取得し、それをローカルバージョンのサービスに再ルーティングするため、開発環境での作業を継続できます。
サンプルアプリケーションの変更バージョンを含む新しいファイルを作成します。
- nano 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でサービスを開始します。
- node hello-node-v2.js
サービスを実行したままにして、新しいターミナルウィンドウを開き、サービスにアクセスします。
- curl localhost:9001
出力は次のようになります。
OutputHello, Node V2!
ただし、このサービスはローカルでのみ実行されます。 リモートサーバーにアクセスしようとすると、現在hello-node
のバージョン1が実行されています。 これを修正するには、インターセプトを有効にして、クラスター内のhello-node
サービスに向かうすべてのトラフィックをローカルバージョンのサービスにルーティングします。
intercept
コマンドを使用して、インターセプトを設定します。
- telepresence intercept hello-node --port 9001
出力は次のようになります。
OutputUsing 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
コマンドを使用して、インターセプトが正しく設定されていることを確認します。
- telepresence status
出力は次のようになります。
OutputRoot 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
を使用してリモートサービスにアクセスします。
- curl hello-node.default:9001
出力は次のようになります。
OutputHello, Node V2!
これで、クラスター上のサービスに送信されたメッセージはすべてローカルサービスにリダイレクトされます。 これは、コードへの個々の変更ごとにデプロイメントループ(ビルド、プッシュ、デプロイ)を回避できるため、開発段階で役立ちます。
結論
このチュートリアルでは、ローカルマシンにTelepresenceをインストールし、変更を加えるたびにKubernetesにデプロイすることなく、ローカル環境でコードを変更する方法を示しました。 Telepresenceに関するその他のチュートリアルと情報については、Telepresenceのドキュメントを参照してください。