- Überblick
- Anforderungen
- Bereitstellungsvorlagen
- Anleitung: Vorbereiten der Installation
- Anleitung: Vorbereiten der Installation
- Schritt 2: Konfigurieren der OCI-konformen Registrierung für Offline-Installationen
- Schritt 3: Konfigurieren des externen Objektspeichers
- Schritt 4: Konfigurieren des High Availability Add-on
- Schritt 5: Konfigurieren von SQL-Datenbanken
- Schritt 6: Konfigurieren des Lastausgleichs
- Schritt 7: Konfigurieren des DNS
- Schritt 8: Konfigurieren der Datenträger
- Schritt 9: Konfigurieren der Einstellungen auf Kernel- und Betriebssystemebene
- Schritt 10: Konfigurieren der Knotenports
- Schritt 11: Anwenden verschiedener Einstellungen
- Schritt 12: Validieren und Installieren der erforderlichen RPM-Pakete
- Schritt 13: Generieren von cluster_config.json
- Zertifikatkonfiguration
- Datenbankkonfiguration
- Konfiguration des externen Objektspeichers
- Vorsignierte URL-Konfiguration
- Konfiguration der Kerberos-Authentifizierung
- Externe OCI-konforme Registrierungskonfiguration
- Disaster Recovery: Aktiv/Passiv- und Aktiv/Aktiv-Konfigurationen
- Konfiguration des High Availability Add-ons
- Spezifische Orchestrator-Konfiguration
- Insights-spezifische Konfiguration
- Process Mining-spezifische Konfiguration
- Spezifische Konfiguration für Document Understanding
- Spezifische Konfiguration für Automation Suite Robots
- Konfiguration der Überwachung
- Optional: Konfigurieren des Proxyservers
- Optional: Aktivieren der Widerstandsfähigkeit gegen zonale Ausfälle in einem HA-fähigen Produktionscluster mit mehreren Knoten
- Optional: Übergeben einer benutzerdefinierten resolv.conf-Datei
- Optional: Erhöhen der Fehlertoleranz
- install-uipath.sh-Parameter
- Hinzufügen eines dedizierten Agent-Knotens mit GPU-Unterstützung
- Hinzufügen eines dedizierten Agent-Knotens für Task Mining
- Verbinden einer Task Mining-Anwendung
- Hinzufügen eines dedizierten Agentenknotens für Automation Suite-Roboter
- Schritt 15: Konfigurieren der temporären Docker-Registrierung für Offline-Installationen
- Schritt 16: Validieren der Voraussetzungen für die Installation
- Manuell: Durchführen der Installation
- Nach der Installation
- Clusterverwaltung
- Verwalten von Produkten
- Erste Schritte mit dem Clusterverwaltungsportal
- Migrieren vom clusterinternen zum externen High Availability Add-on
- Migrieren von der clusterinternen Registrierung zu einer externen OCI-konformen Registrierung
- Manueller Wechsel zum sekundären Cluster in einem Aktiv-/Passiv-Setup
- Disaster Recovery: Durchführen von Vorgängen nach der Installation
- Umwandlung einer bestehenden Installation in eine Multi-Site-Einrichtung
- Richtlinien zum Upgrade einer Aktiv/Passiv- oder Aktiv/Aktiv-Bereitstellung
- Leitlinien zum Sichern und Wiederherstellen einer Aktiv-/Passiv- oder Aktiv/Aktiv-Bereitstellung
- Umleitung des Datenverkehrs für die nicht unterstützten Dienste auf den primären Cluster
- Skalieren einer Bereitstellung mit einem einzelnen Knoten (Auswertung) zu einer Bereitstellung mit mehreren Knoten (HA).
- Überwachung und Warnungen
- Migration und Upgrade
- Schritt 1: Verschieben der Identitätsorganisationsdaten von einer eigenständigen in die Automation Suite
- Schritt 2: Wiederherstellen der eigenständigen Produktdatenbank
- Schritt 3: Sichern der Plattformdatenbank in der Automation Suite
- Schritt 4: Zusammenführen von Organisationen in der Automation Suite
- Schritt 5: Aktualisieren der migrierten Produktverbindungszeichenfolgen
- Schritt 6: Migrieren des eigenständigen Orchestrators
- Schritt 7: Migrieren von eigenständigen Insights
- Schritt 8: Migrieren des eigenständigen Test Managers
- Schritt 9: Löschen des Standardmandanten
- Durchführen der Migration eines einzelnen Mandanten
- Migrieren von der Automation Suite unter Linux zur Automation Suite unter EKS/AKS
- Aktualisieren der Automation Suite
- Herunterladen der Installationspakete und Übertragen aller Dateien auf den ersten Serverknoten
- Abrufen der zuletzt angewendeten Konfiguration aus dem Cluster
- Aktualisieren der Clusterkonfiguration
- Konfigurieren der OCI-konformen Registrierung für Offline-Installationen
- Ausführen des Upgrades
- Durchführen von Vorgängen nach dem Upgrade
- Produktspezifische Konfiguration
- Verwenden des Orchestrator-Konfiguratortools
- Konfigurieren von Orchestrator-Parametern
- Orchestrator-appSettings
- Konfigurieren von AppSettings
- Konfigurieren der maximalen Anforderungsgröße
- Überschreiben der Speicherkonfiguration auf Clusterebene
- Konfigurieren von Anmeldeinformationsspeichern
- Konfigurieren der Verwendung von einem Verschlüsselungsschlüssel pro Mandant
- Bereinigen der Orchestrator-Datenbank
- Best Practices und Wartung
- Fehlersuche und ‑behebung
- Fehlerbehebung bei Diensten während der Installation
- Deinstallieren des Clusters
- Löschen von Offline-Artefakten für mehr Speicherplatz
- So löschen Sie Redis-Daten
- So können Sie die Istio-Protokollierung aktivieren
- Verschieben von Ceph aus dem schreibgeschützten Modus
- So löschen Sie alte Protokolle, die im sf-logs-Bucket gespeichert sind
- So deaktivieren Sie Streaming-Protokolle für das AI Center
- Fehlerbehebung bei fehlgeschlagenen Automation Suite-Installationen
- So löschen Sie Bilder aus dem alten Installationsprogramm nach dem Upgrade
- Deaktivieren von TX-Prüfsummen-Offloading
- Upgrade von Automation Suite 2022.10.10 und 2022.4.11 auf 2023.10.2
- So legen Sie die ArgoCD-Protokollebene manuell auf Info fest
- So erweitern Sie den AI Center-Speicher
- So wird der codierte pull_secret_value für externe Registrierungen generiert
- Umgang mit schwachen Verschlüsselungen in TLS 1.2
- So arbeiten Sie mit Zertifikaten
- Weiterleiten von Anwendungsprotokollen an Splunk
- So löschen Sie ungenutzte Docker-Images aus Registrierungs-Pods
- Sammeln von DU-Nutzungsdaten mit dem clusterinternen Objektspeicher (Ceph)
- So installieren Sie RKE2 SELinux in Air-Gap-Umgebungen
- So löschen Sie alte differenzielle Sicherungen auf einem NFS-Server
- Es kann keine Offlineinstallation auf RHEL 8.4 OS ausgeführt werden.
- Fehler beim Herunterladen des Pakets
- Die Offlineinstallation schlägt aufgrund fehlender binärer Dateien fehl
- Voraussetzungsprüfung für das Selinux-iscsid-Modul schlägt fehl
- Azure-Datenträger nicht als SSD markiert
- Fehler nach der Zertifikatsaktualisierung
- Virenschutz verursacht Probleme bei der Installation
- Automation Suite funktioniert nach Betriebssystem-Upgrade nicht
- Bei der Automation Suite muss „backlog_wait_time“ auf 0 gesetzt werden.
- Volume nicht bereitstellbar, da es nicht für Workloads bereit ist
- Fehler bei der Protokollsammlung des Supportpakets
- SQL-Verbindungszeichenfolge der Testautomatisierung wird ignoriert
- DNS-Einstellungen werden von CoreDNS nicht berücksichtigt
- Datenverlust bei der Neuinstallation oder Aktualisierung von Insights nach dem Automation Suite-Upgrade
- Das Upgrade eines einzelnen Knotens schlägt in der Fabric-Phase fehl
- Upgrade schlägt aufgrund eines fehlerhaften Ceph . fehl
- Datenträger kann nicht verbunden werden und verbleibt im Status der „Attach/Detach“-Schleife
- Upgrade schlägt aufgrund von klassischen Objekten in der Orchestrator-Datenbank fehl
- Ceph-Cluster in beeinträchtigtem Status nach parallelem Upgrade
- Fehlerhafte Insights-Komponente verursacht Fehlschlag der Migration
- Dienst-Upgrade schlägt für Apps fehl
- Timeouts beim direkten Upgrade
- Docker-Registrierungsmigration bleibt in PVC-Löschphase hängen
- AI Center-Bereitstellungsfehler nach Upgrade auf 2023.10 oder höher
- Upgrade schlägt in Offline-Umgebungen fehl
- SQL-Validierung schlägt während des Upgrades fehl
- Snapshot-controller-crds Pod im Status CrashLoopBackOff nach dem Upgrade
- Fehler beim Upgrade/Neuinstallationsfehler des Longhorn REST API-Endpunkts
- Upgrade schlägt aufgrund überschriebener Insights-PVC-Größen fehl
- Das Dienst-Upgrade schlägt während der Skriptausführung vor dem Dienst fehl
- Fehler beim Hoch- oder Herunterladen von Daten im Objektspeicher
- Die Größenänderung eines PVC bewirkt keine Korrektur von Ceph
- Fehler beim Ändern der Größe von objectstore PVC
- Fehler beim Anhängen eines StatefulSet-Volumes
- Rook Ceph oder Looker-Pod hängen im Init-Status fest
- Fehler beim Komprimieren von Metriken aufgrund beschädigter Blöcke in Thenos
- Festlegen eines Timeout-Intervalls für die Verwaltungsportale
- Die Authentifizierung funktioniert nach der Migration nicht
- kinit: KDC kann für Realm <AD Domain> beim Abrufen der ersten Anmeldeinformationen nicht gefunden werden
- Kinit: Keytab enthält keine geeigneten Schlüssel für *** beim Abrufen der ersten Anmeldeinformationen
- GSSAPI-Vorgang aufgrund eines ungültigen Statuscodes fehlgeschlagen
- Alarm für fehlgeschlagenen Kerberos-tgt-update-Auftrag erhalten
- SSPI-Anbieter: Server in Kerberos-Datenbank nicht gefunden
- Anmeldung eines AD-Benutzers aufgrund eines deaktivierten Kontos fehlgeschlagen
- ArgoCD-Anmeldung fehlgeschlagen
- Fehler beim Abrufen des Sandbox-Abbilds
- Pods werden nicht in der ArgoCD-Benutzeroberfläche angezeigt
- Redis-Testfehler
- RKE2-Server kann nicht gestartet werden
- ArgoCD wechselt nach der ersten Installation in den Status „In Bearbeitung“.
- Manuelle Schadensbegrenzung bei ArgoCD NetworkPolicy (GHSA-47m3-95c7-g2g8)
- Fehlerhafte Dienste nach Clusterwiederherstellung oder Rollback
- Fehlende Ceph-rook-Metriken in Überwachungs-Dashboards
- Pods können nicht mit FQDN in einer Proxy-Umgebung kommunizieren
- Fehler beim Konfigurieren von E-Mail-Warnungen nach dem Upgrade
- Kein normales Upstream-Problem
- Fehler beim Hinzufügen von Agent-Knoten in Offline-Umgebungen
- Beim Zugriff auf den FQDN wird RBAC zurückgegeben: Zugriff verweigert
- Document Understanding erscheint nicht auf der linken Leiste der Automation Suite
- Fehlerstatus beim Erstellen einer Datenbeschriftungssitzung
- Fehlerstatus beim Versuch, eine ML-Fähigkeit bereitzustellen
- Migrationsauftrag schlägt in ArgoCD fehl
- Die Handschrifterkennung mit dem Intelligent Form Extractor funktioniert nicht oder arbeitet zu langsam
- Fehler bei der Bereitstellung von ML-Fähigkeiten aufgrund des Ablaufs des Tokens
- Ausführen von Hochverfügbarkeit mit Process Mining
- Die Process Mining-Datenaufnahme ist bei der Anmeldung über Kerberos fehlgeschlagen
- Nach Disaster Recovery funktioniert Dapr für Process Mining nicht mehr ordnungsgemäß
- Konfigurieren von Dapr mit Redis im Clustermodus
- Verbindung mit der Datenbank „AutomationSuite_ProcessMining_Lager“ über eine Verbindungszeichenfolge im pyodbc-Format nicht möglich
- Die Airflow-Installation schlägt mit „sqlaldemy.exc.ArgumentError“ fehl: URL konnte nicht analysiert werden rfc1738 aus Zeichenfolge „
- So fügen Sie eine IP-Tabellenregel hinzu, um den SQL Server-Port 1433 zu verwenden
- Dem Automation Suite-Zertifikat des Servers, auf dem CData Sync ausgeführt wird, wird nicht vertraut
- Ausführen des Diagnosetools
- Verwenden des Automation Suite-Supportpakets
- Erkunden von Protokollen
Lösungen für den nicht authentifizierten Netzwerkzugriff auf den ArgoCD-Repository-Server und Redis in Automation Suite mit einem manuellen Verfahren zur Schadensbegrenzung bei der Netzwerkrichtlinie.
Beschreibung
Eine Sicherheitslücke, welche die ArgoCD-Komponente repo-server betrifft, wurde kürzlich veröffentlicht und wird derzeit von ArgoCD noch nicht behoben.
ArgoCD repo-server (Port 8081) und ArgoCD Redis sind von jedem Pod im Clusternetzwerk aus erreichbar, da keine Netzwerkrichtlinie den Ingress standardmäßig auf diese Komponenten beschränkt. Infolgedessen kann jeder Pod innerhalb des Clusternetzwerks eine direkte Verbindung zu ihnen herstellen, da ArgoCD keine Authentifizierung für diese internen Komponenten erfordert. Weitere Informationen finden Sie unter GHSA-47m3-95c7-g2g8.
Um das Problem zu verringern, müssen Sie die Netzwerkrichtlinie manuell anwenden, die im Abschnitt „Lösung“ auf dieser Seite beschrieben ist.
Voraussetzungen
- Führen Sie dieses Verfahren von einem Host aus, der
kubectl-Zugriff auf den Cluster hat. - Das Verfahren geht von dem standardmäßigen Automation Suite Namespace
argocdaus. Wenn ArgoCD einen anderen Namespace verwendet, legen SieARGOCD_NSfest, bevor Sie das Skript ausführen. - Diese Schadensbegrenzung basiert auf der Durchsetzung der Kubernetes-Netzwerkrichtlinie. Von der Automation Suite unterstützte Cluster verwenden eine kompatible CNI-Konfiguration (Container Network Interface).
Lösung
-
Führen Sie das folgende Skript aus. Sie erkennt Ihre ArgoCD-Version und Ihren Redis-Modus (eigenständig oder Hochverfügbarkeit, HA) und wendet die passende Netzwerkrichtlinie automatisch an:
export ARGOCD_NS="${ARGOCD_NS:-argocd}" export ARGOCD_RELEASE="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.labels.app\.kubernetes\.io/instance}')" test -n "$ARGOCD_RELEASE" || { echo "Cannot detect Argo CD Helm release"; exit 1; } if kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" --no-headers 2>/dev/null | grep -q .; then REDIS_MODE=ha else REDIS_MODE=standalone fi echo "Argo CD namespace: $ARGOCD_NS" echo "Argo CD release: $ARGOCD_RELEASE" echo "Redis mode: $REDIS_MODE" cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-repo-server-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-applicationset-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-notifications-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 8081 - from: - namespaceSelector: {} ports: - protocol: TCP port: 8084 EOF if [ "$REDIS_MODE" = "ha" ]; then cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-ha-server-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha - podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha-haproxy ports: - protocol: TCP port: 6379 - protocol: TCP port: 26379 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-ha-haproxy-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha-haproxy app.kubernetes.io/name: argocd-redis-ha-haproxy policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 6379 EOF else cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: app.kubernetes.io/name: argocd-redis app.kubernetes.io/instance: ${ARGOCD_RELEASE} policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 6379 - from: - namespaceSelector: {} ports: - protocol: TCP port: 9121 EOF fiexport ARGOCD_NS="${ARGOCD_NS:-argocd}" export ARGOCD_RELEASE="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.labels.app\.kubernetes\.io/instance}')" test -n "$ARGOCD_RELEASE" || { echo "Cannot detect Argo CD Helm release"; exit 1; } if kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" --no-headers 2>/dev/null | grep -q .; then REDIS_MODE=ha else REDIS_MODE=standalone fi echo "Argo CD namespace: $ARGOCD_NS" echo "Argo CD release: $ARGOCD_RELEASE" echo "Redis mode: $REDIS_MODE" cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-repo-server-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-applicationset-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-notifications-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 8081 - from: - namespaceSelector: {} ports: - protocol: TCP port: 8084 EOF if [ "$REDIS_MODE" = "ha" ]; then cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-ha-server-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha - podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha-haproxy ports: - protocol: TCP port: 6379 - protocol: TCP port: 26379 --- apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-ha-haproxy-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: release: ${ARGOCD_RELEASE} app: redis-ha-haproxy app.kubernetes.io/name: argocd-redis-ha-haproxy policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 6379 EOF else cat <<EOF | kubectl apply -f - apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: argocd-redis-manual-mitigation namespace: ${ARGOCD_NS} spec: podSelector: matchLabels: app.kubernetes.io/name: argocd-redis app.kubernetes.io/instance: ${ARGOCD_RELEASE} policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app.kubernetes.io/name: argocd-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-repo-server app.kubernetes.io/instance: ${ARGOCD_RELEASE} - podSelector: matchLabels: app.kubernetes.io/name: argocd-application-controller app.kubernetes.io/instance: ${ARGOCD_RELEASE} ports: - protocol: TCP port: 6379 - from: - namespaceSelector: {} ports: - protocol: TCP port: 9121 EOF fi
überprüfen
Führen Sie die folgenden Befehle aus, um zu bestätigen, dass die Schadensbegrenzung erfolgreich angewendet wurde:
kubectl -n "$ARGOCD_NS" get networkpolicy
kubectl -n "$ARGOCD_NS" get pods
kubectl get applications.argoproj.io -A
kubectl -n "$ARGOCD_NS" get networkpolicy
kubectl -n "$ARGOCD_NS" get pods
kubectl get applications.argoproj.io -A
Bestätigen Sie Folgendes:
argocd-repo-server-manual-mitigationist vorhanden.- Für Redis HA sind
argocd-redis-ha-server-manual-mitigationundargocd-redis-ha-haproxy-manual-mitigationvorhanden. - Für eigenständiges Redis ist
argocd-redis-manual-mitigationvorhanden. - ArgoCD-Pods sind
RunningoderCompleted. - ArgoCD-Anwendungen bleiben
SyncedundHealthy.
Bestätigen Sie die Schadensbegrenzung
Führen Sie diese Prüfungen nach dem Anwenden der Richtlinien durch. Sie stellen sicher, dass der erforderliche ArgoCD-Datenverkehr weiterhin funktioniert und der unzulässige Datenverkehr blockiert ist.
-
Führen Sie das folgende Skript aus:
export ARGOCD_NS="${ARGOCD_NS:-argocd}" export ARGOCD_RELEASE="${ARGOCD_RELEASE:-$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.labels.app\.kubernetes\.io/instance}')}" if kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" --no-headers 2>/dev/null | grep -q .; then REDIS_MODE=ha else REDIS_MODE=standalone fi SERVER_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.name}')" APPSET_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-applicationset-controller -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)" FAILED_CHECKS="" tcp_check() { pod="$1" host="$2" port="$3" expected="$4" name="$5" code="$(kubectl -n "$ARGOCD_NS" exec "$pod" -- sh -c ' host="$1" port="$2" if command -v nc >/dev/null 2>&1; then timeout 5 nc -z -w 3 "$host" "$port" >/dev/null 2>&1 printf "%s\n" "$?" elif command -v bash >/dev/null 2>&1; then timeout 5 bash -c "</dev/tcp/${host}/${port}" >/dev/null 2>&1 printf "%s\n" "$?" else printf "%s\n" "NO_TCP_TOOL" fi ' sh "$host" "$port" 2>/dev/null | tail -n 1)" if [ "$expected" = "allow" ] && [ "$code" = "0" ]; then return elif [ "$expected" = "deny" ] && [ "$code" != "0" ] && [ "$code" != "NO_TCP_TOOL" ] && [ -n "$code" ]; then return else FAILED_CHECKS="${FAILED_CHECKS} - ${name}: expected ${expected}, got exit code ${code}" fi } tcp_check "$SERVER_POD" argocd-repo-server 8081 allow "argocd-server to repo-server:8081" if [ "$REDIS_MODE" = "ha" ]; then HAPROXY_POD="$(kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" -o jsonpath='{.items[0].metadata.name}')" tcp_check "$SERVER_POD" argocd-redis-ha-haproxy 6379 allow "argocd-server to redis-ha-haproxy:6379" tcp_check "$HAPROXY_POD" argocd-redis-ha 6379 allow "redis-ha-haproxy to redis-ha:6379" tcp_check "$HAPROXY_POD" argocd-repo-server 8081 deny "redis-ha-haproxy to repo-server:8081" if [ -n "$APPSET_POD" ]; then tcp_check "$APPSET_POD" argocd-redis-ha-haproxy 6379 deny "applicationset-controller to redis-ha-haproxy:6379" fi else REDIS_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-redis -o jsonpath='{.items[0].metadata.name}')" tcp_check "$SERVER_POD" argocd-redis 6379 allow "argocd-server to redis:6379" tcp_check "$REDIS_POD" argocd-repo-server 8081 deny "redis to repo-server:8081" if [ -n "$APPSET_POD" ]; then tcp_check "$APPSET_POD" argocd-redis 6379 deny "applicationset-controller to redis:6379" fi fi if [ -z "$FAILED_CHECKS" ]; then echo "MITIGATION CHECK: PASS" else echo "MITIGATION CHECK: FAIL" echo "$FAILED_CHECKS" exit 1 fiexport ARGOCD_NS="${ARGOCD_NS:-argocd}" export ARGOCD_RELEASE="${ARGOCD_RELEASE:-$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.labels.app\.kubernetes\.io/instance}')}" if kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" --no-headers 2>/dev/null | grep -q .; then REDIS_MODE=ha else REDIS_MODE=standalone fi SERVER_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-server -o jsonpath='{.items[0].metadata.name}')" APPSET_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-applicationset-controller -o jsonpath='{.items[0].metadata.name}' 2>/dev/null || true)" FAILED_CHECKS="" tcp_check() { pod="$1" host="$2" port="$3" expected="$4" name="$5" code="$(kubectl -n "$ARGOCD_NS" exec "$pod" -- sh -c ' host="$1" port="$2" if command -v nc >/dev/null 2>&1; then timeout 5 nc -z -w 3 "$host" "$port" >/dev/null 2>&1 printf "%s\n" "$?" elif command -v bash >/dev/null 2>&1; then timeout 5 bash -c "</dev/tcp/${host}/${port}" >/dev/null 2>&1 printf "%s\n" "$?" else printf "%s\n" "NO_TCP_TOOL" fi ' sh "$host" "$port" 2>/dev/null | tail -n 1)" if [ "$expected" = "allow" ] && [ "$code" = "0" ]; then return elif [ "$expected" = "deny" ] && [ "$code" != "0" ] && [ "$code" != "NO_TCP_TOOL" ] && [ -n "$code" ]; then return else FAILED_CHECKS="${FAILED_CHECKS} - ${name}: expected ${expected}, got exit code ${code}" fi } tcp_check "$SERVER_POD" argocd-repo-server 8081 allow "argocd-server to repo-server:8081" if [ "$REDIS_MODE" = "ha" ]; then HAPROXY_POD="$(kubectl -n "$ARGOCD_NS" get pod -l "release=${ARGOCD_RELEASE},app=redis-ha-haproxy" -o jsonpath='{.items[0].metadata.name}')" tcp_check "$SERVER_POD" argocd-redis-ha-haproxy 6379 allow "argocd-server to redis-ha-haproxy:6379" tcp_check "$HAPROXY_POD" argocd-redis-ha 6379 allow "redis-ha-haproxy to redis-ha:6379" tcp_check "$HAPROXY_POD" argocd-repo-server 8081 deny "redis-ha-haproxy to repo-server:8081" if [ -n "$APPSET_POD" ]; then tcp_check "$APPSET_POD" argocd-redis-ha-haproxy 6379 deny "applicationset-controller to redis-ha-haproxy:6379" fi else REDIS_POD="$(kubectl -n "$ARGOCD_NS" get pod -l app.kubernetes.io/name=argocd-redis -o jsonpath='{.items[0].metadata.name}')" tcp_check "$SERVER_POD" argocd-redis 6379 allow "argocd-server to redis:6379" tcp_check "$REDIS_POD" argocd-repo-server 8081 deny "redis to repo-server:8081" if [ -n "$APPSET_POD" ]; then tcp_check "$APPSET_POD" argocd-redis 6379 deny "applicationset-controller to redis:6379" fi fi if [ -z "$FAILED_CHECKS" ]; then echo "MITIGATION CHECK: PASS" else echo "MITIGATION CHECK: FAIL" echo "$FAILED_CHECKS" exit 1 fiErwartetes Ergebnis:
MITIGATION CHECK: PASS
Rollback
Führen Sie bei Bedarf die folgenden Schritte aus, um die Schadensbegrenzung zu entfernen:
-
Löschen Sie die manuellen Richtlinien zur Schadensbegrenzung:
kubectl -n "$ARGOCD_NS" delete networkpolicy \ argocd-repo-server-manual-mitigation \ argocd-redis-manual-mitigation \ argocd-redis-ha-server-manual-mitigation \ argocd-redis-ha-haproxy-manual-mitigation \ --ignore-not-foundkubectl -n "$ARGOCD_NS" delete networkpolicy \ argocd-repo-server-manual-mitigation \ argocd-redis-manual-mitigation \ argocd-redis-ha-server-manual-mitigation \ argocd-redis-ha-haproxy-manual-mitigation \ --ignore-not-found -
Bestätigen Sie, dass das Rollback erfolgreich abgeschlossen wurde:
kubectl -n "$ARGOCD_NS" get networkpolicy kubectl -n "$ARGOCD_NS" get pods kubectl get applications.argoproj.io -Akubectl -n "$ARGOCD_NS" get networkpolicy kubectl -n "$ARGOCD_NS" get pods kubectl get applications.argoproj.io -ABestätigen Sie Folgendes:
- Die manuellen Richtlinien zur Schadensbegrenzung werden entfernt.
- ArgoCD-Pods bleiben
RunningoderCompleted. - ArgoCD-Anwendungen bleiben
SyncedundHealthy.