Erweitern der Chaos-Daemon-Schnittstelle
Diese Seite wurde von PageTurner AI übersetzt (Beta). Nicht offiziell vom Projekt unterstützt. Fehler gefunden? Problem melden →
Im Dokument Hinzufügen eines neuen Chaos-Experimenttyps haben Sie HelloWorldChaos hinzugefügt, der Hello world! in den Protokollen des Chaos Controller Manager ausgibt.
Damit HelloWorldChaos Fehler in den Ziel-Pod injizieren kann, müssen Sie die Chaos-Daemon-Schnittstelle erweitern.
Wir empfehlen, die Architektur von Chaos Mesh zu lesen, bevor Sie fortfahren.
Dieses Dokument behandelt:
Selektor
In api/v1alpha1/helloworldchaos_type.go haben Sie HelloWorldSpec definiert, das ContainerSelector enthält:
// HelloWorldChaosSpec defines the desired state of HelloWorldChaos
type HelloWorldChaosSpec struct {
// ContainerSelector specifies the target for injection
ContainerSelector `json:",inline"`
// Duration represents the duration of the chaos
// +optional
Duration *string `json:"duration,omitempty"`
// RemoteCluster represents the remote cluster where the chaos will be deployed
// +optional
RemoteCluster string `json:"remoteCluster,omitempty"`
}
//...
// GetSelectorSpecs is a getter for selectors
func (obj *HelloWorldChaos) GetSelectorSpecs() map[string]interface{} {
return map[string]interface{}{
".": &obj.Spec.ContainerSelector,
}
}
In Chaos Mesh definiert der Selector den Umfang eines Chaos-Experiments, einschließlich Ziel-Namespace, Annotationen, Labels etc.
Selector können auch spezifischere Werte annehmen (z.B. AWSSelector in AWSChaos). Normalerweise benötigt jedes Chaos-Experiment nur einen Selector, mit Ausnahmen wie NetworkChaos, der bei Netzwerkpartitionierung manchmal zwei Selectoren für zwei Objekte benötigt.
Weitere Informationen zu Selectoren finden Sie unter Definieren des Umfangs von Chaos-Experimenten.
Implementierung der gRPC-Schnittstelle
Damit Chaos Daemon Anfragen von Chaos Controller Manager akzeptieren kann, müssen Sie eine neue gRPC-Schnittstelle implementieren.
-
Fügen Sie den RPC in
pkg/chaosdaemon/pb/chaosdaemon.protohinzu:service ChaosDaemon {...rpc ExecHelloWorldChaos(ExecHelloWorldRequest) returns (google.protobuf.Empty) {}}message ExecHelloWorldRequest {string container_id = 1;}Aktualisieren Sie anschließend die zugehörige
chaosdaemon.pb.go-Datei mit folgendem Befehl:make proto -
Implementieren Sie den gRPC-Service in Chaos Daemon.
Erstellen Sie im Verzeichnis
pkg/chaosdaemoneine Datei namenshelloworld_server.gomit folgendem Inhalt:package chaosdaemonimport ("context""github.com/golang/protobuf/ptypes/empty""github.com/chaos-mesh/chaos-mesh/pkg/bpm""github.com/chaos-mesh/chaos-mesh/pkg/chaosdaemon/pb")func (s *DaemonServer) ExecHelloWorldChaos(ctx context.Context, req *pb.ExecHelloWorldRequest) (*empty.Empty, error) {log := s.getLoggerFromContext(ctx)log.Info("ExecHelloWorldChaos", "request", req)pid, err := s.crClient.GetPidFromContainerID(ctx, req.ContainerId)if err != nil {return nil, err}cmd := bpm.DefaultProcessBuilder("sh", "-c", "ps aux").SetContext(ctx).SetNS(pid, bpm.MountNS).Build(ctx)out, err := cmd.Output()if err != nil {return nil, err}if len(out) != 0 {log.Info("cmd output", "output", string(out))}return &empty.Empty{}, nil}Nachdem
chaos-daemondieExecHelloWorldChaos-Anfrage erhält, sehen Sie eine Prozessliste des aktuellen Containers. -
Senden Sie eine gRPC-Anfrage bei der Anwendung des Chaos-Experiments.
Jedes Chaos-Experiment hat einen Lebenszyklus:
apply(Anwenden) und anschließendrecover(Zurücksetzen). Einige Chaos-Experimente lassen sich jedoch standardmäßig nicht zurücksetzen (z. B. PodKill in PodChaos und HelloWorldChaos). Diese werden als OneShot-Experimente bezeichnet. Dies erkennen Sie an+chaos-mesh:oneshot=true, das wir imHelloWorldChaos-Schema definiert haben.Der Chaos Controller Manager muss eine Anfrage an den Chaos Daemon senden, wenn
HelloWorldChaosin derapply-Phase ist. Implementieren Sie dies durch Anpassung voncontrollers/chaosimpl/helloworldchaos/types.go:func (impl *Impl) Apply(ctx context.Context, index int, records []*v1alpha1.Record, obj v1alpha1.InnerObject) (v1alpha1.Phase, error) {impl.Log.Info("Apply helloworld chaos")decodedContainer, err := impl.decoder.DecodeContainerRecord(ctx, records[index], obj)if err != nil {return v1alpha1.NotInjected, err}pbClient := decodedContainer.PbClientcontainerId := decodedContainer.ContainerId_, err = pbClient.ExecHelloWorldChaos(ctx, &pb.ExecHelloWorldRequest{ContainerId: containerId,})if err != nil {return v1alpha1.NotInjected, err}return v1alpha1.Injected, nil}func (impl *Impl) Recover(ctx context.Context, index int, records []*v1alpha1.Record, obj v1alpha1.InnerObject) (v1alpha1.Phase, error) {impl.Log.Info("Recover helloworld chaos")return v1alpha1.NotInjected, nil}HinweisFür
HelloWorldChaosist keine Wiederherstellung erforderlich, daHelloWorldChaosein OneShot-Experiment ist. Bei selbst entwickelten Chaos-Experimenttypen können Sie die Logik der Recovery-Funktion nach Bedarf implementieren.
Ausgabe von HelloWorldChaos überprüfen
So überprüfen Sie die Ausgabe von HelloWorldChaos:
-
Erstellen Sie die Docker-Images wie unter Neuen Chaos-Experimenttyp hinzufügen beschrieben und laden Sie sie in Ihren Cluster.
HinweisBei Verwendung von minikube: Einige minikube-Versionen können vorhandene Images mit gleichem Tag nicht überschreiben. Löschen Sie ggf. vorhandene Images vor dem Laden der neuen.
-
Update Chaos Mesh:
-
Stellen Sie einen Test-Pod bereit:
kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/apps/master/ping/busybox-statefulset.yaml -
Erstellen Sie eine Datei
hello-busybox.yamlmit folgendem Inhalt:apiVersion: chaos-mesh.org/v1alpha1kind: HelloWorldChaosmetadata:name: hello-busyboxnamespace: chaos-meshspec:selector:namespaces:- busyboxmode: allduration: 1h -
Führen Sie folgenden Befehl aus:
kubectl apply -f hello-busybox.yaml# helloworldchaos.chaos-mesh.org/hello-busybox created-
Überprüfen Sie nun, ob
Apply helloworld chaosin den Logs vonchaos-controller-managererscheint:kubectl logs -n chaos-mesh chaos-controller-manager-xxxBeispielausgabe:
2023-07-16T08:20:46.823Z INFO records records/controller.go:149 apply chaos {"id": "busybox/busybox-0/busybox"}2023-07-16T08:20:46.823Z INFO helloworldchaos helloworldchaos/types.go:27 Apply helloworld chaos -
Überprüfen Sie die Logs von Chaos Daemon:
kubectl logs -n chaos-mesh chaos-daemon-xxxBeispielausgabe:
2023-07-16T08:20:46.833Z INFO chaos-daemon.daemon-server chaosdaemon/server.go:187 ExecHelloWorldChaos {"namespacedName": "chaos-mesh/hello-busybox", "request": "container_id:\"docker://5e01e76efdec6aa0934afc15bb80e121d58b43c529a6696a01a242f7ac68f201\""}2023-07-16T08:20:46.834Z INFO chaos-daemon.daemon-server.background-process-manager.process-builder pb/chaosdaemon.pb.go:4568 build command {"namespacedName": "chaos-mesh/hello-busybox", "command": "/usr/local/bin/nsexec -m /proc/104710/ns/mnt -- sh -c ps aux"}2023-07-16T08:20:46.841Z INFO chaos-daemon.daemon-server chaosdaemon/server.go:187 cmd output {"namespacedName": "chaos-mesh/hello-busybox", "output": "PID USER TIME COMMAND\n 1 root 0:00 sh -c echo Container is Running ; sleep 3600\n"}2023-07-16T08:20:46.856Z INFO chaos-daemon.daemon-server chaosdaemon/server.go:187 ExecHelloWorldChaos {"namespacedName": "chaos-mesh/hello-busybox", "request": "container_id:\"docker://bab4f632a0358529f7d72d35e014b8c2ce57438102d99d6174dd9df52d093e99\""}2023-07-16T08:20:46.864Z INFO chaos-daemon.daemon-server.background-process-manager.process-builder pb/chaosdaemon.pb.go:4568 build command {"namespacedName": "chaos-mesh/hello-busybox", "command": "/usr/local/bin/nsexec -m /proc/104841/ns/mnt -- sh -c ps aux"}2023-07-16T08:20:46.867Z INFO chaos-daemon.daemon-server chaosdaemon/server.go:187 cmd output {"namespacedName": "chaos-mesh/hello-busybox", "output": "PID USER TIME COMMAND\n 1 root 0:00 sh -c echo Container is Running ; sleep 3600\n"}
Sie sehen zwei separate
ps aux-Ausgaben, die zwei verschiedenen Pods entsprechen. -
Nächste Schritte
Bei Problemen während der Umsetzung können Sie ein Issue im Chaos Mesh Repository erstellen.
Falls Sie neugierig sind, wie diese Abläufe funktionieren, lesen Sie als nächstes die controllers/README.md und den Code der verschiedenen Controller.
Herzlichen Glückwunsch! Sie sind nun bereit, Chaos Mesh-Entwickler zu werden. Stöbern Sie gerne in den Chaos Mesh Issues, um ein good first issue zu finden und loszulegen!