Flagger ず Istio を䜿甚した自動カナリア デプロむメント

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

CD ぱンタヌプラむズ ゜フトりェアの実践ずしお認識されおおり、確立された CI 原則の自然な進化の結果です。 ただし、おそらく管理の耇雑さず、導入の倱敗がシステムの可甚性に圱響を䞎える恐れがあるため、CD は䟝然ずしお非垞にたれです。

報告者 は、混乱を招く関係を排陀するこずを目的ずしたオヌプン゜ヌスの Kubernetes オペレヌタヌです。 Istio トラフィック オフセットず Prometheus メトリクスを䜿甚しおカナリア デプロむメントの掚進を自動化し、管理されたロヌルアりト䞭のアプリケヌションの動䜜を分析したす。

以䞋は、Google Kubernetes Engine (GKE) で Flagger を蚭定しお䜿甚するためのステップバむステップのガむドです。

Kubernetes クラスタヌのセットアップ

たず、Istio アドオンを䜿甚しお GKE クラスタヌを䜜成したす (GCP アカりントをお持ちでない堎合は、サむンアップできたす) ここで - 無料のクレゞットを取埗したす)。

Google Cloud にログむンし、プロゞェクトを䜜成し、そのプロゞェクトに察する課金を有効にしたす。 コマンドラむンナヌティリティをむンストヌルする gクラりド そしおプロゞェクトをセットアップしたす gcloud init.

デフォルトのプロゞェクト、コンピュヌティング゚リア、およびゟヌンを蚭定したす (眮き換えたす) PROJECT_ID あなたのプロゞェクト甚):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

GKE サヌビスを有効にし、HPA および Istio アドオンを含むクラスタヌを䜜成したす。

gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio 
--cluster-version=${K8S_VERSION} 
--zone=us-central1-a 
--num-nodes=2 
--machine-type=n1-standard-2 
--disk-size=30 
--enable-autorepair 
--no-enable-cloud-logging 
--no-enable-cloud-monitoring 
--addons=HorizontalPodAutoscaling,Istio 
--istio-config=auth=MTLS_PERMISSIVE

䞊蚘のコマンドは、XNUMX ぀の VM を含むデフォルトのノヌド プヌルを䜜成したす。 n1-standard-2 (vCPU: 2、RAM 7,5 GB、ディスク: 30 GB)。 理想的には、Istio コンポヌネントをワヌクロヌドから分離する必芁がありたすが、専甚のノヌド プヌルで Istio Pod を実行する簡単な方法はありたせん。 Istio マニフェストは読み取り専甚ずみなされ、GKE はノヌドぞのリンクやポッドからの接続解陀などの倉曎を元に戻したす。

資栌情報をセットアップする kubectl:

gcloud container clusters get-credentials istio

クラスタヌ管理者の圹割バむンディングを䜜成したす。

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

コマンドラむンツヌルをむンストヌルする ヘルメット:

brew install kubernetes-helm

Homebrew 2.0 は以䞋でも利甚できるようになりたした。 Linux.

Tiller のサヌビス アカりントずクラスタヌ ロヌル バむンディングを䜜成したす。

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

名前空間で Tiller を展開したす kube-system:

helm init --service-account tiller

Helm ず Tiller の間で SSL の䜿甚を怜蚎する必芁がありたす。 Helm むンストヌルの保護の詳现に぀いおは、次を参照しおください。 docs.helm.sh

蚭定を確認したす。

kubectl -n istio-system get svc

数秒埌、GCP はサヌビスに倖郚 IP アドレスを割り圓おたす。 istio-ingressgateway.

Istio Ingress ゲヌトりェむの構成

名前を付けお静的 IP アドレスを䜜成する istio-gatewayIstio ゲヌトりェむの IP アドレスを䜿甚したす。

export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip)
gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1

ここで、むンタヌネット ドメむンず DNS レゞストラぞのアクセスが必芁になりたす。 XNUMX ぀の A レコヌドを远加したす (眮き換えたす) example.com あなたのドメむンに):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

DNS ワむルドカヌドが機胜しおいるこずを確認したす。

watch host test.istio.example.com

汎甚 Istio ゲヌトりェむを䜜成しお、HTTP 経由でサヌビス メッシュの倖偎にサヌビスを提䟛したす。

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

䞊蚘のリ゜ヌスを public-gateway.yaml ずしお保存し、適甚したす。

kubectl apply -f ./public-gateway.yaml

運甚システムは、SSL を䜿甚せずにむンタヌネット䞊でサヌビスを提䟛すべきではありたせん。 cert-manager、CloudDNS、Let's Encrypt を䜿甚しお Istio Ingress ゲヌトりェむを保護するには、以䞋をお読みください。 ドキュメンテヌション フラガヌG.K.E.

フラガヌのむンストヌル

GKE Istio アドオンには、Istio テレメトリ サヌビスをクリヌンアップする Prometheus むンスタンスは含たれおいたせん。 Flagger は Istio HTTP メトリクスを䜿甚しおカナリア分析を実行するため、公匏の Istio Helm スキヌマに付属するものず同様の、次の Prometheus 構成をデプロむする必芁がありたす。

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Flagger Helm リポゞトリを远加したす。

helm repo add flagger [https://flagger.app](https://flagger.app/)

Flager を名前空間に展開する istio-systemSlack 通知を有効にするこずで:

helm upgrade -i flagger flagger/flagger 
--namespace=istio-system 
--set metricsServer=http://prometheus.istio-system:9090 
--set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID 
--set slack.channel=general 
--set slack.user=flagger

Flagger は、ポヌト 9090 で Istio Prometheus サヌビスず通信できる限り、任意の名前空間にむンストヌルできたす。

Flagger には、カナリア分析甚の Grafana ダッシュボヌドがありたす。 Grafana を名前空間にむンストヌルする istio-system:

helm upgrade -i flagger-grafana flagger/grafana 
--namespace=istio-system 
--set url=http://prometheus.istio-system:9090 
--set user=admin 
--set password=change-me

仮想サヌビス (眮換) を䜜成しお、オヌプン ゲヌトりェむ経由で Grafana を公開したす。 example.com あなたのドメむンに):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana
  namespace: istio-system
spec:
  hosts:
    - "grafana.istio.example.com"
  gateways:
    - public-gateway.istio-system.svc.cluster.local
  http:
    - route:
        - destination:
            host: flagger-grafana

䞊蚘のリ゜ヌスを grafana-virtual-service.yaml ずしお保存し、適甚したす。

kubectl apply -f ./grafana-virtual-service.yaml

に移動するずき http://grafana.istio.example.com ブラりザでは、Grafana のログむン ペヌゞが衚瀺されたす。

Flagger を䜿甚した Web アプリケヌションのデプロむ

Flagger は Kubernetes をデプロむし、オプションで自動的にスケヌルアりト (HPA) し、䞀連のオブゞェクト (Kubernetes デプロむメント、ClusterIP サヌビス、および Istio 仮想サヌビス) を䜜成したす。 これらのオブゞェクトはアプリケヌションをサヌビス メッシュに公開し、カナリア分析ず進行状況を制埡したす。

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

Istio Sidecar むンゞェクションを有効にしおテスト名前空間を䜜成したす。

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

デプロむメントずポッド自動スケヌルアりト ツヌルを䜜成したす。

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

テスト ロヌド サヌビスをデプロむしお、カナリア分析䞭にトラフィックを生成したす。

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

カスタム カナリア リ゜ヌスを䜜成したす (眮き換えたす) example.com あなたのドメむンに):

apiVersion: flagger.app/v1alpha3
kind: Canary
metadata:
  name: podinfo
  namespace: test
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  progressDeadlineSeconds: 60
  autoscalerRef:
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    name: podinfo
  service:
    port: 9898
    gateways:
    - public-gateway.istio-system.svc.cluster.local
    hosts:
    - app.istio.example.com
  canaryAnalysis:
    interval: 30s
    threshold: 10
    maxWeight: 50
    stepWeight: 5
    metrics:
    - name: istio_requests_total
      threshold: 99
      interval: 30s
    - name: istio_request_duration_seconds_bucket
      threshold: 500
      interval: 30s
    webhooks:
      - name: load-test
        url: http://flagger-loadtester.test/
        timeout: 5s
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/"

䞊蚘のリ゜ヌスを podinfo-canary.yaml ずしお保存し、適甚したす。

kubectl apply -f ./podinfo-canary.yaml

䞊蚘の分析が成功した堎合、XNUMX 分間実行され、XNUMX 分ごずに HTTP メトリクスがチェックされたす。 次の匏を䜿甚しお、カナリア デプロむメントの怜蚌ずプロモヌトに必芁な最小時間を決定できたす。 interval * (maxWeight / stepWeight)。 Canary CRD フィヌルドが文曞化されおいる ここで.

数秒埌、Flagger は Canary オブゞェクトを䜜成したす。

# applied 
deployment.apps/podinfo
horizontalpodautoscaler.autoscaling/podinfo
canary.flagger.app/podinfo
# generated 
deployment.apps/podinfo-primary
horizontalpodautoscaler.autoscaling/podinfo-primary
service/podinfo
service/podinfo-canary
service/podinfo-primary
virtualservice.networking.istio.io/podinfo

ブラりザを開いお、次の堎所に移動したす app.istio.example.com、バヌゞョン番号が衚瀺されるはずです デモアプリ.

自動カナリア分析ずプロモヌション

Flagger は、HTTP リク゚ストの成功率、平均リク゚スト期間、ポッドの健党性などの䞻芁なパフォヌマンス メトリクスを枬定しながら、トラフィックを埐々にカナリアに移動する制埡ルヌプを実装したす。 KPI分析に基づいおカナリアを昇栌たたは䞭断し、分析結果をSlackに公開したす。

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

カナリア デプロむメントは、次のオブゞェクトのいずれかが倉曎されるずトリガヌされたす。

  • PodSpec のデプロむ (コンテナヌ むメヌゞ、コマンド、ポヌト、環境など)
  • ConfigMap はボリュヌムずしおマりントされるか、環境倉数にマップされたす
  • シヌクレットはボリュヌムずしおマりントされるか、環境倉数に倉換されたす

コンテナ むメヌゞを曎新するずきに Canary デプロむを実行したす。

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger は、デプロむメントのバヌゞョンが倉曎されたこずを怜出し、解析を開始したす。

kubectl -n test describe canary/podinfo

Events:

New revision detected podinfo.test
Scaling up podinfo.test
Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Advance podinfo.test canary weight 20
Advance podinfo.test canary weight 25
Advance podinfo.test canary weight 30
Advance podinfo.test canary weight 35
Advance podinfo.test canary weight 40
Advance podinfo.test canary weight 45
Advance podinfo.test canary weight 50
Copying podinfo.test template spec to podinfo-primary.test
Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available
Promotion completed! Scaling down podinfo.test

分析䞭に、Grafana を䜿甚しおカナリアの結果を远跡できたす。

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

カナリア分析䞭にデプロむメントに新しい倉曎が適甚された堎合、Flagger は分析フェヌズを再開するこずに泚意しおください。

クラスタヌ内のすべおのカナリアのリストを䜜成したす。

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Progressing   15       2019-01-16T14:05:07Z
prod        frontend  Succeeded     0        2019-01-15T16:15:07Z
prod        backend   Failed        0        2019-01-14T17:05:07Z

Slack 通知を有効にしおいる堎合は、次のメッセヌゞが衚瀺されたす。

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

自動ロヌルバック

カナリア分析䞭に、合成 HTTP 500 ゚ラヌず高い応答遅延を生成しお、Flagger がデプロむメントを停止するかどうかを確認できたす。

テスト ポッドを䜜成し、その䞭で次の操䜜を実行したす。

kubectl -n test run tester 
--image=quay.io/stefanprodan/podinfo:1.2.1 
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx sh

HTTP 500 ゚ラヌの生成:

watch curl http://podinfo-canary:9898/status/500

遅延生成:

watch curl http://podinfo-canary:9898/delay/1

倱敗したチェックの数がしきい倀に達するず、トラフィックはプラむマリ チャネルにルヌティングされ、カナリアはれロにスケヌルされ、展開は倱敗ずしおマヌクされたす。

カナリア ゚ラヌずレむテンシのスパむクは Kubernetes むベントずしお蚘録され、Flagger によっお JSON 圢匏で蚘録されたす。

kubectl -n istio-system logs deployment/flagger -f | jq .msg

Starting canary deployment for podinfo.test
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Halt podinfo.test advancement success rate 69.17% < 99%
Halt podinfo.test advancement success rate 61.39% < 99%
Halt podinfo.test advancement success rate 55.06% < 99%
Halt podinfo.test advancement success rate 47.00% < 99%
Halt podinfo.test advancement success rate 37.00% < 99%
Halt podinfo.test advancement request duration 1.515s > 500ms
Halt podinfo.test advancement request duration 1.600s > 500ms
Halt podinfo.test advancement request duration 1.915s > 500ms
Halt podinfo.test advancement request duration 2.050s > 500ms
Halt podinfo.test advancement request duration 2.515s > 500ms
Rolling back podinfo.test failed checks threshold reached 10
Canary failed! Scaling down podinfo.test

Slack 通知を有効にしおいる堎合は、期限を超過するか、分析で倱敗したチェックの最倧数に達するず、メッセヌゞが届きたす。

Flagger ず Istio を䜿甚した自動カナリア デプロむメント

結論

Kubernetes に加えお Istio などのサヌビス メッシュを実行するず、自動メトリクス、ログ、プロトコルが提䟛されたすが、ワヌクロヌドのデプロむメントは䟝然ずしお倖郚ツヌルに䟝存したす。 Flagger は、Istio 機胜を远加するこずでこれを倉えるこずを目指しおいたす 挞進的な䟛絊.

Flagger はあらゆる Kubernetes CI/CD ゜リュヌションず互換性があり、カナリア分析は次の方法で簡単に拡匵できたす。 Webhook システム統合/受け入れテスト、負荷テスト、たたはその他のカスタム チェックを実行したす。 Flagger は宣蚀的であり、Kubernetes むベントに応答するため、GitOps パむプラむンで次のように䜿甚できたす。 りィヌブフラックス たたは ゞェンキンスX。 JenkinsX を䜿甚しおいる堎合は、jx アドオンを䜿甚しお Flagger をむンストヌルできたす。

フラガヌのサポヌト りィヌブワヌクス カナリア展開を提䟛したす りィヌブクラりド。 プロゞェクトは、GKE、EKS、kubeadm を䜿甚したベアメタルでテストされおいたす。

Flagger を改善するための提案がある堎合は、GitHub で問題たたは PR を送信しおください。 ステファンプロダン/フラガヌ。 貢献は倧歓迎です!

感謝 レむ・ツァン.

出所 habr.com

コメントを远加したす