Kubernetes クラスターでは、レイヤー 7 Ingress は TCP/UDP を利用したサービスに対してグレーリリースを適切に実装できません。 ここでは、Server Load Balancer を利用したレイヤー 4 カナリアリリースの 実装方法を紹介します。

前提条件

手順 1: 旧バージョンのサービスのデプロイ

  1. Container Service コンソール にログインします。
  2. 左側のナビゲーションウィンドウから、[アプリケーション] > [デプロイ] をクリックします。
  3. 右上角の [テンプレートによる作成] をクリックします。
  4. [クラスター] および [名前空間] それぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。 サンプルテンプレートを選択するか、[リソースタイプ] ドロップダウンリストから [カスタマイズ] を選択します。 [デプロイ] をクリックします。

    この例では、SLB により公開される 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 ## Alibaba Cloud SLB によりサービスを公開します。
  5. 左側のナビゲーションウィンドウから、[アプリケーション] > [デプロイ] および[アプリケーション] > [サービス] をクリックし、デプロイおよびサービスを確認します。
  6. サービスの右側の外部エンドポイントをクリックし、Nginx のデフォルトウェルカムページに移動します。 この例では、Nginx のデフォルトウェルカムページに [old] が表示されます。これは、現在アクセスしているサービスが旧バージョンの Niginx コンテナーのバックエンドに対応していることを示しています。

    複数のリリース結果を簡単に表示させるために、マスターノードにログインし、 curl コマンドを実行し、デプロイ結果を表示することを推奨します。

    # bash  
    # for x in {1.. 10} ; do curl EXTERNAL-IP; done ##EXTERNAL-IP is the external endpoint of the service.
    old
    old
    old
    old
    old
    old
    old
    old
    old
    old

手順 2: 新しいデプロイバージョンをオンラインにする

  1. Container Service コンソール にログインします。
  2. 左側のナビゲーションウィンドウから、[アプリケーション] > [デプロイ] をクリックします。
  3. 右上角の [テンプレートによる作成] をクリックします。
  4. [クラスター] および [名前空間] それぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。 サンプルテンプレートを選択するか、[リソースタイプ] ドロップダウンリストから [カスタマイズ] を選択します。 [デプロイ] をクリックします。

    この例では、 app:nginx ラベルを含む新バージョンの Nginx デプロイを作成します。 ラベルは、旧バージョンのデプロイと同様の Nginx サービスに使用され、 対応するトラフィックを発生させます。

    この例でのオーケストレーションテンプレートは以下のようになります。

    apiVersion: extensions/v1beta1
     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
  5. 左側のナビゲーションウィンドウから [デプロイ] をクリックします。 新バージョンの Nginx のデプロイが [デプロイ] ページに表示されます。
  6. マスターノードにログインし、"curl" コマンドを実行して サービスアクセスを表示します。
    # bash  
    # for x in {1.. 10} ; do curl EXTERNAL-IP; done ##EXTERNAL-IP is the external endpoint of the service.
    new
    new
    new
    old
    new
    old
    new
    new
    old
    old

    旧バージョンのサービスおよび新バージョンのサービスが、それぞれ 5 回ずつアクセスされていることが確認できます。 これは主に、 サービスが Server Load Balancer の平均トラフィックのポリシーに従ってトラフィックリクエストを処理しており、旧バージョンのデプロイおよび新バージョンのデプロイが同じポッドにあり、トラフィック比率が 1:1 になるためです。

手順 3: トラフィックの weight の調整

バックエンドにあるポッド数を調整し、Server Load Balancer を基にしたカナリアリリースに関して対応する weight を調整する必要があります。 たとえば、weight の大きい新しいサービスを作成するためには、新しいポッド数を 4 つに調整できます。

Note 旧バージョンのアプリケーションおよび新バージョンのアプリケーションが混在している場合、サンプルの "curl " コマンドの実行結果は、設定された weightと完全には一致しません。 この例では、おおよその効果を得るため "curl" コマンドを 10 回実行してより多くのサンプルを確認します。
  1. Container Service コンソール にログインします。
  2. Kubernetes で、ナビゲーションウインドウの左側にある[アプリケーション] > [デプロイ] をクリックします。
  3. [クラスター] および [名前空間] のそれぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。 デプロイの右側にある [更新] をクリックします。
  4. 表示されたダイアログボックスで、ポッド数を 4 に設定します。
    Note Kubernetes デプロイリソースのデフォルトの更新方法は ローリングアップデートです。 そのため、更新処理中にサービスを提供する最小数のコンテナーが確保され、テンプレートで確保されるコンテナーの最小数を調整できます。
  5. デプロイ後、マスターノードにログインし、"curl" コマンドを実行し、 効果を確認します。
    # bash  
     # for x in {1.. 10} ; do curl EXTERNAL-IP; done ##EXTERNAL-IP is the external endpoint of the service.
     new
     new
     new
     new
     new
     old
     new
     new
     new
     old

10 回のリクエストのうち、新バージョンのサービスが 8 回リクエストされ、旧バージョンのサービスが 2 回リクエストされたことが確認できます。

新バージョンと旧バージョンの weight を調整するために動的にポッド数を調整することができ、カナリアリリースが実装できます。