マイクロサービスアーキテクチャでは、マイクロサービス呼び出し中に複数のマイクロサービスアプリケーションに変更を加える必要がある場合があります。ほとんどの場合、カナリートラフィックを受信するために、各マイクロサービスアプリケーションにカナリー環境またはグループがデプロイされます。アップストリームアプリケーションのカナリー環境からダウンストリームアプリケーションのカナリー環境にトラフィックを流すには、リクエストがカナリー環境を通過するようにする必要があります。この場合、マイクロサービス呼び出しプロセスに含まれる一部のマイクロサービスアプリケーションにそれぞれのカナリー環境がない場合でも、リクエストはダウンストリームアプリケーションのカナリー環境にルーティングできます。Alibaba Cloud Application Load Balancer(ALB)イングレスゲートウェイが提供する柔軟なルーティング機能と、Microservices Engine(MSE)が提供するエンドツーエンドカナリーリリース機能を使用することで、ビジネスコードを変更することなく、前述の要件を満たすことができます。
実装プロセス
注意事項
Flannel ネットワークプラグインを使用する場合、ALBイングレスゲートウェイのバックエンドサービスは NodePort または LoadBalancer タイプである必要があります。
ALBイングレスゲートウェイの vSwitch は、ACK クラスタと同じ仮想プライベートクラウド(VPC)にデプロイする必要があります。 ALBイングレスゲートウェイでサポートされているリージョンについては、サポートされているリージョンとゾーン をご参照ください。
サンプルシナリオ:ドメイン名ベースのルーティングを使用してエンドツーエンドカナリーリリースを実装する
この例では、アプリケーションアーキテクチャは ALBイングレスゲートウェイと Spring Cloud で構成されています。 Spring Cloud はバックエンドマイクロサービスアーキテクチャです。バックエンドサービスの呼び出しには、トランザクションセンター(アプリケーション A)、商品センター(アプリケーション B)、在庫センター(アプリケーション C)の 3 つのアプリケーションが関係します。クライアントベースまたは HTML ベースのバックエンドサービスへのアクセスがサポートされています。アプリケーション間のサービスディスカバリには Nacos インスタンスが使用されます。
オンラインベース環境とカナリー環境を区別するために、異なるドメイン名を使用できます。カナリー環境には、個別にドメイン名を設定できます。たとえば、www.example.com 宛てのリクエストはカナリー環境にルーティングされ、www.aliyundoc.com 宛てのリクエストはベース環境にルーティングされます。
次の図は、サービス呼び出しプロセスを示しています。サービス呼び出しは、ALBイングレスゲートウェイ > アプリケーション A > アプリケーション B > アプリケーション C の順に開始されます。アプリケーション A は Spring Boot アプリケーションにすることができます。

準備
ACK クラスタを作成する
Kubernetes バージョンが V1.18 以降の ACK クラスタを作成します。詳細については、ACK マネージドクラスタの作成 または ACK 専用クラスタの作成 をご参照ください。
kubectl を使用して ACK クラスタに接続する
kubectl を使用して ACK クラスタに接続します。詳細については、クラスタの kubeconfig ファイルを取得し、kubectl を使用してクラスタに接続する をご参照ください。
ALB Ingress Controller コンポーネントをインストールする
次のいずれかの方法を使用して、ACK クラスタに ALB Ingress Controller コンポーネントをインストールします。
ACK クラスタを作成するときに、[ALB Ingress] [ingress] の [コンポーネント設定] 手順で ALB Ingress Controller コンポーネントをクラスタにインストールします。
既存の ACK クラスタの場合、[アドオン] ページで ALB Ingress Controller コンポーネントをインストールできます。詳細については、コンポーネントの管理 をご参照ください。
アプリケーションに対して MSE マイクロサービスガバナンスを有効にする
マイクロサービスガバナンス タブで、マイクロサービスガバナンスプロフェッショナル版をアクティブにします。
マイクロサービスガバナンスの請求については、請求の概要 をご参照ください。
Container Service for Kubernetes(ACK)クラスタ内のマイクロサービスアプリケーションに対してマイクロサービスガバナンスを有効にします。ビジネス要件に基づいて適切な方法を選択できます。詳細については、ACK または ACS クラスタ内の Java マイクロサービスアプリケーションに対してマイクロサービスガバナンスを有効にする をご参照ください。
ACK 名前空間内のアプリケーションに対してマイクロサービスガバナンスを有効にする
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。
Application list ページで、ACK Application Access をクリックします。
ACK Application Access ダイアログボックスで、パラメータを設定し、OK をクリックします。

パラメータ
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明クラスタに MSE を呼び出す権限を付与していない場合は、リンク をクリックして承認を行う必要があります。
Cluster Name/ID
マイクロサービスガバナンスを有効にするクラスタの名前または ID を選択します。キーワードを使用してクラスタ名または ID を検索できます。
[ack-onepilot]
[ack-onepilot] コンポーネントのステータスを表示します。
[ack-onepilot] コンポーネントがインストールされていない場合は、[ack-onepilot] の右側にある Click Install をクリックします。インストールが完了すると、ack-onepilot コンポーネントのステータスは [インストール済み] と表示されます。
RAM ユーザーとして操作を実行し、操作を実行する権限がないことを示すメッセージが表示された場合は、ACK コンソール にログインして目的のクラスタにアクセスし、[操作] > [アドオン] を選択します。次に、[ack-onepilot] を見つけて [インストール] をクリックします。
説明この手順では、[ack-onepilot] コンポーネントが関係します。ACK コンソール にログインして目的のクラスタにアクセスし、[操作] > [アドオン] を選択して、コンポーネントの詳細を表示できます。
[ack-onepilot] コンポーネントがインストールされると、エージェントが自動的に挿入されます。この場合、アプリケーションの起動時間が最大 10 秒長くなる可能性があります。
Access Type
[名前空間アクセス] を選択します。
ACK Cluster Namespace
ACK クラスタ名前空間を選択します。
Microservices Governance Namespace
マイクロサービスガバナンス名前空間を選択します。次に、既存のアプリケーションを再デプロイするか、関連するマイクロサービス名前空間にアプリケーションを作成します。これにより、アプリケーションに対してマイクロサービスガバナンスが有効になります。
アプリケーションに対してマイクロサービスガバナンスを有効にする
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Microservices Governance > Application Governance を選択します。
Application list ページで、ACK Application Access をクリックします。
ACK Application Access ダイアログボックスで、パラメータを設定し、OK をクリックします。

パラメータ
説明
Cluster type
ACK Cluster、ACK Serverless Cluster、または ACS Cluster を選択します。
説明クラスタに MSE を呼び出す権限を付与していない場合は、リンク をクリックして承認を行う必要があります。
Cluster Name/ID
マイクロサービスガバナンスを有効にするクラスタの名前または ID を選択します。キーワードを使用してクラスタ名または ID を検索できます。
[ack-onepilot]
[ack-onepilot] コンポーネントのステータスを表示します。
[ack-onepilot] コンポーネントがインストールされていない場合は、[ack-onepilot] の右側にある Click Install をクリックします。インストールが完了すると、ack-onepilot コンポーネントのステータスは [インストール済み] と表示されます。
RAM ユーザーとして操作を実行し、操作を実行する権限がないことを示すメッセージが表示された場合は、ACK コンソール にログインして目的のクラスタにアクセスし、[操作] > [アドオン] を選択します。次に、[ack-onepilot] を見つけて [インストール] をクリックします。
説明この手順では、[ack-onepilot] コンポーネントが関係します。ACK コンソール にログインして目的のクラスタにアクセスし、[操作] > [アドオン] を選択して、コンポーネントの詳細を表示できます。
[ack-onepilot] コンポーネントがインストールされると、エージェントが自動的に挿入されます。この場合、アプリケーションの起動時間が最大 10 秒長くなる可能性があります。
Access Type
Single Application Access を選択します。
Access Procedure
次の手順を実行します。
Step 1: Go to the ACK console, and click the cluster name. In the left-side navigation pane of the page that appears, choose Workloads > Deployments. Then, select the namespace to which the application belongs.
Step 2: Click the name of the connected application. On the page that appears, click View in YAML.
Step 3: Edit the labels field in the following format and click Update.
spec: template: metadata: labels: # on 値は、マイクロサービスガバナンスが有効になっていることを示します。 on 値は{ "error": { "code": 500, "message": "Internal error encountered.", "status": "INTERNAL" } } 二重引用符(")で囲む必要があります。 msePilotAutoEnable: "on" # アプリケーションが存在する MSE マイクロサービス名前空間。指定した名前空間が存在しない場合は、指定した名前の名前空間が自動的に作成されます。 mseNamespace: 202401 # マイクロサービスガバナンスが有効になっているアプリケーションの実際の名前。名前は二重引用符(")で囲む必要があります。 msePilotCreateAppName: "your-deployment-name"
デモアプリケーションをデプロイする
ACK コンソール にログインします。左側のナビゲーションペインで、[クラスタ] をクリックします。
[クラスタ] ページで、管理するクラスタを見つけて名前をクリックします。左側のペインで、 を選択します。
[デプロイメント] ページで、名前空間を選択し、[YAML から作成] をクリックします。次に、パラメータを設定し、[作成] をクリックします。
この例では、アプリケーション A、B、および C がデプロイされています。各アプリケーションの基本バージョンとカナリーバージョンがデプロイされます。サービスディスカバリを実装するために、nacos-server という名前のアプリケーションがデプロイされます。
# アプリケーション A のベースバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a spec: replicas: 2 selector: matchLabels: app: spring-cloud-a template: metadata: labels: msePilotCreateAppName: spring-cloud-a app: spring-cloud-a spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1 imagePullPolicy: Always name: spring-cloud-a ports: - containerPort: 20001 livenessProbe: tcpSocket: port: 20001 initialDelaySeconds: 10 periodSeconds: 30 # アプリケーション A のカナリーバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-a-new spec: replicas: 2 selector: matchLabels: app: spring-cloud-a-new strategy: template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-a app: spring-cloud-a-new spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre - name: profiler.micro.service.tag.trace.enable value: "true" image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-a:3.0.1 imagePullPolicy: Always name: spring-cloud-a-new ports: - containerPort: 20001 livenessProbe: tcpSocket: port: 20001 initialDelaySeconds: 10 periodSeconds: 30 # アプリケーション B のベースバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-b spec: replicas: 2 selector: matchLabels: app: spring-cloud-b strategy: template: metadata: labels: msePilotCreateAppName: spring-cloud-b app: spring-cloud-b spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1 imagePullPolicy: Always name: spring-cloud-b ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20002 initialDelaySeconds: 10 periodSeconds: 30 # アプリケーション B のカナリーバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-b-new spec: replicas: 2 selector: matchLabels: app: spring-cloud-b-new template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-b app: spring-cloud-b-new spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-b:3.0.1 imagePullPolicy: Always name: spring-cloud-b-new ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20002 initialDelaySeconds: 10 periodSeconds: 30 # アプリケーション C のベースバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c spec: replicas: 2 selector: matchLabels: app: spring-cloud-c template: metadata: labels: msePilotCreateAppName: spring-cloud-c app: spring-cloud-c spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1 imagePullPolicy: Always name: spring-cloud-c ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20003 initialDelaySeconds: 10 periodSeconds: 30 # アプリケーション C のカナリーバージョンの YAML コード --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-cloud-c-new spec: replicas: 2 selector: matchLabels: app: spring-cloud-c-new template: metadata: labels: alicloud.service.tag: gray msePilotCreateAppName: spring-cloud-c app: spring-cloud-c-new spec: containers: - env: - name: JAVA_HOME value: /usr/lib/jvm/java-1.8-openjdk/jre image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/spring-cloud-c:3.0.1 imagePullPolicy: IfNotPresent name: spring-cloud-c-new ports: - containerPort: 8080 livenessProbe: tcpSocket: port: 20003 initialDelaySeconds: 10 periodSeconds: 30 # Nacos Server --- apiVersion: apps/v1 kind: Deployment metadata: name: nacos-server spec: replicas: 1 selector: matchLabels: app: nacos-server template: metadata: labels: app: nacos-server spec: containers: - env: - name: MODE value: standalone image: registry.cn-hangzhou.aliyuncs.com/mse-governance-demo/nacos-server:v2.1.2 imagePullPolicy: Always name: nacos-server dnsPolicy: ClusterFirst restartPolicy: Always # nacos-server サービスの YAML コード --- apiVersion: v1 kind: Service metadata: name: nacos-server spec: ports: - port: 8848 protocol: TCP targetPort: 8848 selector: app: nacos-server type: ClusterIP
ネットワーク設定を行う
イングレスアプリケーションとして機能するアプリケーション A に対して、2 つの Kubernetes サービス spring-cloud-a-base と spring-cloud-a-gray を設定します。 spring-cloud-a-base サービスはアプリケーション A のベースバージョンに対応します。 spring-cloud-a-gray サービスはアプリケーション A のカナリーバージョンに対応します。
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-base
spec:
ports:
- name: http
nodePort: 32605
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a
sessionAffinity: None
type: NodePort
---
apiVersion: v1
kind: Service
metadata:
name: spring-cloud-a-gray
spec:
ports:
- name: http
nodePort: 31622
port: 20001
protocol: TCP
targetPort: 20001
selector:
app: spring-cloud-a-new
sessionAffinity: None
type: NodePort手順 1:ALBイングレスゲートウェイのルートを設定する
AlbConfig オブジェクトを作成します。詳細については、AlbConfig オブジェクトの作成 をご参照ください。
重要ALBイングレスゲートウェイの vSwitch がクラスタと同じ VPC にデプロイされていることを確認する必要があります。そうでないと、ビジネスに悪影響を及ぼします。
Ingress を設定します。
次の内容を gray-ingress.yaml ファイルにコピーします。
V1.19 より前の Kubernetes バージョンを実行しているクラスタ
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo namespace: default spec: ingressClassName: alb rules: - host: www.aliyundoc.com http: paths: - path: /a backend: serviceName: spring-clud-a-base servicePort: 20001 - host: www.example.com http: paths: - backend: serviceName: spring-cloud-a-gray servicePort: 20001 path: /a pathType: ImplementationSpecificKubernetes V1.19 以降を実行しているクラスタ
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb rules: - host: www.aliyundoc.com http: paths: # コンテキストパスを指定します。 - path: /a pathType: ImplementationSpecific backend: service: name: spring-clud-a-base port: number: 20001 - host: www.example.com http: paths: # コンテキストパスを指定します。 - path: /a pathType: ImplementationSpecific backend: service: name: spring-clud-a-base-gray port: number: 20001
次のコマンドを実行します。
kubectl apply -f gray-ingress.yaml
出力の ADDRESS に情報が表示されない場合は、次のページに移動してイベントを表示し、このトピックの「準備」セクションに基づいて問題のトラブルシューティングを行います。
手順 2:MSE コンソールでエンドツーエンドカナリーリリース機能を設定する
MSE コンソール にログインし、上部のナビゲーションバーでリージョンを選択します。
左側のナビゲーションペインで、Microservices Governance > Full link grayscale を選択します。
[レーン グループとレーンを作成します。] をクリックします。選択したマイクロサービス スペースにレーン グループが既に作成されている場合は、[+ レーン グループを作成] をクリックします。
[レーン グループの作成] パネルで、パラメータを設定し、[OK] をクリックします。
spring-cloud-a、spring-cloud-b、および spring-cloud-c アプリケーションをレーン グループに追加します。
[フルリンクグレースケール] ページの下部にある [最初の分割レーンの作成] をクリックします。[レーンの作成] パネルで、パラメータを設定し、[gray] タグを選択して、[OK] をクリックします。
手順 3:結果を確認する
www.aliyundoc.com宛てのリクエストをアプリケーションのベースバージョンにルーティングします。# テストコマンド curl -H"Host:aliyundoc.base.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a # テスト結果 A[172.18.XX.XX] -> B[172.18.XX.XX] -> C[172.18.XX.XX]%www.example.com宛てのリクエストをアプリケーションのカナリーバージョンにルーティングします。# テストコマンド curl -H"Host:www.example.com" http://alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com/a # テスト結果 Agray[172.18.XX.XX] -> Bgray[172.18.XX.XX] -> Cgray[172.18.XX.XX]%
上記のコマンドで、alb-828vagckg5omzfy49n.cn-beijing.alb.aliyuncs.com は ALBイングレスゲートウェイのエンドポイントを示します。