LoginSignup
7
2

More than 3 years have passed since last update.

Chaos Mesh・Kubernetesのカオス上の舞う

Posted at

Chaos Mesh・Kubernetesのカオス上の舞う

Chaos Meshは、コンテナ化されたアプリケーシュンのカオステスト、またクラウドネイティブするためのオープンソースツールキットです。

基本を理解する

カオステストが必要な理由

カオスはプロダクション運用環境で頻繁に発生します、マシン障害、ネットワーク障害など。その故障を対応ために、人間は多くの試みをしました。単体テストはコードモジュールの安定性の保障するように、カオステストは故障対応手段の安定性の保証ために。

マーフィーの法則とは、「失敗する余地があるなら、失敗する」。システムが大複雑で大規模になるほど、潜在的なバグが多くなります。たとえ、プロダクション運用環境と同じサイズの開発環境でも、まだいくつかのバグをミスします。しかし、コストを節約するために、開発環境通常は小さい。ハードドライブが損傷する確率は1時間あたり0.0001%であると仮定します、100台のハードドライブのクラスターが10,000時間実行される、1台のハードディスクが破損する可能性がが高い。でも、開発環境では、その可能性は非常に低い、カオステストはこの障害状況をシミュレートすることである。

クラウドネイティブの理由

カオスは複数の方法で実装できます、時間のカオスをシミュレートするためにシステム時間調整する、ネットワークのカオスをシミュレートするためのiptablesを使用したファイアウォールのセットアップします。自分の経験からクラウドネイティブを選んだ理由を説明します。

PingCAPでは、非常に早い段階でカオステストを開始しました。初に、SSH経由でマシンにカオスを設定します。

sshで構成されたカオス.png

あの時、僕はTiDB用のカオステストツールを作成しました。tidb-ansibleを使用してTiDBを展開する、そして、データベースに接続するロードプログラムを実行します、同時にカオス操作を実行します。

大事な問題は、このテストフレームワークもバグあります。たとえ、tidb-ansibleTiDBの展開に失敗した、iptablesのルール削除に失敗したなど(次のテストの環境汚染を引き起こす)。

他の問題があります:

  • リソース使用率は低い
  • 問題が発生した場合、プログラムの実行状態を記述するために、次のテストを停止します
  • ログ収集を行う必要があります
  • 複数のクラスターを同時テスト実行出来る、でも新しいのクラスタ、は環境を手動で構成必要があります
  • ...

まとめとして、このテストスーツ使用では、多くの場合、手動介入が必要です。

クラウドネイティブのアドバンテージ

  • Kubernetesはリソースを適切に管理し、テストに標準環境を提供します
  • TiDB Operatorは、TiDBクラスタを管理できます
  • Chaos MeshTiDB Operatorなどのユニットに分割

クラウドネイティブの欠陥

  • 部分的な障害のシミュレートできません、たとえば、電源を切る

Chaos Meshを試す

Helm使用して、Chaos Mesh展開

公式ドキュメント:https://github.com/pingcap/chaos-mesh#deploy-chaos-mesh

Helmチャートを取得する

git clone https://github.com/pingcap/chaos-mesh.git
cd chaos-mesh/

カスタムリソースをインストール

kubectl apply -f manifests/
# CRD を確認する
kubectl get crd podchaos.pingcap.com
kubectl get crd networkchaos.pingcap.com
kubectl get crd iochaos.pingcap.com
kubectl get crd timechaos.pingcap.com

通常、コンテナランタイムはDocker。もし他のコンテナランタイム使用する、ドキュメントを参照してください

# 名前空間を作成する
kubectl create ns chaos-testing
# helm 2.X
helm install helm/chaos-mesh --name=chaos-mesh --namespace=chaos-testing
# helm 3.X
helm install chaos-mesh helm/chaos-mesh --namespace=chaos-testing
# Chaos Mesh pods を確認する
kubectl get pods --namespace chaos-testing -l app.kubernetes.io/instance=chaos-mesh

テストしてみましょう

テストコンテナを実行する

kubectl create ns hello-chaos
kubectl -n hello-chaos create deployment kubernetes-bootcamp --image=gcr.io/google-samples/kubernetes-bootcamp:v1

カオスを設定する

例:https://github.com/pingcap/chaos-mesh/blob/master/examples/pod-kill-example.yaml

apiVersion: pingcap.com/v1alpha1
kind: PodChaos
metadata:
  name: hello-pod-kill
  namespace: chaos-testing
spec:
  action: pod-kill
  mode: one
  selector:
    namespaces:
      - hello-chaos
    labelSelectors:
      "app": "kubernetes-bootcamp"
  scheduler:
    cron: "@every 1m"

pod killを適用するした、そして動作するか確認する

# pod kill を適用する
kubectl apply -f hello-pod-kill.yaml
# pod 再起動を確認する
watch -n 1 kubectl -n hello-chaos get pods

今後の仕事

現在のChaos Meshにはいくつかの欠陥がであり

  • カオスの追加は面倒です
  • カオスイベントは視覚的に表示できません

作業効率を向上させます、より良い体験のために、Chaos Meshは将来的に改善されます。

7
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
2