Kubernetesクラスターでは、レイヤー7 Ingressはカナリアリリース展開でTCPまたはUDPを介してアクセスされるサービスの要件を満たすことができません。 このトピックでは、Classic Load Balancer (CLB) インスタンスを使用してレイヤー4カナリアリリースを実装する方法について説明します。
前提条件
ステップ1: デプロイの作成
ACKコンソールにログインします。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、右上隅の [YAMLから作成] をクリックします。
[サンプルテンプレート] フィールドで、ドロップダウンリストからテンプレートを選択します。 次のテンプレートを [テンプレート] フィールドにコピーし、[作成] をクリックします。

次のコードは、CLBインスタンスを介して外部アクセスを提供するNGINXアプリケーションを作成する方法の例を示しています。
apiVersion: extensions/v1beta1 kind: Deployment metadata: labels: run: old-nginx name: old-nginx spec: replicas: 1 selector: matchLabels: run: old-nginx template: metadata: labels: run: old-nginx app: nginx spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/xianlu/old-nginx imagePullPolicy: Always name: old-nginx ports: - containerPort: 80 protocol: TCP restartPolicy: Always --- apiVersion: v1 kind: Service metadata: labels: run: nginx name: nginx spec: ports: - port: 80 protocol: TCP targetPort: 80 selector: app: nginx sessionAffinity: None type: LoadBalancer # Enable external access to the application through an SLB instance.アプリケーションのデプロイ後、[デプロイメント] ページで作成したデプロイメントを確認できます。
左側のナビゲーションウィンドウで、 を選択します。 [サービス] ページで、サービスの右側にある外部エンドポイントをクリックして、NGINXのウェルカムページにアクセスします。 この例では、ウェルカムページにoldが表示されます。 これは、バックエンドのold-nginxコンテナにアクセスすることを示します。

マスターノードにログインし、
curlを使用してリクエストを送信することを推奨します。 次の例では、要求はcurlを使用して送信されます。bash for x in {1..10} ; do curl EXTERNAL-IP; done # Replace EXTERNAL-IP with the external endpoint of the Service. old old old old old old old old old old
ステップ2: デプロイメントを使用して新しいアプリケーションバージョンをリリースする
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
[デプロイメント] ページで、右上隅の [YAMLから作成] をクリックします。
[サンプルテンプレート] フィールドで、ドロップダウンリストからテンプレートを選択し、[作成] をクリックします。
この例では、NGINXアプリケーションの新しいバージョンをデプロイするためのデプロイが作成されます。 このデプロイには、
app:nginxラベルも追加されます。 このラベルにより、NGINXアプリケーションの両方のバージョンをサービスによって検出できます。 このようにして、トラフィックは両方のアプリケーションバージョンに分散されます。例として次のテンプレートを使用します。
apiVersion: apps/v1 kind: Deployment metadata: labels: run: new-nginx name: new-nginx spec: replicas: 1 selector: matchLabels: run: new-nginx template: metadata: labels: run: new-nginx app: nginx spec: containers: - image: registry.cn-hangzhou.aliyuncs.com/xianlu/new-nginx imagePullPolicy: Always name: new-nginx ports: - containerPort: 80 protocol: TCP restartPolicy: Always新しいバージョンのアプリケーションがデプロイされた後、[デプロイメント] ページでnew-nginxという名前のデプロイメントを見つけることができます。
マスターノードにログインし、curlを使用してNGINXアプリケーションにリクエストを送信します。
bash for x in {1..10} ; do curl EXTERNAL-IP; done # Replace EXTERNAL-IP with the external endpoint of the Service. new new new old new old new new old oldこの結果は、5つの要求が古いバージョンのアプリケーションにルーティングされ、他の5つが新しいバージョンにルーティングされることを示しています。 これは、サービスの負荷分散ポリシーがトラフィックを均等に分散するためです。 両方のデプロイメントは1つのポッドを実行します。 したがって、2つのポッドに送信されるリクエストの比率は1:1です。
ステップ3: トラフィックの重みを調整する
SLBインスタンスを使用して実装されたカナリアリリースでトラフィックの重みを調整するには、バックエンドのポッド数を変更する必要があります。 新しいアプリケーションバージョンにより多くのトラフィックをルーティングする場合は、新しいバージョンを実行するポッドの数を増やします。 この例では、ポッドの数が4つに増えています。
cURLコマンドを使用して10個のリクエストを送信した後、結果は調整されたトラフィックの重みに厳密に準拠しない場合があります。 より正確な結果を得るために、より多くのリクエストを送信することを推奨します。
ACKコンソールの左側のナビゲーションウィンドウで、[クラスター] をクリックします。
[クラスター] ページで、管理するクラスターを見つけ、クラスターの名前をクリックするか、[操作] 列の [詳細] をクリックします。 クラスターの詳細ページが表示されます。
詳細ページの左側のナビゲーションウィンドウで、 を選択します。
、デプロイがデプロイされている名前空間を選択し、デプロイを見つけて、[操作] 列の [スケール] をクリックします。
表示されるダイアログボックスで、[目的のポッド数] を4に設定します。
説明デフォルトでは、デプロイメントはrollingUpdate戦略に基づいて更新されます。 これにより、更新中に使用できるポッドの数が最小限に抑えられます。 この番号はYAMLファイルで変更できます。
デプロイが更新されたら、マスターノードにログインし、cURLコマンドを使用してリクエストを送信します。
bash for x in {1..10} ; do curl EXTERNAL-IP; done # Replace EXTERNAL-IP with the external endpoint of the Service. new new new new new old new new new oldこの例では、10個の要求が送信される。 結果は、8つの要求が新しいバージョンのアプリケーションにルーティングされ、2つの要求が古いバージョンのアプリケーションにルーティングされることを示しています。
バックエンドでポッドの数を動的に変更して、古いバージョンと新しいバージョンのトラフィックの重みを調整し、カナリアリリースを実装できます。