KT-Connect(「KT」は「Kubernetes Toolkit」の略)は、Kubernetes 開発環境での作業をより効率的に行うためのユーティリティツールです。 KT-Connect プロキシは、Alibaba Cloud Service Mesh(ASM)コンソールのトラフィック管理機能を使用して、ローカル アプリケーションをデバッグし、ローカル開発とテストを高速化できます。 このトピックでは、KT-Connect と ASM を使用してローカル開発とテストを実装する方法について説明します。
背景
KtConnect は、開発者が Kubernetes クラスタでの開発プロセスを簡素化できるように設計されたオープンソースツールです。 特定のサービス宛てのトラフィックをローカル アプリケーションにリダイレクトするプロキシ ポッドを Kubernetes クラスタにデプロイできます。 これにより、ローカル環境と Kubernetes クラスタ間の相互アクセスが可能になります。 KT-Connect の主な機能は次のとおりです。
ローカル アプリケーションから Kubernetes クラスタへのアクセスをサポートします。
KT-Connect を使用すると、モードを変更することなく、ローカル アプリケーションからすべてのクラスタ リソースにアクセスできます。
Kubernetes サービスの内部ドメイン名のローカル解決をサポートします。
サービス名をサービスが存在するクラスタの IP アドレスに直接解決し、ローカル開発に真のクラウドネイティブ エクスペリエンスを提供します。
クラスタ サービスに指定されたトラフィックをローカル環境のサービスにリダイレクトすることをサポートします。
クラスタ内の指定されたサービスへのリクエストをローカル アプリケーションにルーティングすることで、すべてのローカル アプリケーションにクラスタ サービスから直接アクセスできます。
干渉なしに複数のユーザー間でテスト環境でのコラボレーションをサポートします。
環境の可用性に影響を与えることなく、指定されたリクエストのみをローカル アプリケーションにリダイレクトするようにルーティングルールを設定できます。
Windows / MacOS / Linux 開発環境をサポートします。
同じ使用方法の複数のオペレーティングシステムにより、開発者は Kubernetes クラスタ サービスにアクセスできます。
前提条件
イングレス ゲートウェイがデプロイされていること。 詳細については、「イングレス ゲートウェイを作成する」をご参照ください。
ASM インスタンスに追加されたクラスタにアプリケーションがデプロイされていること。 詳細については、「ASM インスタンスに追加された ACK クラスタにアプリケーションをデプロイする」をご参照ください。
準備
この例では、次のシナリオを示します。
クラスタに helloworld アプリケーション v1 をデプロイし、アプリケーションのトラフィックポリシーを設定します。
Docker を使用してローカル環境に helloworld アプリケーション v2 をデプロイします。 ktctl コマンドを実行して、クラスタにプロキシ ポッドをデプロイし、ローカル環境からクラスタへの接続を有効にします。
リクエスト ヘッダーに基づいて、クラスタ内のアプリケーション v1 とローカル環境内のアプリケーション v2 にトラフィックをルーティングするようにルーティング ポリシーを更新します。
ktctl をインストールして設定します。
クラスタに名前空間を作成します。
kubectl create ns mesh-demo
名前空間の自動サイドカー インジェクションを有効にします。
kubectl label ns mesh-demo istio-injection=enabled
手順
手順 1:アプリケーションをデプロイし、ルーティング ポリシーを設定する
mesh-demo
名前空間にアプリケーションをデプロイします。kubectl apply -f - <<EOF apiVersion: apps/v1 kind: Deployment metadata: name: helloworld labels: app: helloworld version: v1 stage: online spec: replicas: 1 selector: matchLabels: app: helloworld version: v1 stage: online template: metadata: labels: app: helloworld version: v1 stage: online spec: containers: - name: helloworld env: - name: PODIP valueFrom: fieldRef: fieldPath: status.podIP - name: STAGE valueFrom: fieldRef: fieldPath: metadata.labels['stage'] - name: VERSION valueFrom: fieldRef: fieldPath: metadata.labels['version'] command: ["/http-echo"] args: - "-text" - "Welcome to helloworld stage: $(STAGE), version: $(VERSION), ip: $(PODIP)" image: registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-http-echo:1.0 imagePullPolicy: IfNotPresent ports: - containerPort: 5678 --- apiVersion: v1 kind: Service metadata: name: helloworld labels: app: helloworld service: helloworld spec: ports: - port: 8000 name: http targetPort: 5678 selector: app: helloworld EOF
ルーティング ポリシーをデプロイします。
kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: Gateway metadata: name: helloworld-gateway spec: selector: istio: ingressgateway servers: - hosts: - 'helloworld.mesh.com' port: name: http number: 80 protocol: HTTP --- apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: helloworld spec: host: helloworld subsets: - name: v1 labels: version: v1 --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: helloworld spec: gateways: - helloworld-gateway hosts: - helloworld.mesh.com http: - route: - destination: host: helloworld subset: v1 EOF
ポリシーが有効になっているかどうかを確認します。
export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}') curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com'
期待される出力:
Welcome to helloworld stage: online, version: v1, ip: 172.23.16.246
出力は、
stage
がonline
で、version
がv1
であることを示しており、これは想定どおりです。
手順 2:ローカル開発環境をデプロイする
Docker を使用して helloworld アプリケーション v2 をデプロイします。
docker run -itd --rm \ --name local-container \ -p 5678:5678 \ registry-cn-hangzhou.ack.aliyuncs.com/ack-demo/asm-http-echo:1.0 \ -text "Welcome to helloworld stage: local, version: v2, ip: 127.0.0.1"
クラスタに KT-Connect プロキシをデプロイします。 これにより、
version=hzall
ラベルが付いたプロキシ ポッドがmesh-demo
名前空間にデプロイされます。ktctl -n mesh-demo mesh helloworld --expose 5678 --mode manual
期待される出力:
4:22PM INF Using cluster context cluster-4KvcBF (kubernetes) 4:22PM INF KtConnect 0.3.7 start at 59150 (darwin amd64) 4:22PM INF Fetching cluster time ... 4:22PM INF Using manual mode 4:22PM INF Successful create config map helloworld-kt-mesh-hzall 4:22PM INF Deploying shadow pod helloworld-kt-mesh-hzall in namespace mesh-demo 4:22PM INF Waiting for pod helloworld-kt-mesh-hzall ... 4:22PM INF Waiting for pod helloworld-kt-mesh-hzall ... 4:22PM INF Pod helloworld-kt-mesh-hzall is ready 4:22PM INF Forwarding pod helloworld-kt-mesh-hzall to local via port 5678 4:22PM INF Port forward local:17982 -> pod helloworld-kt-mesh-hzall:22 established 4:22PM INF Reverse tunnel 0.0.0.0:5678 -> 127.0.0.1:5678 established 4:22PM INF --------------------------------------------------------- 4:22PM INF Now you can update Istio rule by label 'version=hzall' 4:22PM INF ---------------------------------------------------------
プロキシ ポッドを表示します。
kubectl get pod -n mesh-demo
期待される出力:
NAME READY STATUS RESTARTS AGE helloworld-5cbdxxxxx-xxxxx 2/2 Running 0 116m helloworld-kt-mesh-hzall 2/2 Running 0 106m
ここで、
helloworld-kt-mesh-hzall
はデプロイされたプロキシ ポッドです。
手順 3:ルーティング ポリシーを更新し、接続を確認する
ルーティング ポリシーを更新します。
x-env=local
リクエスト ヘッダーを持つリクエストをローカル環境の helloworld アプリケーション v2 に転送し、その他すべてのリクエストをクラスタの helloworld アプリケーション v2 に転送します。kubectl apply -f - <<EOF apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: helloworld spec: host: helloworld subsets: - name: v1 labels: version: v1 - name: local labels: version: hzall --- apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: helloworld spec: gateways: - helloworld-gateway hosts: - helloworld.mesh.com http: - match: - headers: x-env: exact: local route: - destination: host: helloworld subset: local - route: - destination: host: helloworld subset: v1 EOF
ローカル アプリケーションにアクセスします。
curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com' -H 'x-env: local'
期待される出力:
Welcome to helloworld stage: local, version: v2, ip: 127.0.0.1
出力は、
stage
がlocal
で、version
がv2
であることを示しています。 これは、ローカル環境とクラスタのサービス間の双方向接続が正常に設定され、ローカル サービスにクラスタからアクセスできることを示しています。クラスタ内のアプリケーションにアクセスします。
curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com'
期待される出力:
Welcome to helloworld stage: online, version: v1, ip: 172.23.16.246
(オプション)手順 4:環境をクリーンアップする
作成したクラスタのテスト リソースを削除します。
kubectl delete ns mesh-demo
ローカル アプリケーションを停止します。
docker stop local-container