
Kubernetes-Treiber-Erweiterung für die Probes- und Actions-API des Chaos Toolkit
Dieses Projekt enthält Aktivitäten, wie Sonden (Probes) und Aktionen (Actions), die Sie aus Ihrem Experiment heraus über das Chaos Toolkit aufrufen können, um Chaos Engineering gegen die Kubernetes-API durchzuführen: einen Pod töten, ein StatefulSet oder einen Node entfernen ...
Damit das Paket aus Ihrem Experiment verwendet werden kann, muss es in der Python-Umgebung installiert sein, in der chaostoolkit bereits vorhanden ist.
$ pip install chaostoolkit-kubernetes
Um die Sonden und Aktionen aus diesem Paket zu nutzen, fügen Sie Folgendes zu Ihrer Experimentdatei hinzu:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
Das war's! Beachten Sie, wie die Aktion Ihnen die Möglichkeit gibt, einen Pod zufällig zu töten.
Bitte erkunden Sie die Dokumentation, um die vorhandenen Sonden und Aktionen zu sehen.
Beachten Sie, dass wir für die Netzwerk-, CPU- und Speicher-Stressoren auf das fantastische Chaos Mesh Projekt zurückgreifen, das eine großartige Oberfläche zur Injektion dieser Fehler bietet.
Sie müssen zuerst Chaos Mesh in Ihrem Cluster installieren, um sie zu verwenden.
Wenn Sie einen gültigen Eintrag in Ihrer ~/.kube/config-Datei für den Cluster haben, den Sie ansprechen möchten, dann ist nichts weiter zu tun.
Sie können KUBECONFIG angeben, um einen anderen Speicherort festzulegen.
$ export KUBECONFIG=/tmp/my-config
Sehr oft enthält Ihre Kubernetes-Konfiguration mehrere Einträge, und Sie müssen denjenigen als Standardkontext definieren, der verwendet werden soll, wenn er nicht explizit angegeben wird.
Sie können Ihren Standard natürlich mit kubectl config use-context KUBERNETES_CONTEXT ändern, aber Sie können dies auch explizit in Ihrem Experiment wie folgt tun:
{
"title": "Do we remain available in face of pod going down?",
"description": "We expect Kubernetes to handle the situation gracefully when a pod goes down",
"tags": ["kubernetes"],
"secrets": {
"k8s": {
"KUBERNETES_CONTEXT": "..."
}
},
"steady-state-hypothesis": {
"title": "Verifying service remains healthy",
"probes": [
{
"name": "all-our-microservices-should-be-healthy",
"type": "probe",
"tolerance": true,
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.probes",
"func": "microservice_available_and_healthy",
"arguments": {
"name": "myapp"
}
}
}
]
},
"method": [
{
"type": "action",
"name": "terminate-db-pod",
"secrets": ["k8s"],
"provider": {
"type": "python",
"module": "chaosk8s.pod.actions",
"func": "terminate_pods",
"arguments": {
"label_selector": "app=my-app",
"name_pattern": "my-app-[0-9]$",
"rand": true
}
},
"pauses": {
"after": 5
}
}
]
}
Sie müssen den geheimen Schlüssel KUBERNETES_CONTEXT auf den Namen des Kontextes setzen, den das Experiment verwenden soll. Stellen Sie außerdem sicher, dass Sie den Aktionen und Sonden die geheimen Einträge mitteilen, die ihnen übergeben werden sollen: "secrets": ["k8s"].
Wenn Sie von einem Pod aus laufen (nicht von Ihrem lokalen Rechner oder einer CI), existiert die Datei ./.kube/config nicht. Stattdessen finden Sie die Anmeldedaten unter /var/run/secrets/kubernetes.io/serviceaccount/token.
Um die Erweiterung darüber zu informieren, setzen Sie einfach CHAOSTOOLKIT_IN_POD über die Umgebungsvariable der Pod-Spezifikation:
env:
- name: CHAOSTOOLKIT_IN_POD
value: "true"
Bei Verwendung dieser Umgebungsvariable wird davon ausgegangen, dass das Experiment denselben Cluster anvisiert, von dem aus das Experiment läuft. Wenn Ihr Experiment einen anderen Cluster anvisiert, sollten Sie diese Variable nicht setzen. Stattdessen könnten Sie ein Volume mit einer Kubernetes-Konfiguration für den Zielcluster einbinden und KUBECONFIG darauf zeigen lassen.
Schließlich können Sie alle erforderlichen Anmeldeinformationen explizit an das Experiment wie folgt übergeben:
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_API_KEY": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_USERNAME": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_PASSWORD": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
{
"secrets": {
"kubernetes": {
"KUBERNETES_HOST": "http://somehost",
"KUBERNETES_CERT_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
},
"KUBERNETES_KEY_FILE": {
"type": "env",
"key": "SOME_ENV_VAR"
}
}
}
}
Bei einigen verwalteten Kubernetes-Clustern müssen Sie sich auch gegenüber der Plattform selbst authentifizieren, da die Kubernetes-Authentifizierung an sie delegiert wird.
Zusätzlich zu Ihren Kubernetes-Anmeldedaten (über die Datei ~/.kube/config) müssen Sie sich gegenüber der Google Cloud Platform selbst authentifizieren. Normalerweise geschieht dies über:
$ gcloud auth login
Dies kann aber auch durch das Setzen der Umgebungsvariable GOOGLE_APPLICATION_CREDENTIALS erreicht werden.
Wenn Sie weitere Funktionen zu diesem Paket beitragen möchten, sind Sie mehr als willkommen. Bitte forken Sie dieses Projekt, schreiben Sie Unit-Tests, um die vorgeschlagenen Änderungen abzudecken, implementieren Sie die Änderungen, stellen Sie sicher, dass sie den Formatierungsstandards entsprechen, und reichen Sie dann einen PR zur Überprüfung im Repository ein.
Weitere Informationen zu den Formatierungsstandards finden Sie im Abschnitt Formatierung.
Die Chaos-Toolkit-Projekte verlangen, dass alle Mitwirkenden bei jedem Commit, den sie in den Master-Branch des Repositorys einbringen möchten, eine Developer Certificate of Origin unterzeichnen. Bitte stellen Sie sicher, dass Sie die Regeln der DCO einhalten können, bevor Sie einen PR einreichen.
Wenn Sie an diesem Projekt entwickeln möchten, stellen Sie sicher, dass Sie die Entwicklungsabhängigkeiten installieren. Aber zuerst PDM installieren und dann die Abhängigkeiten installieren.
$ pdm install
Jetzt können Sie die Dateien bearbeiten, und sie werden automatisch von Ihrer Umgebung gesehen, sogar wenn Sie lokal über den chaos-Befehl laufen.
Um die Tests für das Projekt auszuführen, führen Sie Folgendes aus:
$ pdm run tests
Wir verwenden ruff, um den Code dieses Repositorys sowohl zu linten als auch zu formatieren.
Bevor Sie einen Pull Request stellen, empfehlen wir Ihnen, die Formatierung auf Ihren Code anzuwenden mit:
$ pdm run format
Dies formatiert automatisch jeden Code, der nicht den Formatierungsstandards entspricht.
Da einige Dinge von der Formatierung nicht abgedeckt werden, empfehlen wir Ihnen außerdem, Folgendes auszuführen:
$ pdm run lint
Um sicherzustellen, dass auch ungenutzte Import-Anweisungen/zu lange Strings usw. erkannt werden.