Kubernetes での Canary デプロイメント #2: Argo ロールアウト

k8s ネイティブの Argo Rollouts デプロイメント コントローラーと GitlabCI を使用して、Kubernetes への Canary デプロイメントを実行します。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

https://unsplash.com/photos/V41PulGL1z0

このシリーズの記事

カナリアの展開

ぜひお読みください 最初の部分では、カナリア デプロイメントとは何かについて簡単に説明しました。 標準の Kubernetes リソースを使用して実装する方法も示しました。

アルゴのロールアウト

Argo Rollouts は、Kubernetes ネイティブ デプロイメント コントローラーです。 Kubernetes の CRD (カスタム リソース定義) を提供します。 そのおかげで、新しいエンティティを使用できるようになります。 Rollout、さまざまな構成オプションを使用して Blue-Green および Canary デプロイメントを管理します。

カスタム リソースによって使用される Argo Rollouts コントローラー Rollout, Kubernetes の Blue-Green や Canary などの追加のデプロイメント戦略が可能になります。 リソース Rollout 同等の機能を提供します Deployment追加の展開戦略を使用する場合のみ。
リソース Deployments 導入には XNUMX つの戦略があります。 RollingUpdate и Recreate。 これらの戦略はほとんどの場合に適していますが、非常に大規模なサーバーへの展開には、展開コントローラーでは使用できない Blue-Green や Canary などの追加の戦略が使用されます。 Kubernetes でこれらの戦略を使用するには、ユーザーはデプロイメント上にスクリプトを作成する必要がありました。 Argo Rollouts Controller は、これらの戦略をシンプルで宣言的な構成可能なパラメーターとして公開します。
https://argoproj.github.io/argo-rollouts

ロールアウトで使用するためのユーザーフレンドリーな Web インターフェイスを提供する Argo CI もあります。これについては次の記事で説明します。

Argo ロールアウトのインストール

サーバ側

kubectl create namespace argo-rolloutskubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml

私たちのインフラストラクチャ カブ (以下を参照) では、すでに install.yaml を i/k8s/argo-rollouts/install.yaml として追加しています。 このようにして、GitlabCI はそれをクラスターにインストールします。

クライアント側 (kubectl プラグイン)

https://argoproj.github.io/argo-rollouts/features/kubectl-plugin

応用例

アプリケーション コードとインフラストラクチャ用に別のリポジトリを用意することをお勧めします。

アプリケーションのリポジトリ

Kim Wuestkamp/k8s-deployment-example-app

これは、応答を JSON として返す、非常に単純な Python+Flask API です。 GitlabCI を使用してパッケージをビルドし、結果を Gitlab レジストリにプッシュします。 レジストリには XNUMX つの異なるリリース バージョンがあります。

  • wuestkamp/k8s-deployment-example-app:v1
  • wuestkamp/k8s-deployment-example-app:v2

それらの唯一の違いは、返される JSON ファイルです。 このアプリケーションを使用して、通信しているバージョンをできるだけ簡単に視覚化します。

インフラストラクチャリポジトリ

このリポジトリでは、Kubernetes へのデプロイメントに GitlabCI を使用します。.gitlab-ci.yml は次のようになります。

image: traherom/kustomize-dockerbefore_script:
   - printenv
   - kubectl versionstages:
 - deploydeploy test:
   stage: deploy
   before_script:
     - echo $KUBECONFIG
   script:
     - kubectl get all
     - kubectl apply -f i/k8s    only:
     - master

自分で実行するにはクラスターが必要です。Gcloud を使用できます。

gcloud container clusters create canary --num-nodes 3 --zone europe-west3-b
gcloud compute firewall-rules create incoming-80 --allow tcp:80

フォークする必要があります https://gitlab.com/wuestkamp/k8s-deployment-example-canary-infrastructure そして変数を作成します KUBECONFIG GitlabCI 内。これにはアクセス用の構成が含まれます kubectl クラスターに。

それは クラスター (Gcloud) の認証情報を取得する方法について読むことができます。

インフラストラクチャ Yaml

インフラストラクチャ リポジトリ内には次のサービスがあります。

apiVersion: v1
kind: Service
metadata:
 labels:
   id: rollout-canary
 name: app
spec:
 ports:
 - port: 80
   protocol: TCP
   targetPort: 5000
 selector:
   id: app
 type: LoadBalancer

そして rollout.yaml :

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
 replicas: 10
 revisionHistoryLimit: 2
 selector:
   matchLabels:
     id: rollout-canary
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v1
       imagePullPolicy: Always
 strategy:
   canary:
     steps:
     - setWeight: 10
     # Rollouts can be manually resumed by running `kubectl argo rollouts promote ROLLOUT`
     - pause: {}
     - setWeight: 50
     - pause: { duration: 120 } # two minutes

Rollout デプロイメントと同じように機能します。 更新戦略 (ここではカナリアなど) を設定しない場合は、デフォルトのローリング更新デプロイメントのように動作します。

カナリア デプロイメント用に yaml で XNUMX つのステップを定義します。

  1. カナリアへのトラフィックの 10% (手動 OK を待ちます)
  2. カナリアへのトラフィックが 50% (2 分待ってから 100% に進みます)

初期展開の実行

最初のデプロイメントの後、リソースは次のようになります。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

そして、アプリケーションの最初のバージョンからのみ応答を受け取ります。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

カナリア展開の実行

ステップ 1: トラフィック 10%

カナリア デプロイメントを開始するには、通常のデプロイメントと同様にイメージ バージョンを変更するだけです。

apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
 name: rollout-canary
spec:
...
 template:
   metadata:
     labels:
       id: rollout-canary
   spec:
     containers:
     - name: rollouts-demo
       image: registry.gitlab.com/wuestkamp/k8s-deployment-example-app:v2
...

そして、変更をプッシュするので、Gitlab CI がデプロイされ、変更が表示されます。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

ここでサービスにアクセスすると、次のようになります。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

素晴らしい! 私たちはカナリアのデプロイメントの真っ最中です。 以下を実行すると進行状況を確認できます。

kubectl argo rollouts get rollout rollout-canary

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

ステップ 2: 50% のトラフィック:

次のステップに進み、トラフィックの 50% をリダイレクトします。 このステップを手動で実行するように構成しました。

kubectl argo rollouts promote rollout-canary # continue to step 2

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

そして、私たちのアプリケーションは新しいバージョンからの応答の 50% を返しました。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

そしてロールアウトレビュー:

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

素晴らしい。

ステップ 3: 100% のトラフィック:

2 分後に 50% ステップが自動的に終了し、100% ステップが開始されるように設定します。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

そしてアプリケーションの出力は次のようになります。

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

そしてロールアウトレビュー:

Kubernetes での Canary デプロイメント #2: Argo ロールアウト

カナリアのデプロイが完了しました。

Argo ロールアウトを使用したその他の例

ここには、カナリアに基づいて環境のプレビューや比較を設定する方法など、さらに多くの例があります。

https://github.com/argoproj/argo-rollouts/tree/master/examples

Argo ロールアウトと Argo CI に関するビデオ

このビデオは本当にお勧めです。Argo Rollouts と Argo CI がどのように連携するかを示しています。

合計

追加タイプのデプロイメントやレプリカセットの作成、トラフィックのリダイレクトなどを管理する CRD を使用するというアイデアがとても気に入っています。 彼らとの仕事はスムーズに進みます。 次に Argo CI との統合をテストしたいと思います。

ただし、Argo CI と Flux CI の大規模な統合が予定されているようですので、新しいリリースがリリースされるまで待つかもしれません。 アルゴフラックス.

Argo Rollouts または Argo CI を使用した経験はありますか?

私たちのブログの他の記事もお読みください。

出所: habr.com

コメントを追加します