Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EKSとArgo Rolloutsで実現する「Chatwork」の新リリースプロセス

hanayo04
November 15, 2024

EKSとArgo Rolloutsで実現する「Chatwork」の新リリースプロセス

2024/11/15 実践DevOps! 〜KAGとkubellの取り組み〜 でお話しした「EKSとArgo Rolloutsで実現する「Chatwork」の新リリースプロセス」の資料です

hanayo04

November 15, 2024
Tweet

More Decks by hanayo04

Other Decks in Technology

Transcript

  1. 自己紹介 桝谷 花世 (Masutani Hanayo) 所属 株式会社 kubell    コミュニケーションプラットフォーム本部    SRE部 ~2023/09

    SIerにて主にインフラ領域を担当 2023/10~ 株式会社kubell SRE部に入社         主にKubernetes周辺を担当 x: hnchn87
  2. 「Chatwork」とは ※※Nielsen NetView 及びNielsen Mobile NetView Customized Report 2024年4月度調べ月次利用者(MAU:Monthly Active

    User)調査。 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む41サービスを株式会社kubellにて選定。 効率的に情報共有できる グループチャット 仕事の見える化ができる タスク管理 見落としがなくなる ファイル管理 いつでも会議ができる ビデオ/音声通話
  3. 通常リリースフロー App Manifest EKS(app) EKS (manager) Manifest 1.Master merge 3.Push

    2.Build 4.Update 5. Polling 7.Apply 開発者 6. Press the Sync button Service Pod Pod Pod Pod Pod Pod ver.1 ver.2 Rolling Update
  4. カナリアリリース時のリリースフロー App Manifest EKS(app) EKS (manager) Manifest 1.Master merge 3.Push

    2.Build 5. Polling 6.Apply 開発者 Service Pod Pod Pod ver.1 Service Pod Pod Pod SRE 4.Create ver.2 SRE 7.Modify the weight
  5. Argo Rolloutsを導入 App Manifest EKS(app) EKS (manager) Manifest 1.Master merge

    3.Push 2.Build 4.Update 5. Polling 7.Apply 開発者 6. Press the Sync button Service Pod Pod Pod Pod ver.1 ver.2 Argo Rollouts Canary
  6. Argo Rolloutsの導入 Argo RolloutsをInstall 各ClusterにArgo Rolloutsを公式のHelmを使用してInstall Argo Rolloutsのダッシュボードは無効化  開発者が見る場所を増やしたくなかったため values.yaml

    dashboard: # -- Deploy dashboard server enabled: false Argo CDのダッシュボードに Argo Rolloutsのダッシュボードを統合 Argo CDのHelmのextensionsを有効にし、Argo Rolloutsのextensionを追加 extensions: enabled: true extensionList: - name: rollout-extension env: - name: EXTENSION_URL value: https://github.com/argoproj-labs/rollout-extension/releases/download/v0.3.5/extension.tar 指定方法がArgo CDのversionで 結構変わるので注意
  7. Deployment → Rolloutへの移行 Rolloutリソースを作成 Deploymentの設定を参照したいのでWorkloadRefを使用 作成時はreplicaCountは0 apiVersion: argoproj.io/v1alpha1 kind: Rollout

    spec: replicaCount: 0 strategy: canary: maxSurge: 25% maxUnavailable: 10% step: - setWeight: 25 - pause: {} - setWeight: 75 - pause: { duration: 30s } - setWeight: 100 workloadRef: apiVersion: apps/v1 kind: Deployment name: app stepブロックを定義しなければ RollingUpdateの挙動にすることも可能 apiVersion: apps/v1 kind: Deployment metadata: name: app labels:xxx spec: image: xxx replicaCount: 4 strategy: RollingUpdate: maxSurge: 25% maxUnavailable: 10% type: RollingUpdate
  8. Deployment → Rolloutへの移行 DeploymentのHPAを停止 移行時に予期せぬAutoScaleが発生すると嫌なのでHPAを停止 RolloutのReplica数を増やし、 Rolloutリソースを起動 100%ではなくまずは全体の25%分を起動し、アクセスを流す メトリクスやログを確認し、問題がなさそうか確認 DeploymentのReplica数を減らす

    Rolloutを増やしただけDeploymentを減らす メトリクスやログを確認し、問題がなさそうか確認 apiVersion: argoproj.io/v1alpha1 kind: Rollout spec: replicaCount: 1 strategy: canary: maxSurge: 25% maxUnavailable: 10% step: - setWeight: 25 - pause: {} - setWeight: 75 - pause: { duration: 30s } - setWeight: 100 workloadRef: apiVersion: apps/v1 kind: Deployment name: app
  9. Deployment → Rolloutへの移行 全てがRolloutになるまで少しずつ Rolloutの割合を増やしていく RolloutのHPAを有効化 全てがRolloutに入れ替わったらHPAの参照先をRolloutにし、有効化 apiVersion: autoscaling/v2 kind:

    HorizontalPodAutoscaler spec: scaleTargetRef: apiVersion: argoproj.io/v1alpha1 kind: Rollout name: app 移行完了! メトリクスやログを確認し問題なければ移行完了
  10. カナリアリリースフロー カナリアリリースのステップを定義 開発者がやりたいカナリアリリースのステップを記載 apiVersion: argoproj.io/v1alpha1 kind: Rollout spec: ~~ #

    step: # - setWeight: 25 # - pause: {} # - setWeight: 75 # - pause: { duration: 30s } # - setWeight: 100 apiVersion: argoproj.io/v1alpha1 kind: Rollout spec: ~~ step: - setWeight: 25 - pause: {} - setWeight: 75 - pause: { duration: 30s } - setWeight: 100 通常時はRolling Updateにしたいの でstepブロックはコメントアウト カナリアリリースしたい場合、 stepのコメントアウトを外し、 やりたい方法でstepを記載する
  11. カナリアリリースフロー App Manifest EKS(app) EKS (manager) Manifest 1.Master merge 3.Push

    2.Build 4.Update 5. Polling 7.Apply 開発者 6. Press the Sync button Service Pod Pod Pod Pod ver.1 ver.2 通常フローと同じ手順でリリース