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


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

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

基本を理解する

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

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

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

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

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

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

あの時、僕は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は将来的に改善されます。