Ubuntu20.04での迅速な開発のためにKubernetesでテレプレゼンスを使用する方法
著者は、 Write forDOnationsプログラムの一環として寄付を受け取るためにTechEducationFundを選択しました。
序章
Kubernetesでマイクロサービスを構築するアプリケーション開発者は、多くの場合、速度を低下させる2つの大きな問題に遭遇します。
- フィードバックループが遅い。 コードを変更したら、テストするためにKubernetesにデプロイする必要があります。 これには、コンテナのビルド、コンテナレジストリへのプッシュ、Kubernetesへのデプロイが必要です。 これにより、すべてのコード反復に数分が追加されます。
- ローカルのメモリとCPUが不足しています。 開発者は、 minikube または同等のものを使用してローカルでKubernetesを実行することにより、フィードバックループを高速化しようとします。 ただし、リソースを大量に消費するアプリケーションは、ローカルで使用可能なコンピューティングとメモリをすぐに超えます。
Telepresence は、Kubernetesでの高速で効率的な開発のためのCloud-NativeComputingFoundationプロジェクトです。 Telepresenceを使用すると、サービスをローカルで実行し、残りのアプリケーションをクラウドで実行します。 Telepresenceは、Kubernetesクラスターとローカルワークステーションの間に双方向ネットワーク接続を作成します。 このようにして、ローカルで実行しているサービスはクラスター内のサービスと通信でき、その逆も可能です。 これにより、クラスターのコンピューティングリソースとメモリリソースを使用できますが、変更ごとに完全な展開サイクルを実行する必要はありません。
このチュートリアルでは、Ubuntu 20.04を実行しているローカルマシンで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
Linux用の最新のバイナリ(約50 MB)をダウンロードするには:
- sudo curl -fL https://app.getambassador.io/download/tel2/linux/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
...
Connected to context default (https://<cluster public IP>)
Telepresenceが接続しない場合は、 kubectl
構成。
テレプレゼンスが正しく機能していることを確認するには、KubernetesAPIサーバーに接続します。 status
指図:
- 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
:
- 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を使用している場合、外部IP値は LoadBalancer
として表示されます <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 <ip_address>:9001
出力は次のようになります。
OutputHello, Node V2!
ただし、このサービスはローカルでのみ実行されます。 リモートサーバーにアクセスしようとすると、現在バージョン1が実行されています。 hello-node
. これを修正するには、インターセプトを有効にして、 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.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
以前と同じように:
- curl <ip-address>:9001
出力は次のようになります。
OutputHello, Node V2!
これで、クラスター上のサービスに送信されたメッセージはすべてローカルサービスにリダイレクトされます。 これは、コードへの個々の変更ごとにデプロイメントループ(ビルド、プッシュ、デプロイ)を回避できるため、開発段階で役立ちます。
結論
このチュートリアルでは、ローカルマシンにTelepresenceをインストールし、変更を加えるたびにKubernetesにデプロイすることなく、ローカル環境でコードを変更する方法を示しました。 Telepresenceに関するその他のチュートリアルと情報については、Telepresenceのドキュメントを参照してください。