
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"
}
}
}
}