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

Chaos Engineering with Chaos Mesh

Chaos Engineering with Chaos Mesh

oracle4engineer

July 20, 2022
Tweet

More Decks by oracle4engineer

Other Decks in Technology

Transcript

  1. Chaos Engineering w/ Chaos Mesh Chaos Night #1 Shuhei Kawamura

    Cloud Solution Engineer Solutions Architect, Oracle Corporation Japan July 20, 2022
  2. Copyright © 2022, Oracle and/or its affiliates 2 • 日本オラクル株式会社

    • ソリューション・アーキテクト本部 • OCHaCafe メンバー • 担当領域 • Cloud Native, App Dev • Data Platform(Spark周り) • AI Services • Search Service with OpenSearch • (趣味) 認証・認可関連 • 趣味 • サウナ、料理、音楽、スノーボード 川村 修平 (Shuhei Kawamura) @shukawam Twitter/GitHub/Qiita
  3. Copyright © 2022, Oracle and/or its affiliates 3 • Cloud

    Native な環境(Kubernetes)用に設計されたカオスエンジニアリングプラットフォーム • https://chaos-mesh.org/ • 最新版は、v2.2.2 (※ 2022/07 現在) • Kubernertes v1.15 ~ 1.23 が動作対象 • https://chaos-mesh.org/docs/supported-releases/#how-we-determine-supported-kubernetes-versions • ユーザーフレンドリーな UI を提供 • 実験の作成や進行状況のモニター機能 • 豊富な実験タイプを CRD(Custom Resource Definitions) として提供 • Tool Integration • Grafana, GitHub Actions • 安全に実験を行うための機能をサポート • Dashboard に対する Kubernetes の RBAC 機能を用いた権限制御(Manager/Viewer) • 実験の対象範囲を制御する namespace でのフィルタリング Chaos Mesh Open Source Cloud-Native Chaos Engineering platform $ kubectl annotate ns $NAMESPACE chaos-mesh.org/inject=enabled
  4. Copyright © 2022, Oracle and/or its affiliates 4 fault types

    description PodChaos Pod の障害をシミュレート(failure, kill, container kill) NetworkChaos Pod 間の Network の障害をシミュレート(partition, loss, delay, duplicate, corrupt, bandwidth) DNSChaos DNS 障害をシミュレート(error, random) HTTPChaos HTTP 通信の障害をシミュレート(abort, delay, replace, patch) StressChaos CPU, RAM の競合をシミュレート IOChaos I/O 障害をシミュレート(latency, fault, modify) TimeChaos システム時間を変更し、summer time やその他時間に関連するイベントへ の適応をシミュレート KernelChaos カーネル障害をシミュレート(メモリ割り当ての例外、etc.) JVMChaos JVM の障害をシミュレート(exception, gc, latency, stress, etc.) AWSChaos AWS の障害をシミュレート(EC2 stop/restart, detach volume) GCPChaos GCP の障害をシミュレート(GCE stop/restart, disk loss) AzureChaos Azure の障害をシミュレート(VM stop/restart, disk detach) Fault Injection 豊富な種類の障害タイプを CRD(Custom Resource Definitions) として提供
  5. Copyright © 2022, Oracle and/or its affiliates 5 • 実験の作成方法

    • Web UI(Chaos Dashboard) から作成する • 簡易的な検証用途 • Web UI から入力した情報をもとに実験の定義(Manifest)を取得する • Manifest を書いて kubectl apply する • おすすめはこちら • 実行方法 • 一つの実験を一回だけ実行する • 一つの実験をスケジュール実行する • 一つ以上の実験をワークフローとして実行する 実験の作成方法と実行方法
  6. Copyright © 2022, Oracle and/or its affiliates 6 実行方法 #1

    一つの実験を一回だけ実行する kind: PodChaos # fault types(PodChaos, NetworkChaos, IOChaos, etc.) apiVersion: chaos-mesh.org/v1alpha1 metadata: namespace: chaos-testing name: pod-kill spec: selector: # 実験対象の絞り込み namespaces: - k8s-helidon-app labelSelectors: app: k8s-helidon-app mode: one # 実行モード(one/all/fixed/fixed-percent/random-max-percent) action: pod-kill # action gracePeriod: 0
  7. Copyright © 2022, Oracle and/or its affiliates 7 実行方法 #2

    一つの実験をスケジュール実行する kind: Schedule # Schedule 実行 apiVersion: chaos-mesh.org/v1alpha1 metadata: namespace: chaos-testing name: pod-kill-scheduled spec: schedule: 30 19 * * * # cron concurrencyPolicy: Forbid # 実験の同時実行許可(Allow/Forbid) historyLimit: 1 # 履歴の保持件数 type: PodChaos # fault types(PodChaos, NetworkChaos, IOChaos, etc.) podChaos: selector: # 実験対象の Pod を絞り込み namespaces: - k8s-helidon-app labelSelectors: app: k8s-helidon-app mode: one action: pod-kill gracePeriod: 0
  8. Copyright © 2022, Oracle and/or its affiliates 8 Chaos Mesh

    では、カオス実験のワークフローを作成するために、以下の機能を持つ 実行方法 #3 一つ以上の実験をワークフローとして実行する features description 直列(Serial)実行 複数の実験、タスクを順番に実行する 並列(Parallel)実行 複数の実験、タスクを並列に実行する(複雑な条件のシミュレートに有効) Custom Task 任意のコンテナイメージを用いて独自定義の処理を実行する。実行結果による条件分岐も可能 Suspend 待ち時間を発生させる Status Check ステータスの確認を行うタスク(HTTPのリクエストを発行し、ステータスコードを確認する) e.g. 定常状態の測定、イベントの注入、実験中の状態の測定を行い、完了後の通知を自動的に行うワークフロー Task Task HTTP Request Incoming Webhook PodChaos
  9. Copyright © 2022, Oracle and/or its affiliates 9 実行方法 #3

    一つ以上の実験をワークフローとして実行する apiVersion: chaos-mesh.org/v1alpha1 kind: Workflow # ワークフロー実行 metadata: name: pod-kill-workflow namespace: chaos-testing spec: entry: entry # ワークフローのエントリーポイント templates: - name: entry templateType: Serial # Serial 実行 deadline: 3m children: # 上から順番に実行される - k6-load-test-in-steady-state - event-injection
  10. Copyright © 2022, Oracle and/or its affiliates 10 実行方法 #3

    一つ以上の実験をワークフローとして実行する - name: k6-load-test-in-steady-state templateType: Task task: container: name: k6-load-test image: grafana/k6 command: # K6 を用いて、疑似トラフィックを再現 - k6 - run - "--out" - "influxdb=http://influxdb.shukawam.com/chaosjp" - "--vus" - "10" - "--duration" - "30s" - "script.js" volumeMounts: - mountPath: /home/k6 name: k6-script volumes: - name: k6-script configMap: name: k6-configmap import http from "k6/http"; import { check, sleep } from "k6"; export default function () { const res = http.get("http://helidon.shukawam.com/greet"); check(res, { "is status code 200": (r) => r.status === 200, }); sleep(1); }
  11. Copyright © 2022, Oracle and/or its affiliates 11 実行方法 #3

    一つ以上の実験をワークフローとして実行する - name: event-injection templateType: Parallel # Parallel 実行 deadline: 2m children: # 並列に実行される(Pod を kill しながら疑似トラフィックを流す) - pod-kill-random - k6-load-test-in-chaos-state - name: pod-kill-random templateType: PodChaos deadline: 1m podChaos: selector: namespaces: - k8s-helidon-app labelSelectors: app: k8s-helidon-app mode: one action: pod-kill
  12. Copyright © 2022, Oracle and/or its affiliates 12 実行方法 #3

    一つ以上の実験をワークフローとして実行する - name: k6-load-test-in-chaos-state templateType: Task task: container: name: k6-load-test image: grafana/k6 command: - k6 - run - "--out" - "influxdb=http://influxdb.shukawam.com/chaosjp" - "--vus" - "10" - "--duration" - "30s" - "script.js" volumeMounts: - mountPath: /home/k6 name: k6-script volumes: - name: k6-script configMap: name: k6-configmap import http from "k6/http"; import { check, sleep } from "k6"; export default function () { const res = http.get("http://helidon.shukawam.com/greet"); check(res, { "is status code 200": (r) => r.status === 200, }); sleep(1); }
  13. Copyright © 2022, Oracle and/or its affiliates 13 カオス実験の 4

    つのプロセス: 1. 定常状態を定義する • “app: k8s-helidon-app” のラベルが付いたPod がすべて Status: Running な状態で稼働している 2. 仮説を立てる • 任意の Pod を kill しても K8s のセルフヒーリングに より元の状態に戻る 3. 現実世界のイベントを反映する変数を導入する • Chaos Mesh(PodChaos) を用いて、ランダムに Pod を一つ kill してみる 4. 仮説を検証する Demo: Chaos Mesh Load Balancer OKE Inject PodChaos … $ kubectl get pods -w NAME READY STATUS RESTARTS AGE k8s-helidon-app-777b65c7-85n2v 1/1 Running 0 39m k8s-helidon-app-777b65c7-tr78g 1/1 Running 0 39m k8s-helidon-app-777b65c7-v64vb 1/1 Running 0 39m k8s-helidon-app-777b65c7-v64vb 1/1 Terminating 0 49m k8s-helidon-app-777b65c7-v64vb 1/1 Terminating 0 49m k8s-helidon-app-777b65c7-fvxlc 0/1 Pending 0 0s k8s-helidon-app-777b65c7-fvxlc 0/1 Pending 0 0s k8s-helidon-app-777b65c7-fvxlc 0/1 ContainerCreating 0 0s k8s-helidon-app-777b65c7-fvxlc 0/1 Running 0 1s k8s-helidon-app-777b65c7-fvxlc 1/1 Running 0 35s
  14. Copyright © 2022, Oracle and/or its affiliates 14 その他の話はこちらから! 参考

    https://speakerdeck.com/oracle4engineer/how-to-chaos-engineering
  15. Copyright © 2022, Oracle and/or its affiliates 15 • Chaos

    Engineering は、実験なので計画を立てたうえでやってみることが重要 • Chaos Mesh • Open Source Cloud-Native Chaos Engineering platform • リッチな UI、豊富な fault types、様々な Tool Integration、拡張性 • 安全に実験を行う仕組みも複数あり まとめ
  16. Copyright © 2022, Oracle and/or its affiliates 16 • 開発者・エンジニアにお届けするテクニカ

    ルな勉強会です • クラウドネイティブな時代に身に着けてお くべきテクノロジーを深掘りしていきます • テーマはオープン/デファクト・スタンダード を基準に選定し、Oracle固有な話題に はならないように、且つ学んだ知識は広く 応用が利くように、配慮しています Season 5 • Kubernetes Operator 超入門 • Kubernetes で並列分散処理 • Kubernetes のセキュリティ • 挑戦 TypeScript • 実験!カオスエンジニアリング • MLOps を始めよう! Season 6 is coming soon!
  17. Copyright © 2022, Oracle and/or its affiliates 17 #OCHaCafe History

    Season 1 • コンテナを使った CI/CD • Microservices の運用・管理 • Microservices な Java アプリケーション • Hyperledger Facric なアプリケーション設計入門ガイド • 避けては通れない!認証・認可 • 人にもマシンにもやさしい API のエコシステム Season 2 • これからはじめる!Kubernetes 基礎 • 一体何モノなの?GraalVM 入門 • Serverless な世界をのぞいてみよう! • Cloud Native 時代のモダン Java の世界 • 変幻自在♪ 広がる Kubernetes のエコシステム • Cloud Native × Streaming はじめの一歩 Season 3 • Cloud Native 流のストレージ管理 • サービス間通信のトレンド – gRPC & GraphQL 入門 • Kubernetes クラスタの管理術 • 挑戦!Java で Reactive プログラミング • 明解!NoSQL の勘所 • コンテナ・ランタイムの未来 Season 4 • 生体認証のイロハ • Kubernetes のネットワーク • CI/CD 最新事情 • マイクロサービスの認証・認可と JWT • Kubernetes のオートスケーリング • Observability 再入門 Season 5 • Kubernetes Operator 超入門 • Kubernetes で並列分散処理 • Kubernetes のセキュリティ • 挑戦!TypeScript • 実験!カオスエンジニアリング • MLOps を始めよう! OCHaCafe Premium (Oracle フォーカス spin-off) • Oracle Cloud で考える高可用性アーキテクチャ • クラウド・アプリケーションのパフォーマンス • Oracle Cloud Infrastructure Cloud Native 2021 • マイクロサービスとデータマネジメント • クラウドで実践する Enterprise Java アーカイブサイト >> https://developer.oracle.com/jp/cloud-hangout-cafe/