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

SLO策定までの道とChaosEngineeringを使った最適解の見つけ方 / SLO Ch...

sasaki
November 22, 2022

SLO策定までの道とChaosEngineeringを使った最適解の見つけ方 / SLO ChaosEngineering

CloudNative Days Tokyo 2022

sasaki

November 22, 2022
Tweet

More Decks by sasaki

Other Decks in Technology

Transcript

  1. 自己紹介 2 • 名前 ◦ 佐々木真也 • 所属 ◦ Chatwork株式会社

    ▪ 2020年6月〜 ▪ SRE部 マネージャー • Twitter ◦ @taishin • 趣味 ◦ サッカー観戦
  2. Chatworkとは 4 効率的に情報共有できる グループチャット 仕事の見える化ができる タスク管理 見落としがなくなる ファイル管理 いつでも会議ができる ビデオ/音声通話

    * BOXIL SaaS AWARD 2022「ランキング部門 コラボレーション部門賞」「ベスト評価賞 (初期設定の容易さNo.1、価格の満足度No.1)」を受賞 BOXIL「Chatwork」口コミ評価 * Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。 * 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定。
  3. Chatworkは利用者数No.1*のビジネスチャット 5 3月 リリース 10万社 突破! 20万社 突破! 導入社数 37万6000社以上!

    (2022年9月末日時点) 30万社 突破! * Nielsen NetView 及びNielsen Mobile NetView Customized Report 2022年5月度調べ月次利用者(MAU:Monthly Active User)調査。 * 調査対象はChatwork、Microsoft Teams、Slack、LINE WORKS、Skypeを含む47サービスをChatwork株式会社にて選定。
  4. SLI/SLOの現状 9 • 定義 ◦ SLI/SLOは定義されていて、Datadogにダッシュボードはあった ◦ ドキュメントは整備されていた • 運用

    ◦ 四半期ごとのビジネスレビューで数値は報告されていた ◦ 存在を知らない人が多かった
  5. 一般的なSLI/SLOの運用の理想 11 • 開発者の認識 ◦ SLI/SLOを把握し、信頼性を考慮している • SLO違反ポリシーが制定されている ◦ エラーバジェットを超過したら信頼性の改善作業をするとか

    • 変更プロセス ◦ 変更はCTO承認が必要 とか • 全社的なコンセンサス ◦ 経営層やビジネスサイドにも合意がとれている とか ◦ SLOを元に意思決定・優先順位づけをする とか
  6. SLI/SLOの見直し 14 • 構成 ◦ アプリケーションは Kubernetes(EKS)上に構築 ◦ EC2で稼働していたPHPアプリケー ションをコンテナ化して移行

    ▪ https://creators-note.chatwork. com/entry/2021/01/13/144022 https://aws.amazon.com/jp/solutions/case-studies/chatwork/
  7. SLI/SLOの見直し 15 • 現状のSLI/SLO SLI SLO ウィンドウ サイト全体の可用性 サイト全体のHTTPレスポン スコードが5xx以外である割

    合がXXX%以上 30日間 サイト全体のレイテンシ サイト全体のレスポンスが YYYms以内である割合が XXX%以上 30日間
  8. 何をSLIにするか? 16 • 参照 ◦ サイトリライアビリティワークブック ◦ SLO決定のためのArt of SLO

    ▪ https://sre.google/intl/ja_jp/resources/practices-and-processes /art-of-slos/ ◦ 優れた SLO を策定するには : CRE が現場で学んだこと ▪ https://cloud.google.com/blog/ja/products/gcp/building-good-slos-cre -life-lessons サービスの種類 SLIの種類 説明 リクエスト駆動 可用性 レスポンスに成功したリクエストの比率 リクエスト駆動 レイテンシ 閾値よりも高速に処理されたリクエストの比率 リクエスト駆動 品質 グレードが低下していない状態で返されたレスポンスの比率
  9. SLI/SLOの見直し 17 • 現状のSLI/SLO SLI SLO ウィンドウ サイト全体の可用性 サイト全体のHTTPレスポン スコードが5xx以外である割

    合がXXX%以上 30日間 サイト全体のレイテンシ サイト全体のレスポンスが YYYms以内である割合が XXX%以上 30日間 現状の値から収まりそ うなところ
  10. SLI/SLOの見直し 18 • 現状のSLI/SLO SLI SLO ウィンドウ サイト全体の可用性 サイト全体のHTTPレスポン スコードが5xx以外である割

    合がXXX%以上 30日間 サイト全体のレイテンシ サイト全体のレスポンスが YYYms以内である割合が XXX%以上 30日間 現状の平均値のXX倍
  11. SLOをどれくらいにするか? 19 • 参照 ◦ サイトリライアビリティワークブック “前作『SRE サイトリライアビリティエンジニアリング』では、不 必要に厳しいSLOを設定することになりかねないことから、現状の パフォーマンスに基づいてSLOを選択しないようにアドバイスしま

    した。このアドバイスは正しいものの、他に情報がまったくなく、 イテレーションのための良いプロセスがあるのであれば(これにつ いては後ほど取り上げます)、現状のパフォーマンスは良い出発点 となりえます。”
  12. 周知を拡大 21 • 想定される現象(1) ◦ 責任範囲が不明確 ◦ 今後もチームは増える・・・ 開発チーム A

    開発チーム B 開発チーム C ・・・ サイト全体のレスポンス が悪くなっていて、SLO 違反になっているので調 査お願いします ・・・ ・・・
  13. 想定される現象(1) への対応 22 • CUJ - クリティカルユーザージャーニー ごとにSLOを設定する ユーザーが 1

    つの目的を達成するために行うサービスとの一連のインタラクション(1 回の クリックやマルチステップ パイプラインなど)。 例: 「ユーザーが購入手続きボタンをクリックし、カートが処理されて領収書が返されるレス ポンスを待ちます。」 • クリティカルユーザージャーニー ◦ SLO の定義 ▪ https://cloud.google.com/architecture/defining-SLOs?hl=ja
  14. 想定される現象(1) への対応 23 • CUJ - クリティカルユーザージャーニー ごとにSLOを設定する SLO process

    overview 1. List out critical user journeys and order them by business impact. 2. Determine which metrics to use as service-level indicators (SLIs) to most accurately track the user experience. 3. Determine SLO target goals and the SLO measurement period. 4. Create SLI, SLO, and error budget consoles. 5. Create SLO alerts. • 本来最初にやるべきこと ◦ Setting SLOs: a step-by-step guide ▪ https://cloud.google.com/blog/products/management-tools/practi cal-guide-to-setting-slos?hl=en
  15. 想定される現象(1) への対応 24 • CUJ - クリティカルユーザージャーニー ごとにSLOを設定する ◦ 例

    CUJ 担当 パス SLI SLO ファイル TeamA /add_xxx 可用性 5xx以外が99.9% レイテンシ 1000ms以内が99% /delete_xxx 可用性 5xx以外が99.9% レイテンシ 500ms以内が99% タスク TeamB /add_xxx 可用性 5xx以外が99.9% レイテンシ 500ms以内が99% /delete_xxx 可用性 5xx以外が99.9% レイテンシ 300ms以内が99% ・・・ ・・・ ・・・ ・・・ ・・・
  16. 想定される現象(1) への対応 25 • SLOの担当が明確 開発チーム A 開発チーム B 開発チーム

    C タスク機能のレスポンス が悪くなっていて、SLO 違反になっているので調 査お願いします 対応します!
  17. Chaos Engineeringの原則 33 • カオスエンジニアリングは、システムが本番環境における不安定な状態に耐える能力へ自信を 持つためにシステム上で実験を行う訓練方法です。 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である

    ◦ 本番環境で検証を実行する ◦ 継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ 予測できない複雑なシステムで 仮説を立てた上でコントロールされた実験を行う
  18. Chaos Mesh 35 • 2020年7月 CNCFサンドボックスプロジェクトとして承認 • 2020年9月 Chaos Mesh

    1.0リリース • 特徴 ◦ Easy to Use ◦ Design for Kubernetes ◦ A wide variety of failure types ◦ Safe and Controllable https://chaos-mesh.org/
  19. アーキテクチャ 36 • Chaos Dashboard ◦ Webインターフェイスを提供 • Chaos Controller

    Manager ◦ コントロールする ◦ スケジュール • Chaos Daemon ◦ DaemonSetで稼働 ◦ 実際にNodeやPodへ影響を与える https://chaos-mesh.org/docs/
  20. HTTPChaos (HTTP Fault) 40 • 2021年8月 にGAになったv2.0からサ ポート • HTTPのRequest/Responseに以下を注入で

    きる ◦ abort ▪ interrupts the connection ◦ delay ▪ injects latency ◦ replace ▪ replaces part of content ◦ patch ▪ adds additional content ◦ https://chaos-mesh.org/docs/simul ate-http-chaos-on-kubernetes/
  21. Experimentsの定義 & 適用 (Manifest) 42 • Manifestを作成する • kubectl applyする

    • 同じテストの繰り返しや 値の変更はしやすい • 慣れるとこれが一番ラク kind: HTTPChaos # タイプを指定 apiVersion: chaos-mesh.org/v1alpha1 metadata: name: http-delay spec: selector: # 適用範囲の設定 namespaces: - default labelSelectors: app: nginx-app mode: all target: Response # Response or Request port: 80 # ポート番号 path: '/test*' # Pathも指定できる delay: 1s # レイテンシを注入 replace: code: 500 # Status Codeを変更する headers: server: nginx-test # ヘッダを書き換え
  22. Experimentsの定義 & 適用 (AWS FIS) 43 • AWS Fault Injection

    Simulator ◦ AWSが提供しているフォールトインジェクション実験を実施するフルマネージド サービス ◦ EKS上でChaos Meshの実行をサポート ▪ Action Type • aws:eks:inject-kubernetes-custom-resource
  23. Experimentsの定義 & 適用 (AWS FIS) 44 1. ExperienceのManifest作成 → JSON変換

    2. EKS側でRoleの作成とaws-authの修正 3. AWS側で実験テンプレートの作成 → 実行
  24. Experimentsの定義 & 適用 (AWS FIS) 45 • EKS側でRoleの作成とaws-authの修正 ◦ ClusterRole

    or Roleを作成 • configmap/aws-auth に追加 apiVersion: rbac.authorization.k8s.io/v1 kind: ClusterRole metadata: name: chaosmesh rules: - apiGroups: [""] resources: ["pods", "namespaces"] verbs: ["get", "watch", "list"] - apiGroups: ["chaos-mesh.org"] resources: ["*"] verbs: ["get", "list", "watch", "create", "delete", "patch", "update"] data: mapRoles: | - groups: - system:masters rolearn: arn:aws:iam::123456789012:role/AWSFISIAMRole-XXXXXXXX username: "chaosmesh" FISの実験テンプレートで指 定するIAM Role ARNを指定
  25. Experimentsの定義 & 適用 (AWS FIS) 47 • Good ◦ AWSのユーザー管理で対応できる

    ◦ 履歴が見れる • Bad ◦ JSON変換面倒 • ExperienceやWorkflowを別途作成して同じテストを繰り返し・・・別の人でも実行で きるように・・・みたいな使い方かな
  26. Chaos Engineeringの原則 52 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である ◦ 本番環境で検証を実行する ◦

    継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ Production環境で測定した状態を定 常状態として再現、それを観測でき る環境が必要
  27. Chaos Engineeringの原則 53 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である ◦ 本番環境で検証を実行する ◦

    継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ SLIである可用性とレイテンシの異常 を再現する
  28. Chaos Engineeringの原則 54 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である ◦ 本番環境で検証を実行する ◦

    継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ 利用に影響があることを確認するた め、Productionとは別環境で実施
  29. Chaos Engineeringの原則 55 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である ◦ 本番環境で検証を実行する ◦

    継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ chaos-meshを使い、実験の自動化
  30. Chaos Engineeringの原則 56 ◦ 定常状態における振る舞いの仮説を立てる ◦ 実世界の事象は多様である ◦ 本番環境で検証を実行する ◦

    継続的に実行する検証の自動化 ◦ 影響範囲を局所化する https://principlesofchaos.org/ja/ CUJごとに実験を実施
  31. 実験環境 61 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール 実験を行う用と通常処理用という分け方で

    Deploymentを2つに分け、それぞれ別の TargetGroupに割り当てる (TargetBindingを使用) 実験対象のTargetGroup 通常処理のTargetGroup
  32. 実験環境 64 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール 実験対象のExperiments

    • レイテンシ • 500エラー 等 実験対象のTargetGroup 通常処理のTargetGroup 通常処理のExperiments • 通常トラフィックをシュミレーションす るためのレイテンシ • トラフィックコントロールのためのヘッ ダ修正 ◦ Connection、Cache-Control等
  33. 策定したSLOの例 66 • 可用性 ◦ メッセージアップデート(/update)の ◦ HTTPレスポンスコードが5xx以外である割合が ◦ 99.9%以上

    • レイテンシ ◦ メッセージアップデート(/update)の ◦ レスポンスが1s以内である割合が ◦ 99%以上
  34. 策定したSLOの例 67 • 可用性 ◦ メッセージアップデート(/update)の ◦ HTTPレスポンスコードが5xx以外である割合が ◦ 99.9%以上

    • レイテンシ ◦ メッセージアップデート(/update)の ◦ レスポンスが1s以内である割合が ◦ 99%以上
  35. レイテンシ実験 68 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール ルール

    • パスが /update → 転送先 : TargetGroup1 • それ以外 → 転送先 : TargetGroup2 通常処理のExperience delay: 200ms レイテンシテストのExperience delay: 1s
  36. レイテンシ実験 69 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール ルール

    • パスが /update → 転送先 : TargetGroup1 • それ以外 → 転送先 : TargetGroup2 /update → レイテンシ 1s それ以外 → レイテンシ 200ms 使用感の確認 想定どおりであることの確認 通常処理のExperience delay: 200ms レイテンシテストのExperience delay: 1s
  37. レイテンシ実験 70 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール ルール

    • パスが /update → 転送先 : TargetGroup1 • それ以外 → 転送先 : TargetGroup2 /update → レイテンシ 1s それ以外 → レイテンシ 200ms 使用感の確認 想定どおりであることの確認 この値の変更を試して最適値を見つける 通常処理のExperience delay: 200ms レイテンシテストのExperience delay: 1s
  38. NetworkChaosでもいいんじゃないの? 71 • NetworkChaos ◦ 特定のPodにネットワークの問 題を発生させる • ヘルスチェックや、DBへの通信、 その他サービスへの通信、Podが発

    生する通信すべてに影響するた め、指定した値よりもレイテンシ が大きくなりやすく、コントロー ルが難しかった
  39. HTTPChaosのPathで分ければいいのでは? 72 CloudFront TargetGroup1 ALB 体験者 負荷試験ツール Path: * のExperience

    delay: 200ms Path: /update のExperience delay: 1s target: Response path: '/update*' delay: 1s target: Response path: '*' delay: 200ms • TargetGroupを分けずにHTTPChaos のパラメータであるpathで振り分け ◦ これでもOK ◦ 実験した環境では同じ対象に2つ のExperimentsを適用すると応 答がなくなった・・・ ◦ 問題ない構成もあり、原因は不 明
  40. 策定したSLOの例 74 • 可用性 ◦ メッセージアップデート(/update)の ◦ HTTPレスポンスコードが5xx以外である割合が ◦ 99.9%以上

    • レイテンシ ◦ メッセージアップデート(/update)の ◦ レスポンスが1s以内である割合が ◦ 99%以上
  41. 策定したSLOの例 75 • 可用性 ◦ メッセージアップデート(/update)の ◦ HTTPレスポンスコードが5xx以外である割合が ◦ 99.9%以上

    • レイテンシ ◦ メッセージアップデート(/update)の ◦ レスポンスが1s以内である割合が ◦ 99%以上
  42. 可用性実験 76 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール ルール

    • パスが /update → 転送先 : TargetGroup1 Weight:1 → 転送先 : TargetGroup2 Weight: 999 • それ以外 → 転送先 : TargetGroup2 通常処理のExperience delay: 200ms 可用性テストのExperience response: 500 設定できる値が1〜1000までな ので、99.9%までは再現可能
  43. 可用性実験 77 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール /updateの0.01%

    → 500エラー /updateの99.9% → 200 OK それ以外 → 200 OK 使用感の確認 想定どおりであることの確認 通常処理のExperience delay: 200ms レイテンシテストのExperience response: 500 ルール • パスが /update → 転送先 : TargetGroup1 Weight:1 → 転送先 : TargetGroup2 Weight: 999 • それ以外 → 転送先 : TargetGroup2
  44. 可用性実験 82 CloudFront TargetGroup1 TargetGroup2 モニタリング ALB 体験者 負荷試験ツール /updateの1.5%

    → 500エラー /updateの98.5% → 200 OK それ以外 → 200 OK 使用感の確認 想定どおりであることの確認 通常処理のExperience delay: 200ms レイテンシテストのExperience response: 500 ルール • パスが /update → 転送先 : TargetGroup1 Weight:15 → 転送先 : TargetGroup2 Weight: 985 • それ以外 → 転送先 : TargetGroup2 この比率を変更して、最適解を検討する
  45. ハマったポイント 84 • Experience実行したタイミングで、既存のセッションに影響あるかも? ◦ DBへの接続がタイムアウトになる ◦ 対応策 ▪ ちょっと待つ

    ▪ 外部接続するようなProbeは無効化した • Experience終了時、対象のPodがまったく通信できなくなる ◦ 対応策 ▪ 都度deployment restart で対応 • 同じ対象に複数のExperienceを適用するとそのPodがまったく通信できなくなる ◦ TargetGroupを分けた • HTTPChaosのネタがまだまだ少ない・・・
  46. まとめ 86 • SLI/SLOの周知に考慮したこと ◦ 責任の明確化のためにCUJごとにSLOを設定 ◦ SLOへの納得感をもってもらうためにシミュレーションして最適値を探した • Chaos

    Enginneringはコントロールすることが重要 • Chaos Meshは簡単にChaos Engineeringを実行できる • Chaos EngineeringでSLO違反のシミュレーションができる
  47. Chatworkその他のセッション 88 • Kubernetesとterraformのセキュリティ/ガバナンス向上委員会 with OPA ◦ Track D 2022/11/21

    13:20-14:00 ◦ Keisuke Furuya • ArgoCDとGitHub Actions Self Hosted Runnerを使ってリリース時間を1/4に した話 ◦ Track C 2022/11/21 15:20-16:00 ◦ Ryo Sakamoto