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

Container Service for Kubernetes:ASM を使用してマルチクラスタトラフィック管理を有効にする

最終更新日:May 07, 2025

Distributed Cloud Container Platform for Kubernetes(ACK One)でサービスメッシュ(ASM)を有効にし、ACK One をマルチクラスタアプリケーションの配布とトラフィック管理のためのワンストッププラットフォームとして使用できます。このトピックでは、ACK One の Fleet インスタンスを使用して、マルチクラスタアプリケーションの配布とトラフィック管理を実装する方法について説明します。

前提条件

背景情報

次の例は、Fleet インスタンスを使用して Rollouts アプリケーションを関連付けられたクラスタに配布し、トラフィック分散ルールを構成して異なるアプリケーションバージョンへのトラフィックを管理する方法を示しています。アプリケーションを複数の関連付けられたクラスタに配布する方法の詳細については、「アプリケーションの配布」をご参照ください。

次の図は、例を示しています。

  • 次の図の丸で囲まれた番号 1 でマークされた接続は、デプロイメント、サービス、ConfigMap などの Kubernetes リソースを関連付けられたクラスタに配布できることを示しています。

  • 次の図の丸で囲まれた番号 2 でマークされた接続は、トラフィック分散ルールを構成して、関連付けられたクラスタへのトラフィックを管理できることを示しています。Service Meshインスタンスの kubeconfig ファイルを使用する必要はありません。次のトラフィック分散ルールがサポートされています。

    • Destinationrules

    • Envoyfilters

    • Gateways

    • Serviceentries

    • Sidecars

    • Virtualservices

    • Workloadentries

    • Workloadgroups

  • 次の図の丸で囲まれた番号 3 でマークされた接続は、ゲートウェイの IP アドレスを使用してアプリケーションにアクセスできることを示しています。リクエストは、トラフィック分散ルールに基づいて転送されます。

手順

ステップ 1: アプリケーションを作成する

  1. 次のコマンドを実行して、デフォルトの名前空間に対して自動サイドカーインジェクションを有効にします。

    kubectl label namespace default istio-injection=enabled
  2. podinfo-meta.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、アプリケーションのデプロイに必要な Kubernetes リソースを定義します。

    podinfo-meta.yaml ファイルを表示する

    apiVersion: v1
    kind: Service
    metadata:
      name: podinfo
      labels:
        app: podinfo
        service: podinfo
    spec:
      selector:
        app: podinfo
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: podinfo-green
      labels:
        app: podinfo
        version: green
    spec:
      replicas: 4
      minReadySeconds: 5
      revisionHistoryLimit: 5
      progressDeadlineSeconds: 60
      strategy:
        rollingUpdate:
          maxUnavailable: 1
        type: RollingUpdate
      selector:
        matchLabels:
          app: podinfo
          version: green
      template:
        metadata:
          labels:
            app: podinfo
            version: green
        spec:
          containers:
            - name: podinfod
              image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:green
              imagePullPolicy: IfNotPresent
              ports:
                - name: http
                  containerPort: 8080
                  protocol: TCP
              readinessProbe:
                tcpSocket:
                  port: 8080
                initialDelaySeconds: 5
                timeoutSeconds: 5
    
    
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: podinfo-blue
      labels:
        app: podinfo
        version: blue
    spec:
      replicas: 4
      minReadySeconds: 5
      revisionHistoryLimit: 5
      progressDeadlineSeconds: 60
      strategy:
        rollingUpdate:
          maxUnavailable: 1
        type: RollingUpdate
      selector:
        matchLabels:
          app: podinfo
          version: blue
      template:
        metadata:
          labels:
            app: podinfo
            version: blue
        spec:
          containers:
            - name: podinfod
              image: registry.cn-hangzhou.aliyuncs.com/acs/rollouts-demo:blue
              imagePullPolicy: IfNotPresent
              ports:
                - name: http
                  containerPort: 8080
                  protocol: TCP
              readinessProbe:
                tcpSocket:
                  port: 8080
                initialDelaySeconds: 5
                timeoutSeconds: 5
  3. 次のコマンドを実行して、Fleet インスタンスにリソースを作成します。

    kubectl apply -f podinfo-meta.yaml
    
  4. 次のコマンドを実行して、Fleet インスタンスに関連付けられているクラスタに関する情報をクエリします。

    AMC コマンドラインツールの詳細については、「AMC コマンドラインの使用」をご参照ください。

    kubectl amc get managedclusters

    予期される出力:

    Name                                Alias       HubAccepted
    c5f4110f2ad88499583fc76cc568a****   ack-hy-01   true
    c7f78dd3b09a146b8b750b4c1c51d****   ack-hy-02   true
  5. podinfo-app.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。このファイルは、podinfo という名前のオープンソース KubeVela アプリケーションを定義します。

    次のコードブロックの <clusterid1><clusterid2> を、前のステップで取得したクラスタ ID に置き換えます。

    apiVersion: core.oam.dev/v1beta1
    kind: Application
    metadata:
      name: podinfo
      namespace: default
      annotations:
        app.oam.dev/publishVersion: version1
    spec:
      components:
        - name: podinfo
          type: ref-objects
          properties:
            objects:
              - apiVersion: apps/v1
                kind: Deployment
                name: podinfo-blue
              - apiVersion: apps/v1
                kind: Deployment
                name: podinfo-green
              - apiVersion: v1
                kind: Service
                name: podinfo
      policies:
        - type: topology
          name: podinfo-clusters
          properties:
            clusters: ["<clusterid1>","<clusterid2>"]  # アプリケーションをデプロイするクラスタの名前を指定します。クラスタ名を追加したり、既存のクラスタ名を変更したりできます。            
  6. 次のコマンドを実行して、podinfo という名前のアプリケーションを Fleet インスタンスにデプロイします。

    kubectl apply -f podinfo-app.yaml

ステップ 2: ゲートウェイルールを構成し、仮想サービスを作成する。

  1. ACK One コンソールにログインし、Service Meshイングレスゲートウェイを作成します。詳細については、「イングレスゲートウェイを作成する」をご参照ください。

  2. podinfo-gateway.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: networking.istio.io/v1alpha3
    kind: Gateway
    metadata:
      name: podinfo-gateway
    spec:
      selector:
        istio: ingressgateway
      servers:
      - port:
          number: 80
          name: http
          protocol: HTTP
        hosts:
        - "*"
  3. 次のコマンドを実行して、Fleet インスタンスに Istio ゲートウェイを作成します。

    kubectl apply -f podinfo-gateway.yaml
  4. virtual-service-all-blue.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: networking.istio.io/v1alpha3
    kind: VirtualService
    metadata:
      name: podinfo
    spec:
      hosts:
      - "*"
      gateways:
      - podinfo-gateway
      http:
      - match:
        - uri:
            prefix: /
        route:
        - destination:
            host: podinfo
            subset: blue
            port:
              number: 80
  5. 次のコマンドを実行して、Fleet インスタンスに仮想サービスを作成します。

    kubectl apply -f virtual-service-all-blue.yaml
  6. destination-rule-all.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

    apiVersion: networking.istio.io/v1alpha3
    kind: DestinationRule
    metadata:
      name: podinfo
    spec:
      host: podinfo
      trafficPolicy:
        outlierDetection:
          baseEjectionTime: 30s
          consecutiveErrors: 7
          interval: 30s
      subsets:
      - name: blue
        labels:
          version: blue
      - name: green
        labels:
          version: green
  7. 次のコマンドを実行して、Fleet インスタンスに宛先ルールを作成します。

    kubectl apply -f destination-rule-all.yaml

ステップ 3: 結果を確認する

  1. 次のコマンドを実行して、ASM ゲートウェイの IP アドレスをクエリします。

    AMC コマンドラインツールの詳細については、「AMC コマンドラインの使用」をご参照ください。

    kubectl amc get svc -n istio-system -m <関連付けられたクラスタの名前>

    予期される出力:

    Run on ManagedCluster c5f4110f2ad88499583fc76cc568a**** (ack-hy-01)
    NAME                     TYPE           CLUSTER-IP      EXTERNAL-IP      PORT(S)                      AGE
    istio-ingressgateway     LoadBalancer   10.12.1**.***   47.113.***.***   80:30315/TCP,443:32***/TCP   47h
    Run on ManagedCluster c7f78dd3b09a146b8b750b4c1c51d**** (ack-hy-02)
    NAME                     TYPE           CLUSTER-IP     EXTERNAL-IP      PORT(S)                      AGE
    istio-ingressgateway     LoadBalancer   10.75.9**.***   47.113.***.***   80:32101/TCP,443:30***/TCP   47h                     
  2. ブラウザのアドレスバーに http://<ASM ゲートウェイの IP アドレス>/ と入力します。

    <ASM ゲートウェイの IP アドレス> を前のステップで取得した EXTERNAL-IP に置き換えます。次の図は、表示される Web ページを示しています。この例では、アプリケーションの blue バージョンにアクセスしています。blue

  3. 仮想サービスを作成して、アプリケーションの異なるバージョンのトラフィック比率を構成します。

    1. virtual-service-green-blue-80-20.yaml という名前のファイルを作成し、次の内容をファイルにコピーします。

      この例では、green バージョンの重みは 80 に設定され、blue バージョンの重みは 20 に設定されています。

      apiVersion: networking.istio.io/v1alpha3
      kind: VirtualService
      metadata:
        name: podinfo
      spec:
        hosts:
        - "*"
        gateways:
        - podinfo-gateway
        http:
        - match:
          - uri:
              prefix: /
          route:
          - destination:
              host: podinfo
              subset: green
              port:
                number: 80
            weight: 80
          - destination:
              host: podinfo
              subset: blue
              port:
                number: 80
            weight: 20
    2. 次のコマンドを実行して、Fleet インスタンスに仮想サービスを作成します。

      kubectl apply -f virtual-service-green-blue-80-20.yaml
  4. ブラウザのアドレスバーに http://<ASM ゲートウェイの IP アドレス>/ と入力します。

    結果は、トラフィックの 80% が green バージョンに転送され、トラフィックの 20% が blue バージョンに転送されることを示しています。blue-green