Helm を使用してカナリア デプロイメントを自動化するシンプルかつ安全な方法

Helm を使用してカナリア デプロイメントを自動化するシンプルかつ安全な方法

カナリア デプロイメントは、ユーザーのサブセットで新しいコードをテストする非常に効果的な方法です。 特定のサブセット内でのみ発生するため、展開プロセス中に問題となる可能性のあるトラフィック負荷が大幅に軽減されます。 このノートでは、Kubernetes とデプロイの自動化を使用してそのようなデプロイを組織する方法について説明します。 Helm と Kubernetes リソースについてある程度の知識があることを前提としています。.

Helm を使用してカナリア デプロイメントを自動化するシンプルかつ安全な方法

Kubernetes への単純な Canary デプロイメントには、サービス自体とデプロイメント ツールという XNUMX つの主要なリソースが含まれます。 カナリア デプロイメントは、更新トラフィックを提供する XNUMX つの異なるリソースと対話する単一のサービスを通じて機能します。 これらのリソースの XNUMX つは「カナリア」バージョンで動作し、XNUMX 番目のリソースは安定バージョンで動作します。 この状況では、サービスに必要なトラフィック量を減らすために、カナリア バージョンの数を調整できます。 たとえば、Yaml を使用する場合、Kubernetes では次のようになります。

kind: Deployment
metadata:
  name: app-canary
  labels:
    app: app
spec:
  replicas: 1
  ...
    image: myapp:canary
---
kind: Deployment
metadata:
  name: app
  labels:
    app: app
spec:
  replicas: 5
  ...
    image: myapp:stable
---
kind: Service
selector:
  app: app # Selector will route traffic to both deployments.

kubectl を使用すると、このオプションを想像するのがさらに簡単になります。 Kubernetes ドキュメント このシナリオに関する完全なチュートリアルもあります。 しかし、この投稿の主な質問は、Helm を使用してこのプロセスをどのように自動化するかということです。

カナリア展開の自動化

まず最初に、Helm チャート マップが必要です。これには、上で説明したリソースがすでに含まれています。 次のようになります。

~/charts/app
├── Chart.yaml
├── README.md
├── templates
│   ├── NOTES.txt
│   ├── _helpers.tpl
│   ├── deployment.yaml
│   └── service.yaml
└── values.yaml

Helm の概念の基礎は、マルチバージョン リリースの管理です。 安定バージョンは、プロジェクト コードの主要な安定ブランチです。 しかし、Helm を使用すると、実験コードを使用してカナリア リリースをデプロイできます。 主なことは、安定バージョンとカナリア リリースの間のトラフィック交換を維持することです。 これらすべてを特別なセレクターを使用して管理します。

selector:
  app.kubernetes.io/name: myapp

当社の「カナリア」および安定したデプロイメント リソースでは、モジュールにこのラベルが表示されます。 すべてが正しく構成されている場合、Helm チャート マップのカナリ​​ア バージョンのデプロイ中に、トラフィックが新しくデプロイされたモジュールに送信されることがわかります。 このコマンドの安定バージョンは次のようになります。

helm upgrade
  --install myapp 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v1       # Goes into app.kubernetes.io/version
  --set image.tag=stable 
  --set replicaCount=5

次に、カナリア リリースを確認してみましょう。 カナリア バージョンをデプロイするには、XNUMX つのことを覚えておく必要があります。 現在の安定バージョンへの更新をロールアウトしないように、リリース名は異なるものにする必要があります。 他のコードをデプロイし、リソース タグによって違いを識別できるように、バージョンとタグも異なっている必要があります。

helm upgrade
  --install myapp-canary 
  --namespace default 
  --set app.name=myapp       # Goes into app.kubernetes.io/name
  --set app.version=v2       # Goes into app.kubernetes.io/version
  --set image.tag=canary 
  --set replicaCount=1

それだけです! サービスに ping を実行すると、カナリア更新がトラフィックを一時的にのみルーティングしていることがわかります。

説明されているロジックを含む展開自動化ツールを探している場合は、次の点に注意してください。 デリバリーボットGitHub の Helm 自動化ツール。 上記のメソッドを実装するために使用される Helm チャートは Github にあります。 ここで。 一般に、これは、具体的な概念と例を使用して、カナリア バージョンのデプロイの自動化を実際に実装する方法の理論的な概要でした。

出所: habr.com

コメントを追加します