すべてのプロダクト
Search
ドキュメントセンター

Alibaba Cloud Service Mesh:KT-Connect と ASM を使用したローカル開発とテストの実装

最終更新日:Apr 30, 2025

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 クラスタ サービスにアクセスできます。

前提条件

準備

この例では、次のシナリオを示します。

  • クラスタに helloworld アプリケーション v1 をデプロイし、アプリケーションのトラフィックポリシーを設定します。

  • Docker を使用してローカル環境に helloworld アプリケーション v2 をデプロイします。 ktctl コマンドを実行して、クラスタにプロキシ ポッドをデプロイし、ローカル環境からクラスタへの接続を有効にします。

  • リクエスト ヘッダーに基づいて、クラスタ内のアプリケーション v1 とローカル環境内のアプリケーション v2 にトラフィックをルーティングするようにルーティング ポリシーを更新します。

  1. ktctl をインストールして設定します。

  2. クラスタに名前空間を作成します。

    kubectl create ns mesh-demo
  3. 名前空間の自動サイドカー インジェクションを有効にします。

    kubectl label ns mesh-demo istio-injection=enabled

手順

手順 1:アプリケーションをデプロイし、ルーティング ポリシーを設定する

  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
  2. ルーティング ポリシーをデプロイします。

    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
  3. ポリシーが有効になっているかどうかを確認します。

    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

    出力は、stageonline で、versionv1 であることを示しており、これは想定どおりです。

手順 2:ローカル開発環境をデプロイする

  1. 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"
  2. クラスタに 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 ---------------------------------------------------------
  3. プロキシ ポッドを表示します。

    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:ルーティング ポリシーを更新し、接続を確認する

  1. ルーティング ポリシーを更新します。 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
  2. ローカル アプリケーションにアクセスします。

    curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com' -H 'x-env: local'

    期待される出力:

    Welcome to helloworld stage: local, version: v2, ip: 127.0.0.1

    出力は、stagelocal で、versionv2 であることを示しています。 これは、ローカル環境とクラスタのサービス間の双方向接続が正常に設定され、ローカル サービスにクラスタからアクセスできることを示しています。

  3. クラスタ内のアプリケーションにアクセスします。

    curl ${INGRESS_HOST} -H 'host: helloworld.mesh.com'

    期待される出力:

    Welcome to helloworld stage: online, version: v1, ip: 172.23.16.246

(オプション)手順 4:環境をクリーンアップする

  1. 作成したクラスタのテスト リソースを削除します。

    kubectl delete ns mesh-demo
  2. ローカル アプリケーションを停止します。

    docker stop local-container