Eureka Engineering
Published in

Eureka Engineering

Argo RolloutsとPairsのデリバリー戦略 -Progressive Deliveryへの移行-

はじめに

こちらは昨日食べたおいしい鰻(麻布十番 はなぶさ

Table of Contents

対象読者

  • EKSでインフラを構築している方
  • Argo Rolloutsを既に導入している方
  • Argo Rolloutsを利用したProgressive Deliveryに興味がある方

前提

  • EKS version 1.21
  • Argo Rollouts version 1.3.1
  • Istio version 1.15.0

Kubernetesにおけるアプリケーションのデリバリー方式

Rolling Update

  • 順番に新versionのPodを起動し、その分旧versionのPodを破棄していき、最終的に全てが新しいversionになるというデリバリー方式
  • Kubernetesで最初からサポートされているため、簡単に導入できる

Blue/Green Deploy

  • 新versionを旧versionと同数のPod数を起動してから、トラフィックの向き先を一気に切り替えるデリバリー方式
  • トラフィック切り替え前にテストなどを行ってリリース前に動作確認することができる
  • 自動で行うためには、ArgoCDなどのCDツールと連携したり、独自実装する必要がある

Canary Release

  • トラフィックを新version:旧versionを25:75 → 50:50 → 75:25 → 100:0 のように段階的に切り替えるデリバリー方式
  • 各ステップごとにモニタリングを行いながら段階的にリリースするため、問題が発生した時に切り戻すことで、障害影響範囲を軽減することができる
  • 自動で行うためには、ArgoCDなどのCDツールと連携したり、独自実装する必要がある

Progressive Deliveryとは

これまでのPairsデリバリー戦略と課題

  1. Blue/Greenによりすべてのトラフィックが新versionへ流れる
  2. エラーが発生し、http response code 5XXが返却されSLIが低下する
  3. アラート発報され、開発者やSREが手動ロールバックを行う
  4. ロールバックが完了し、復旧が完了する
  • リリース後に問題があった時にできるだけ素早く切り戻す(= MTTRをできるだけ短縮する)
  • リリースの影響範囲をできるだけ小さくする

Pairsの新しいデリバリー戦略

Argo Rollouts Canary StrategyとIstio Ingress Gateway

  • 開発者用のPullRequest環境(アプリケーションのPull Requestごとに動的に作成される検証環境)を実現するために既にIstioが導入されている
  • service meshの技術として今後採用予定なので早めに導入しておきたい
  • AWSリソース参照のしやすさから、ALBはterraformで管理したいため、AWS Load Balancer Controllerでingressを作成せずTargetGroupBindingのみ使用したい
図1 istioを利用したトラフィックルーティング
apiVersion: networking.istio.io/v1beta1
kind: Gateway
metadata:
name: sample-gateway
spec:
selector:
istio: ingressgateway # use istio default controller
servers:
- port:
number: 80
name: http
protocol: HTTP
hosts:
- sample.com
- sample-a.com
apiVersion: networking.istio.io/v1beta1
kind: VirtualService
metadata:
name: sample-virtualservice
spec:
hosts:
- sample-service-stable.sample-app.svc.cluster.local
- sample-service-canary.sample-app.svc.cluster.local
- sample.com
gateways:
- istio-system/sample-gateway
- mesh
http:
- name: sample-routes
retries:
attempts: 10
route:
- destination:
host: sample-service-stable.sample-app.svc.cluster.local
port:
number: 80
weight: 100
- destination:
host: sample-service-canary.sample-app.svc.cluster.local
port:
number: 80
weight: 0
  1. terminationDrainDuration (default 5s)で指定した期間、graceful drainモードに移行し、drainステータスで待機する。
  2. drainDuration (default 45s)で指定した期間、drainステータス中に新規リクエストを受け付ける。
  3. terminationGracePeriodSeconds (default 30s) で指定した時間が経過したら、SIGKILLによりPodが強制終了される。

Argo RolloutsによるProgressive Delivery

apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: request-error-rate
spec:
dryRun:
- metricName: error-rate
metrics:
- name: error-rate
interval: 1m
successCondition: default(result, 0) < 0.01
failureLimit: 5
provider:
datadog:
interval: 1m
query: |
sum:request.count{response_code:5*}.as_count()/
sum:request.count{response_code:*}.as_count()
  • Canaryのversionのみの、できるだけリアルタイムなメトリクス
apiVersion: argoproj.io/v1alpha1
kind: AnalysisTemplate
metadata:
name: request-error-rate
spec:
dryRun:
- metricName: error-rate
metrics:
- name: error-rate
interval: 1m
# SLOに合わせた閾値
successCondition: default(result, 0) < 0.005
failureLimit: 5
provider:
datadog:
interval: 1m
query: |
sum:istio.mesh.request.count.total{cluster_name:sample,destination_service:sample-service-stable.sample-app.svc.cluster.local,response_code:5*}.as_count()/
sum:istio.mesh.request.count.total{cluster_name:sample,destination_service:sample-service-canary.sample-app.svc.cluster.local}.as_count()
apiVersion: argoproj.io/v1alpha1
kind: Rollout
metadata:
name: sample-app
spec:
strategy:
canary:
# rollback高速化のために、stableのreplica数を維持したままcanaryリリースする
dynamicStableScale: false
stableMetadata:
labels:
revision: stable
canaryMetadata:
labels:
revision: canary
canaryService: sample-service-canary
stableService: sample-service-stable
trafficRouting:
istio:
virtualService:
name: sample-virtualservice
routes:
- sample-routes
analysis:
templates:
- templateName: request-error-rate
startingStep: 1
steps:
- setWeight: 25
- pause:
duration: 10m

################## 後略 ##################

Production環境へのProgressive Delivery導入

まとめ

--

--

Learn about Eureka’s engineering efforts, product developments and more.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store