カナリア デプロイメントは、ユーザーのサブセットで新しいコードをテストする非常に効果的な方法です。 特定のサブセット内でのみ発生するため、展開プロセス中に問題となる可能性のあるトラフィック負荷が大幅に軽減されます。 このノートでは、Kubernetes とデプロイの自動化を使用してそのようなデプロイを組織する方法について説明します。 Helm と Kubernetes リソースについてある程度の知識があることを前提としています。.
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 を使用すると、このオプションを想像するのがさらに簡単になります。
カナリア展開の自動化
まず最初に、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 を実行すると、カナリア更新がトラフィックを一時的にのみルーティングしていることがわかります。
説明されているロジックを含む展開自動化ツールを探している場合は、次の点に注意してください。
出所: habr.com