Kubernetes クラスターでは、レイヤー 7 Ingress は TCP/UDP を利用したサービスに対してグレーリリースを適切に実装できません。 ここでは、Server Load Balancer を利用したレイヤー 4 カナリアリリースの 実装方法を紹介します。
前提条件
- Kubernetes クラスターが作成されている必要があります。 詳しくは、「クラスターの作成」をご参照ください。
- SSH によりマスターノードへ接続されている必要があります。 詳しくは、「SSH による Kubernetes クラスターへのアクセス」をご参照ください。
手順 1: 旧バージョンのサービスのデプロイ
- Container Service コンソール にログインします。
- 左側のナビゲーションウィンドウから、 クリックします。
- 右上角の [テンプレートによる作成] をクリックします。
- [クラスター] および [名前空間] それぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。 サンプルテンプレートを選択するか、[リソースタイプ]
ドロップダウンリストから [カスタマイズ] を選択します。 [デプロイ] をクリックします。
この例では、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 によりサービスを公開します。
- 左側のナビゲーションウィンドウから、 および デプロイおよびサービスを確認します。
- サービスの右側の外部エンドポイントをクリックし、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: 新しいデプロイバージョンをオンラインにする
- Container Service コンソール にログインします。
- 左側のナビゲーションウィンドウから、 クリックします。
- 右上角の [テンプレートによる作成] をクリックします。
- [クラスター] および [名前空間] それぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。
サンプルテンプレートを選択するか、[リソースタイプ] ドロップダウンリストから [カスタマイズ] を選択します。 [デプロイ] をクリックします。
この例では、
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
- 左側のナビゲーションウィンドウから [デプロイ] をクリックします。 新バージョンの Nginx のデプロイが [デプロイ] ページに表示されます。
- マスターノードにログインし、"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 つに調整できます。
- Container Service コンソール にログインします。
- Kubernetes で、ナビゲーションウインドウの左側にある クリックします。
- [クラスター] および [名前空間] のそれぞれのドロップダウンリストから、クラスターおよび名前空間を選択します。 デプロイの右側にある [更新] をクリックします。
- 表示されたダイアログボックスで、ポッド数を 4 に設定します。
Note Kubernetes デプロイリソースのデフォルトの更新方法は ローリングアップデートです。 そのため、更新処理中にサービスを提供する最小数のコンテナーが確保され、テンプレートで確保されるコンテナーの最小数を調整できます。
- デプロイ後、マスターノードにログインし、"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 を調整するために動的にポッド数を調整することができ、カナリアリリースが実装できます。