k8s ネイティブの Argo Rollouts デプロイメント コントローラーと GitlabCI を使用して、Kubernetes への Canary デプロイメントを実行します。
このシリーズの記事
Kubernetes での Canary デプロイ #1: Gitlab CI - (この記事)
- Istio を使用したカナリア デプロイメント
- Jenkins-X Istio Flagger を使用したカナリア デプロイメント
カナリアの展開
ぜひお読みください
アルゴのロールアウト
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 プラグイン)
応用例
アプリケーション コードとインフラストラクチャ用に別のリポジトリを用意することをお勧めします。
アプリケーションのリポジトリ
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
フォークする必要があります KUBECONFIG
GitlabCI 内。これにはアクセス用の構成が含まれます kubectl
クラスターに。
インフラストラクチャ 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 つのステップを定義します。
- カナリアへのトラフィックの 10% (手動 OK を待ちます)
- カナリアへのトラフィックが 50% (2 分待ってから 100% に進みます)
初期展開の実行
最初のデプロイメントの後、リソースは次のようになります。
そして、アプリケーションの最初のバージョンからのみ応答を受け取ります。
カナリア展開の実行
ステップ 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 がデプロイされ、変更が表示されます。
ここでサービスにアクセスすると、次のようになります。
素晴らしい! 私たちはカナリアのデプロイメントの真っ最中です。 以下を実行すると進行状況を確認できます。
kubectl argo rollouts get rollout rollout-canary
ステップ 2: 50% のトラフィック:
次のステップに進み、トラフィックの 50% をリダイレクトします。 このステップを手動で実行するように構成しました。
kubectl argo rollouts promote rollout-canary # continue to step 2
そして、私たちのアプリケーションは新しいバージョンからの応答の 50% を返しました。
そしてロールアウトレビュー:
素晴らしい。
ステップ 3: 100% のトラフィック:
2 分後に 50% ステップが自動的に終了し、100% ステップが開始されるように設定します。
そしてアプリケーションの出力は次のようになります。
そしてロールアウトレビュー:
カナリアのデプロイが完了しました。
Argo ロールアウトを使用したその他の例
ここには、カナリアに基づいて環境のプレビューや比較を設定する方法など、さらに多くの例があります。
Argo ロールアウトと Argo CI に関するビデオ
このビデオは本当にお勧めです。Argo Rollouts と Argo CI がどのように連携するかを示しています。
合計
追加タイプのデプロイメントやレプリカセットの作成、トラフィックのリダイレクトなどを管理する CRD を使用するというアイデアがとても気に入っています。 彼らとの仕事はスムーズに進みます。 次に Argo CI との統合をテストしたいと思います。
ただし、Argo CI と Flux CI の大規模な統合が予定されているようですので、新しいリリースがリリースされるまで待つかもしれません。
Argo Rollouts または Argo CI を使用した経験はありますか?
私たちのブログの他の記事もお読みください。
Nginx Web サーバーを使用した Spring アプリケーションの Blue-Green デプロイメント Kubernetes: システム リソース管理を構成することがなぜそれほど重要なのでしょうか? Hashicorp Consul の Kubernetes 認証の概要 Tekton Pipeline - Kubernetes ネイティブのパイプライン Nginx 用の動的モジュールの構築 Redmineのテレグラムボット。 自分自身と他人の生活を簡素化する方法
出所: habr.com