Dieses Dokument wurde mithilfe automatisierter maschineller Übersetzungstechnologie übersetzt. Wir bemühen uns um korrekte Übersetzungen, übernehmen jedoch keine Gewähr für die Vollständigkeit, Richtigkeit oder Zuverlässigkeit der übersetzten Inhalte. Im Falle von Abweichungen ist die englische Originalversion maßgebend und stellt den verbindlichen Text dar.

Dies ist eine unveröffentlichte Dokumentation für Admission Controller 1.34-dev.

Tracing-Kurzanleitung

Dieser Abschnitt zeigt, wie Sie die Tracing-Unterstützung für den Policy Server aktivieren.

Bevor Sie fortfahren, stellen Sie sicher, dass Sie den vorherigen OpenTelemetry Abschnitt dieser Dokumentation abgeschlossen haben. Es ist erforderlich, damit dieser Abschnitt korrekt funktioniert.

Tracing ermöglicht es Ihnen, detaillierte Informationen über die Richtlinienbewertungen zu sammeln. Es kann ein nützliches Werkzeug zur Fehlersuche bei Problemen in Ihrer SUSE Security Admission Controller Bereitstellung und den Richtlinien sein.

Sie verwenden Jaeger --, um Trace-Ereignisse zu empfangen, zu speichern und zu visualisieren.

Installieren Sie Jaeger

Sie verwenden den Jaeger Operator, um alle verschiedenen Jaeger-Komponenten zu verwalten. Sie können den Jaeger-Operator mit Helm-Charts installieren.

Zum Zeitpunkt des Schreibens (2022-06-21) sind nur bestimmte Versionen von Jaeger mit Cert Manager kompatibel, siehe das Kompatibilitätsdiagramm.

Um das Helm-Chart zu installieren:

helm repo add jaegertracing https://jaegertracing.github.io/helm-charts

helm upgrade -i --wait \
  --namespace jaeger \
  --create-namespace \
  --version 2.49.0 \
  jaeger-operator jaegertracing/jaeger-operator \
  --set rbac.clusterRole=true

Dies ist nicht für die Produktionsbereitstellung geeignet. Sie sollten die offizielle Dokumentation von Jaeger lesen.

Um eine Jaeger-Ressource zu erstellen:

kubectl apply -f - <<EOF
apiVersion: jaegertracing.io/v1
kind: Jaeger
metadata:
  name: my-open-telemetry
  namespace: jaeger
spec: {}
EOF

Nach der Erstellung der Jaeger-Operator-Ressourcen haben Sie einen Service unter my-open-telemetry-collector.jaeger.svc.cluster.local. Die Jaeger Query UI wird durch den my-open-telemetry-query Service im jaeger Namespace bereitgestellt.

Installieren Sie Admission Controller

Jetzt können Sie mit der Bereitstellung von Admission Controller auf die übliche Weise fortfahren.

Das cert-manager ist eine Voraussetzung für OpenTelemetry, aber Sie haben es bereits in einem vorherigen Abschnitt dieser Dokumentation installiert.

Als ersten Schritt fügen Sie das Helm-Repository hinzu, das Admission Controller enthält:

helm repo add kubewarden https://charts.kubewarden.io

Dann installieren Sie die benutzerdefinierten Ressourcenbeschreibungen (CRDs), die von Admission Controller definiert sind:

helm install --wait \
  --namespace kubewarden \
  --create-namespace \
  kubewarden-crds kubewarden/kubewarden-crds

Jetzt können Sie den Rest des Admission Controller Stacks bereitstellen. Das offizielle kubewarden-defaults Helm-Chart erstellt einen PolicyServer mit dem Namen default. Sie möchten, dass diese PolicyServer-Instanz das Tracing aktiviert hat.

Um das zu tun, müssen Sie einige zusätzliche Werte für das kubewarden-controller Chart angeben. Sie sollten eine values.yaml Datei mit folgendem Inhalt erstellen:

telemetry:
  mode: sidecar
  tracing: True
  sidecar:
    tracing:
      jaeger:
        endpoint: "my-open-telemetry-collector.jaeger.svc.cluster.local:4317"
        tls:
          insecure: true

Zur Vereinfachung gibt es keine Verschlüsselung der Kommunikation zwischen dem OpenTelemetry Collector und dem Jaeger-Endpunkt.

Wiederum ist dies ungeeignet für eine Produktionsbereitstellung. Konsultieren Sie die offizielle Dokumentation von Jaeger.

Dann können Sie mit der Installation der Helm-Charts fortfahren:

helm install --wait --namespace kubewarden --create-namespace \
  --values values.yaml \
  kubewarden-controller kubewarden/kubewarden-controller

helm install --wait --namespace kubewarden --create-namespace \
  kubewarden-defaults kubewarden/kubewarden-defaults

Dies erstellt die default Instanz von PolicyServer:

kubectl get policyservers.policies.kubewarden.io
NAME      AGE
default   3m7s

Wenn Sie sich den Pod, der die PolicyServer-Instanz ausführt, genauer ansehen, können Sie sehen, dass er zwei Container enthält. Der policy-server und der OpenTelemetry Collector-Sidecar otc-container.

Durchsetzung einer Richtlinie

Sie beginnen mit der Bereitstellung der safe-labels Richtlinie.

Sie möchten, dass die Richtlinie nur in Namespaces durchgesetzt wird, die ein Label environment mit einem Wert von production haben.

Zu einem Namespace, der ein solches Label hat:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-prod
  labels:
    environment: production
EOF

Als Nächstes können Sie eine ClusterAdmissionPolicy definieren:

kubectl apply -f - <<EOF
apiVersion: policies.kubewarden.io/v1
kind: ClusterAdmissionPolicy
metadata:
  name: safe-labels
spec:
  module: registry://ghcr.io/kubewarden/policies/safe-labels:v0.1.6
  settings:
    mandatory_labels:
    - owner
  rules:
    - apiGroups:
        - apps
      apiVersions:
        - v1
      resources:
        - deployments
      operations:
        - CREATE
        - UPDATE
  namespaceSelector:
    matchExpressions:
    - key: environment
      operator: In
      values: ["production"]
  mutating: false
EOF

Sie müssen warten, bis die Richtlinie aktiv wird:

kubectl wait --for=condition=PolicyActive clusteradmissionpolicy/safe-labels

Sobald die Richtlinie aktiv ist, können Sie es versuchen:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  namespace: team-alpha-prod
  labels:
    owner: octocat
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

Die Richtlinie erlaubt die Erstellung dieses Deployment-Objekts, da sie die Richtlinie nicht verletzt.

Die Richtlinie blockiert dieses Deployment-Objekt:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-prod
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

Die Richtlinie wird in einem anderen Namespace nicht durchgesetzt.

Dieser Befehl erstellt einen neuen Namespace mit dem Namen team-alpha-staging:

kubectl apply -f - <<EOF
apiVersion: v1
kind: Namespace
metadata:
  name: team-alpha-staging
  labels:
    environment: staging
EOF

Die Richtlinie erlaubt die Erstellung einer Deployment-Ressource ohne Labels im Namespace team-alpha-staging:

kubectl apply -f - <<EOF
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment-without-labels
  namespace: team-alpha-staging
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 0
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80
EOF

Wie erwartet, wird diese Ressource erfolgreich erstellt.

Erkundung der Jaeger UI

Sie können die Trace-Ereignisse sehen, die von der PolicyServer-Instanz an Jaeger gesendet werden, da ein neuer Dienst kubewarden-policy-server in der UI aufgeführt ist:

Jaeger dashboard

Der Jaeger-Collector empfängt die von Ihrem PolicyServer generierten Traces.

Wenn Sie Traefik im vorherigen Leitfaden installiert haben, geben Sie die Jaeger Query UI mit diesem Ingress frei:

kubectl apply -f - <<EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: my-open-telemetry-query
  namespace: jaeger
spec:
  ingressClassName: traefik
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: my-open-telemetry-query
                port:
                  number: 16686
EOF

Um auf die Jaeger UI mit Traefik zuzugreifen, führen Sie aus:

kubectl -n traefik port-forward service/traefik 8080:80

Gehen Sie dann zu http://localhost:8080.

Wenn Sie Traefik umgehen möchten, greifen Sie direkt auf Jaeger zu:

kubectl -n jaeger port-forward service/my-open-telemetry-query 16686

Gehen Sie dann zu http://localhost:16686.