Zum Hauptinhalt springen
Version: 2.6.7

Erweitern der Chaos-Daemon-Schnittstelle

Inoffizielle Beta-Übersetzung

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.

Tipp

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.

  1. Fügen Sie den RPC in pkg/chaosdaemon/pb/chaosdaemon.proto hinzu:

    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
  2. Implementieren Sie den gRPC-Service in Chaos Daemon.

    Erstellen Sie im Verzeichnis pkg/chaosdaemon eine Datei namens helloworld_server.go mit 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-daemon die ExecHelloWorldChaos-Anfrage erhält, sehen Sie eine Prozessliste des aktuellen Containers.

  3. Senden Sie eine gRPC-Anfrage bei der Anwendung des Chaos-Experiments.

    Jedes Chaos-Experiment hat einen Lebenszyklus: apply (Anwenden) und anschließend recover (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 im HelloWorldChaos-Schema definiert haben.

    Der Chaos Controller Manager muss eine Anfrage an den Chaos Daemon senden, wenn HelloWorldChaos in der apply-Phase ist. Implementieren Sie dies durch Anpassung von controllers/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
    }
    Hinweis

    Für HelloWorldChaos ist keine Wiederherstellung erforderlich, da HelloWorldChaos ein 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:

  1. Erstellen Sie die Docker-Images wie unter Neuen Chaos-Experimenttyp hinzufügen beschrieben und laden Sie sie in Ihren Cluster.

    Hinweis

    Bei 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.

  2. Update Chaos Mesh:

  3. Stellen Sie einen Test-Pod bereit:

    kubectl apply -f https://raw.githubusercontent.com/chaos-mesh/apps/master/ping/busybox-statefulset.yaml
  4. Erstellen Sie eine Datei hello-busybox.yaml mit folgendem Inhalt:

    apiVersion: chaos-mesh.org/v1alpha1
    kind: HelloWorldChaos
    metadata:
    name: hello-busybox
    namespace: chaos-mesh
    spec:
    selector:
    namespaces:
    - busybox
    mode: all
    duration: 1h
  5. 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 chaos in den Logs von chaos-controller-manager erscheint:

      kubectl logs -n chaos-mesh chaos-controller-manager-xxx

      Beispielausgabe:

      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-xxx

      Beispielausgabe:

      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!