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
次のコードを新しいファイルに追加します。
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のドキュメントを参照してください。