ARGO CDとistioによるカナリア配備
25055 ワード
Argo CDの第2今回は、私たちがカナリア展開を扱うためにどのようにistioでそれを使うことができるかを見るつもりです.
カナリア展開は、サーバーの小さなサブセットにのみアプリケーションの新しいバージョンを展開する方法です.エラーが新しいリリースで導入されるならば、それはユーザーの小さな部分だけに影響を及ぼします.このタイプの配備は、すべてのトラフィックがそれに送られるまで、Canaryリリースにより多くのトラフィックを送る複数のステップで構成されるほとんどの時間であり、安定版になります.各ステップの間に、我々はすべてが確かであることを確認するいくつかのテストをすることができます.エラーがテストによって検出されるならば、我々は前の働くバージョンに戻ります.つまり、すべてのユーザーに影響を与えることなく新しいバージョンを検証することが可能です.
このデモでは、Argo CDが提供するアプリケーションを配備します.このアプリケーションとコードhereについての詳細情報です.
それは私たちのデモに最適です.これは、複数の投稿要求ごとに2番目のWeb UIを提供します.各ポストリクエストはバブルで表されます.この例では、アプリケーションをBlueバージョンで展開し、Canary展開を使用してオレンジバージョンで更新します.下の写真では、現在のバージョン(青)と新しいカナリアリリース(オレンジ)の間でトラフィックがどのようにルーティングされているかを確認します.
デモでgkeを使います.Google Cloudアカウントをお持ちの場合は、以下のコマンドでクラスタを作成できます.クラスタが既にある場合は、次のステップに進むことができます.
Istioをistioctlでインストールできます.
Kubernetesでは、アプリケーションを管理するための配備リソースを使用します.Argo CD Rootoutでは、展開を使用しないで、ロールアウトリソースに置き換えられます.展開のように、Argo CDはReplicasetを作成して、ポッドを特定するためにサービスにいくつかのラベルを加えるでしょう.
まず,ゲートウェイと仮想サービスをistio資源を生成しなければならない.
ロールアウトリソースはいくつかの新しいフィールドを持つKubernetesの展開のようです.
彼らに集中しましょう
ARGO CDにアプリケーションを配備する2つの必須ファイルがあります.これをしましょう、あなたのArgo CDに接続して、アプリケーションを配備してください.
リトル・リマインダー ALGO CDのパスワードを取得します.
でポートフォワーディングを使います.
展開されると、アプリケーションにアクセスできます.istioで使用されるロードバランサIPが必要です.
覚えて、各バブルは、ポストバランサーIPに行わポストリクエストを表します.
前進する前に、新しいKubectlコマンドを見ましょう.
OK、青い泡は素晴らしいですが、我々はオレンジ色のものを試してみたい.つのオプションは、私たちのロールアウトのイメージを変更するには、最初の1つの更新をコミットされ、2番目は、Kubectl CLIを使用しています.2番目のオプションを使います.
Canary展開の進捗状況と現在のステップを見ることができます.
ブラウザからアプリケーションに戻ると、次のようになります.
数分後、トラフィックの50 %は、2つのバージョン間で分割されます.
それが完了したら、再度表示をあなたのロールアウトの状態を得ることができます.ロールアウトは健康であり、安定したオレンジタグを持っている必要があります.
ロールアウト概要:ロールアウトリソースは、アルゴCD のプラグインですロールアウトリソースだけでなく、展開 を作成しますカナリーやブルーグリーンの戦略 を使用できますあなたはサポートされた侵入を必要とします. ARGO CD自体はISIVER仮想サービス のサービスの重みを更新する
新しいバージョンで問題がないことを保証するためにカナリア展開中にいくつかのテストを追加できます.プロメテウスの問い合わせのような複雑なコマンドやコマンドを実行するような簡単なテストである.それが我々のやりようだ.
私たちのYAMLファイルに戻ってください.
我々は、最後の分でエラーのHTTP要求の割合をチェックするためにカナリア展開中に30秒ごとにPromeTheusを問い合わせたい.結果が5 %(結果[ 0 ]>= 0.95以上)の場合、テストは失敗したとみなされます.
それで、5分の配備のために、複数のテストは動きます.失敗した場合は、配置を停止し、以前の健康バージョンにロールバックします.
私たちのテストは準備ができて、我々のワークフローに追加する必要があります.ロールアウトYAMLでは、新しいものを見ましょう.
試してみましょう!私たちはイメージの新しいタグを展開する必要があります.悪いトラフィックを生成する2つの可能性.我々は直接アプリケーションを展開して使用することができますし、バーとエラーの数を選択するだけで“悪い”バージョンを展開.
悪いバージョンを展開します.
二つの新しいタイプの泡が見えます. Green =はHTTPリクエスト を継承しました
黒い円=エラーHTTP要求による緑
ロールアウトについて説明してみましょう.
テストは2回失敗し、ロールアウトの状態は悪化します.Argo CDは以前の健康版にロールバックしましたが、劣化した状態を保ちます.健康状態で戻るには、手動で正しいイメージにバージョンを変更する必要があります.
失敗したテストの詳細については、次のように実行します.
成功したHTTPリクエストの77 %、87 %しかなかった.それは十分ではなかった、少なくとも95 %が欲しかった.
妥当性検査の概要 分析テンプレートは のテストに使用されますは、分析テンプレートを複数のロールアウトにリンクできます では、複数の解析テンプレートをロールアウト で別のステップから開始することができます
ここの完全なコード:https://github.com/pabardina/argocd-canary
カナリア展開は、サーバーの小さなサブセットにのみアプリケーションの新しいバージョンを展開する方法です.エラーが新しいリリースで導入されるならば、それはユーザーの小さな部分だけに影響を及ぼします.このタイプの配備は、すべてのトラフィックがそれに送られるまで、Canaryリリースにより多くのトラフィックを送る複数のステップで構成されるほとんどの時間であり、安定版になります.各ステップの間に、我々はすべてが確かであることを確認するいくつかのテストをすることができます.エラーがテストによって検出されるならば、我々は前の働くバージョンに戻ります.つまり、すべてのユーザーに影響を与えることなく新しいバージョンを検証することが可能です.
このデモでは、Argo CDが提供するアプリケーションを配備します.このアプリケーションとコードhereについての詳細情報です.
それは私たちのデモに最適です.これは、複数の投稿要求ごとに2番目のWeb UIを提供します.各ポストリクエストはバブルで表されます.この例では、アプリケーションをBlueバージョンで展開し、Canary展開を使用してオレンジバージョンで更新します.下の写真では、現在のバージョン(青)と新しいカナリアリリース(オレンジ)の間でトラフィックがどのようにルーティングされているかを確認します.
要件
Kubernetesクラスタ
デモでgkeを使います.Google Cloudアカウントをお持ちの場合は、以下のコマンドでクラスタを作成できます.クラスタが既にある場合は、次のステップに進むことができます.
gcloud beta container clusters create gke-argocd-canary \
--release-channel regular
イシス
Istioをistioctlでインストールできます.
istioctl install --set profile=demo
kubectl label namespace default istio-injection=enabled
アルゴCD
kubectl create namespace argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
アルゴCD
Argo Rollouts is a Kubernetes controller and set of CRDs which provide advanced deployment capabilities such as blue-green, canary, canary analysis, experimentation, and progressive delivery features to Kubernetes.
https://argoproj.github.io/argo-cd/
Kubernetesでは、アプリケーションを管理するための配備リソースを使用します.Argo CD Rootoutでは、展開を使用しないで、ロールアウトリソースに置き換えられます.展開のように、Argo CDはReplicasetを作成して、ポッドを特定するためにサービスにいくつかのラベルを加えるでしょう.
kubectl create namespace argo-rollouts
kubectl apply -n argo-rollouts -f https://raw.githubusercontent.com/argoproj/argo-rollouts/stable/manifests/install.yaml
準備する
まず,ゲートウェイと仮想サービスをistio資源を生成しなければならない.
apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
name: istio-gateway
labels:
app: istio-gateway
spec:
selector:
istio: ingressgateway
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- "*"
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: istio-vs
labels:
app: istio-vs
spec:
hosts:
- "*"
gateways:
- istio-gateway
http:
- name: primary
route:
- destination:
host: demo
weight: 100
- destination:
host: demo-canary
weight: 0
今から、トラフィックの100 %がメインサービス(ここでデモと呼ばれる)に行きます.その後、ARGO CDがこれらの値を変更してカナリアサービスでいくつかのトラフィックを送信することがわかります.ロールアウトリソースの作成
ロールアウトリソースはいくつかの新しいフィールドを持つKubernetesの展開のようです.
彼らに集中しましょう
strategy:
# which strategy to use (blueGreen, canary..)
canary:
# this part represents all the steps during an update.
steps:
# we send at the beginning of the new release 20% of the traffic to the canary release.
# To do that, Argo CD will update the weight of Istio's VirtualService.
- setWeight: 20
# Then we wait 1min to generate some traffic on the canary release.
- pause:
duration: "1m"
# After 1 min, we send 50% of the traffic to the canary release.
- setWeight: 50
# Then we wait again 2min
- pause:
duration: "2m"
# At the end if no more step is present,
# Argo will send 100% of the traffic to the canary release.
canaryService: demo-canary # represents our canary clusterIP service.
stableService: demo # represents our main clusterIP service.
trafficRouting:
istio:
virtualService:
name: istio-vs
routes:
- primary
我々のロールアウトリソースの完全なYAMLは、clusteripサービスを備えています.---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: demo
labels:
app: demo
spec:
strategy:
canary:
steps:
- setWeight: 20
- pause:
duration: "1m"
- setWeight: 50
- pause:
duration: "2m"
canaryService: demo-canary
stableService: demo
trafficRouting:
istio:
virtualService:
name: istio-vs
routes:
- primary
replicas: 4
revisionHistoryLimit: 2
selector:
matchLabels:
app: demo
version: blue
template:
metadata:
labels:
app: demo
version: blue
spec:
containers:
- name: demo
image: argoproj/rollouts-demo:blue
imagePullPolicy: Always
ports:
- name: web
containerPort: 8080
resources:
requests:
memory: "64Mi"
cpu: "100m"
limits:
memory: "128Mi"
cpu: "140m"
---
apiVersion: v1
kind: Service
metadata:
name: demo
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: demo
type: ClusterIP
---
apiVersion: v1
kind: Service
metadata:
name: demo-canary
spec:
ports:
- port: 80
targetPort: 8080
selector:
app: demo
type: ClusterIP
アプリケーションの配備
ARGO CDにアプリケーションを配備する2つの必須ファイルがあります.これをしましょう、あなたのArgo CDに接続して、アプリケーションを配備してください.
リトル・リマインダー
kubectl get pods \
-n argocd \
-l app.kubernetes.io/name=argocd-server \
-o "jsonpath={.items[0].metadata.name}"
その後、kubectl port-forward svc/argocd-server -n argocd 8080:443
Argo CDでアプリケーションを作成するときに追加する情報展開されると、アプリケーションにアクセスできます.istioで使用されるロードバランサIPが必要です.
kubectl -n istio-system get services istio-ingressgateway \
-o "jsonpath={.status.loadBalancer.ingress[0].ip}"
ブラウザからこのIPアドレスにアクセスしてください.覚えて、各バブルは、ポストバランサーIPに行わポストリクエストを表します.
前進する前に、新しいKubectlコマンドを見ましょう.
kubectl argo rollouts get rollout demo
はあなたのロールアウトの状態を見るのに便利です.カナリア展開中に、すべての手順が表示されます.新しいリリースを展開します。
OK、青い泡は素晴らしいですが、我々はオレンジ色のものを試してみたい.つのオプションは、私たちのロールアウトのイメージを変更するには、最初の1つの更新をコミットされ、2番目は、Kubectl CLIを使用しています.2番目のオプションを使います.
kubectl set image
のようにロールアウトと等価です.kubectl argo rollouts set image demo "*=argoproj/rollouts-demo:orange"
次のようにしてください.Canary展開の進捗状況と現在のステップを見ることができます.
ブラウザからアプリケーションに戻ると、次のようになります.
数分後、トラフィックの50 %は、2つのバージョン間で分割されます.
それが完了したら、再度表示をあなたのロールアウトの状態を得ることができます.ロールアウトは健康であり、安定したオレンジタグを持っている必要があります.
ロールアウト概要:
検証
新しいバージョンで問題がないことを保証するためにカナリア展開中にいくつかのテストを追加できます.プロメテウスの問い合わせのような複雑なコマンドやコマンドを実行するような簡単なテストである.それが我々のやりようだ.
私たちのYAMLファイルに戻ってください.
---
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: success-rate
spec:
args:
- name: service-name
metrics:
- name: success-rate
successCondition: result[0] >= 0.95
interval: 30s
failureLimit: 1
provider:
prometheus:
address: http://prometheus.istio-system.svc.cluster.local:9090
query: |
sum(irate(
istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}",response_code!~"5.*"}[1m]
)) /
sum(irate(
istio_requests_total{reporter="source",destination_service=~"{{args.service-name}}"}[1m]
))
このテストでは,istioによってインストールされたprometheusを問い合わせる.我々は、最後の分でエラーのHTTP要求の割合をチェックするためにカナリア展開中に30秒ごとにPromeTheusを問い合わせたい.結果が5 %(結果[ 0 ]>= 0.95以上)の場合、テストは失敗したとみなされます.
それで、5分の配備のために、複数のテストは動きます.失敗した場合は、配置を停止し、以前の健康バージョンにロールバックします.
私たちのテストは準備ができて、我々のワークフローに追加する必要があります.ロールアウトYAMLでは、新しいものを見ましょう.
---
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: demo
labels:
app: demo
spec:
strategy:
canary:
# New part
analysis:
templates:
# name of AnalysisTemplate
- templateName: success-rate
# When it begins (after the 1-minute pause)
startingStep: 2
args:
- name: service-name
# name of the canary service (used in prometheus to find the correct metrics)
value: demo-canary.default.svc.cluster.local
steps:
- setWeight: 20
- pause:
duration: "1m"
- setWeight: 50
- pause:
duration: "2m"
canaryService: demo-canary
stableService: demo
[....]
テストは1分の一時停止後30秒ごとに実行されます.我々は、いくつかのトラフィックを生成する必要があるので、一時停止後に起動します.試してみましょう!私たちはイメージの新しいタグを展開する必要があります.悪いトラフィックを生成する2つの可能性.我々は直接アプリケーションを展開して使用することができますし、バーとエラーの数を選択するだけで“悪い”バージョンを展開.
悪いバージョンを展開します.
kubectl argo rollouts set image demo "*=argoproj/rollouts-demo:bad-green"
二つの新しいタイプの泡が見えます.
黒い円=エラーHTTP要求による
ロールアウトについて説明してみましょう.
テストは2回失敗し、ロールアウトの状態は悪化します.Argo CDは以前の健康版にロールバックしましたが、劣化した状態を保ちます.健康状態で戻るには、手動で正しいイメージにバージョンを変更する必要があります.
失敗したテストの詳細については、次のように実行します.
$ kubectl get analysisrun
NAME STATUS
demo-588d8b6cb4-9 Failed
成功したHTTPリクエストの77 %、87 %しかなかった.それは十分ではなかった、少なくとも95 %が欲しかった.
妥当性検査の概要
ここの完全なコード:https://github.com/pabardina/argocd-canary
Reference
この問題について(ARGO CDとistioによるカナリア配備), 我々は、より多くの情報をここで見つけました https://dev.to/stack-labs/canary-deployment-with-argo-cd-and-istio-406dテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol