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:
Selector
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 chaosdaemon
import (
"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.PbClient
containerId := 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/v1alpha1
kind: HelloWorldChaos
metadata:
name: hello-busybox
namespace: chaos-mesh
spec:
selector:
namespaces:
- busybox
mode: all
duration: 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!