UiPath Documentation
test-cloud
latest
false
Wichtig :
Es kann 1–2 Wochen dauern, bis die Lokalisierung neu veröffentlichter Inhalte verfügbar ist.

Test Cloud-Administratorhandbuch

Bereitstellen des Relay-Clients als Container

Führen Sie den Relay-Client als Container-Image aus, um sichere ausgehende Tunnel von Containerumgebungen zu Test Cloud herzustellen. Bevor Sie beginnen, konfigurieren Sie eine Relay-Gruppe und halten Sie die Client-Konfigurationszeichenfolge über die Relay-Benutzeroberfläche bereit.

Voraussetzungen

  • Container-Runtime: Podman, Docker oder ein Kubernetes-Cluster.
  • Container-Image des Relay-Clients: registry.uipath.com/relay-client:<tag>. Ersetzen Sie <tag> durch eine Relay-Version von der Downloadseite des UiPath Customer Portal . Die mindestens unterstützte Version ist 26.4.1.
  • Eine base64-codierte Konfigurationsdatei, die von der Relay-Benutzeroberfläche generiert wurde.
  • Lizenzannahmevereinbarung: Legen Sie LICENSE_AGREEMENT=accept als Umgebungsvariable fest, oder fügen Sie --accept-license-agreement an den Startbefehl an.
  • (Optional) Ein benutzerdefiniertes Zertifizierungsstellenzertifikat, wenn Ihre Organisation Enterprise-PKI verwendet.

Hardwareanforderungen und versionsspezifische Netzwerkvoraussetzungen finden Sie unter Bereitstellen des Relay-Clients.

Schritt 1: Abrufen der Konfiguration

  1. Öffnen Sie das Dashboard Relay-UI.
  2. Erstellen oder kopieren Sie Ihre Relay-Konfiguration.
  3. Speichern Sie die von der Benutzeroberfläche bereitgestellte base64-codierte Konfigurationszeichenfolge.

Schritt 2: Konfigurieren der Umgebungsvariablen

Benutzerdefiniertes Zertifizierungsstellenzertifikat

Wenn Ihre Organisation eine Unternehmens- oder selbstsignierte Zertifizierungsstelle verwendet, legen Sie die folgenden Variablen zusammen, bevor Sie den Container starten:

VariableZweckErforderlich
RELAY_CUSTOM_CA_PATHPfad zum benutzerdefinierten Zertifikat der ZertifizierungsstelleNein
RELAY_CA_BUNDLE_PATHPfad, in den das zusammengeführte Zertifizierungsstellenpaket geschrieben wirdJa, wenn Sie eine benutzerdefinierte Zertifizierungsstelle verwenden

Der Relay-Client führt die benutzerdefinierte Zertifizierungsstelle mit dem Systemzertifikatpaket zusammen, bevor er TLS-Verbindungen herstellt. Beide Variablen müssen zusammen festgelegt werden.

Proxy

So leiten Sie ausgehenden Datenverkehr über einen Proxy weiter:

VariableZweckErforderlich
HTTP_PROXY und HTTPS_PROXYProxy-URLNein
NO_PROXYDurch Kommas getrennte Hostnamen, Domänen oder IP-Adressen, die den Proxy umgehenNein

Schritt 3: Bereitstellen

Podman

Führen Sie für hohe Verfügbarkeit zwei Container auf separaten Knoten mit unterschiedlichen Namen aus. Ersetzen Sie <RELAY_ID> durch die tatsächliche ID aus der Relay-Benutzeroberfläche – führen Sie beispielsweise relay1-<RELAY_ID> auf Host1 und relay2-<RELAY_ID> auf Host2 aus.

Schnellstart:

# Create a config file with the base64-encoded content from the Relay UI
echo "YOUR_BASE64_CONFIG_HERE" > /tmp/relay_config

# Run the container
podman run -it --name relay1-<RELAY_ID> --hostname relay1-<RELAY_ID> --rm \
  --read-only --read-only-tmpfs \
  -v /tmp/relay_config:/relay.config.b64enc:z \
  -e LICENSE_AGREEMENT=accept \
  registry.uipath.com/relay-client:<tag> \
  start --config-file /relay.config.b64enc --accept-license-agreement
# Create a config file with the base64-encoded content from the Relay UI
echo "YOUR_BASE64_CONFIG_HERE" > /tmp/relay_config

# Run the container
podman run -it --name relay1-<RELAY_ID> --hostname relay1-<RELAY_ID> --rm \
  --read-only --read-only-tmpfs \
  -v /tmp/relay_config:/relay.config.b64enc:z \
  -e LICENSE_AGREEMENT=accept \
  registry.uipath.com/relay-client:<tag> \
  start --config-file /relay.config.b64enc --accept-license-agreement

Mit einem benutzerdefinierten Zertifizierungsstellenzertifikat:

podman run -it --name relay1-<RELAY_ID> --hostname relay1-<RELAY_ID> --rm \
  --read-only --read-only-tmpfs \
  -v /tmp/relay_config:/relay.config.b64enc:z \
  -v /tls/custom-ca.crt:/custom-ca.crt:z \
  -v /tmp/writable:/writable:z \
  -e RELAY_CUSTOM_CA_PATH=/custom-ca.crt \
  -e RELAY_CA_BUNDLE_PATH=/writable/merged-ca.crt \
  registry.uipath.com/relay-client:<tag> \
  start --config-file /relay.config.b64enc --accept-license-agreement
podman run -it --name relay1-<RELAY_ID> --hostname relay1-<RELAY_ID> --rm \
  --read-only --read-only-tmpfs \
  -v /tmp/relay_config:/relay.config.b64enc:z \
  -v /tls/custom-ca.crt:/custom-ca.crt:z \
  -v /tmp/writable:/writable:z \
  -e RELAY_CUSTOM_CA_PATH=/custom-ca.crt \
  -e RELAY_CA_BUNDLE_PATH=/writable/merged-ca.crt \
  registry.uipath.com/relay-client:<tag> \
  start --config-file /relay.config.b64enc --accept-license-agreement

Startbefehlsoptionen:

OptionBeschreibungBeispiel
--configInline-Base64-Konfigurationszeichenfolge--config "base64string..."
--config-filePfad zur Konfigurationsdatei--config-file /relay.config.b64enc
--log-levelAusführliche Protokollierung: trace, debug, info, warn oder error--log-level debug
--heartbeat-intervalHeartbeat-Intervall in Sekunden (Minimum: 10)--heartbeat-interval 10
--reconnect-intervalVerbindungsintervall in Sekunden (Minimum: 1800)--reconnect-interval 1800
--health-addrBindeadresse für den Endpunkt /healthz . Standardmäßig auf 0.0.0.0:9090; Verwenden Sie einen leeren Wert, um ihn zu deaktivieren--health-addr=0.0.0.0:9090

Kubernetes

Geheimnisse erstellen:

# Configuration secret
kubectl create secret generic relay-config \
  --from-file=relay.conf=/tmp/relay_config

# Custom CA certificate secret (optional)
kubectl create secret generic custom-ca \
  --from-file=custom-ca.crt=./custom-ca.crt

# Headless service for the StatefulSet
kubectl create service clusterip relay-client-<RELAY_ID> --clusterip="None"
# Configuration secret
kubectl create secret generic relay-config \
  --from-file=relay.conf=/tmp/relay_config

# Custom CA certificate secret (optional)
kubectl create secret generic custom-ca \
  --from-file=custom-ca.crt=./custom-ca.crt

# Headless service for the StatefulSet
kubectl create service clusterip relay-client-<RELAY_ID> --clusterip="None"

Stellen Sie ein StatefulSet bereit:

Verwenden Sie einen StatefulSet, wenn Hostnamenbeschränkungen erzwungen werden. StatefulSets bieten stabile, vorhersehbare Hostnamen (relay-client-0, relay-client-1 usw.), die der Relay-Dienst zur Identifizierung und Validierung von Clients verwendet.

apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: relay-client-<RELAY_ID>
spec:
  serviceName: relay-client-<RELAY_ID>
  replicas: 2
  selector:
    matchLabels:
      app: relay-client-<RELAY_ID>
  template:
    metadata:
      labels:
        app: relay-client-<RELAY_ID>
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - relay-client-<RELAY_ID>
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: relay
        image: registry.uipath.com/relay-client:<tag>
        args:
        - start
        - --config-file=/config/relay.conf
        - --accept-license-agreement
        - --log-level=info
        - --heartbeat-interval=30
        env:
        - name: RELAY_CUSTOM_CA_PATH
          value: "/tls/custom-ca.crt"
        - name: RELAY_CA_BUNDLE_PATH
          value: "/writable/merged-ca.crt"
        imagePullPolicy: IfNotPresent
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          privileged: false
          readOnlyRootFilesystem: true
          runAsGroup: 1001
          runAsNonRoot: true
          runAsUser: 1001
        readinessProbe:
          httpGet:
            path: /healthz
            port: 9090
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 3
          successThreshold: 1
          failureThreshold: 2
        resources:
          requests:
            cpu: 50m
            memory: 100Mi
        volumeMounts:
        - name: relay-config
          mountPath: /config/relay.conf
          subPath: relay.conf
          readOnly: true
        - mountPath: /writable
          name: writable
        - name: custom-ca
          mountPath: /tls/custom-ca.crt
          subPath: custom-ca.crt
          readOnly: true
      volumes:
      - name: relay-config
        secret:
          secretName: relay-config
      - name: writable
        emptyDir: {}
      - name: custom-ca
        secret:
          secretName: custom-ca
      restartPolicy: Always
      terminationGracePeriodSeconds: 30
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: relay-client-<RELAY_ID>
spec:
  serviceName: relay-client-<RELAY_ID>
  replicas: 2
  selector:
    matchLabels:
      app: relay-client-<RELAY_ID>
  template:
    metadata:
      labels:
        app: relay-client-<RELAY_ID>
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - relay-client-<RELAY_ID>
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: relay
        image: registry.uipath.com/relay-client:<tag>
        args:
        - start
        - --config-file=/config/relay.conf
        - --accept-license-agreement
        - --log-level=info
        - --heartbeat-interval=30
        env:
        - name: RELAY_CUSTOM_CA_PATH
          value: "/tls/custom-ca.crt"
        - name: RELAY_CA_BUNDLE_PATH
          value: "/writable/merged-ca.crt"
        imagePullPolicy: IfNotPresent
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop:
            - ALL
          privileged: false
          readOnlyRootFilesystem: true
          runAsGroup: 1001
          runAsNonRoot: true
          runAsUser: 1001
        readinessProbe:
          httpGet:
            path: /healthz
            port: 9090
          initialDelaySeconds: 5
          timeoutSeconds: 1
          periodSeconds: 3
          successThreshold: 1
          failureThreshold: 2
        resources:
          requests:
            cpu: 50m
            memory: 100Mi
        volumeMounts:
        - name: relay-config
          mountPath: /config/relay.conf
          subPath: relay.conf
          readOnly: true
        - mountPath: /writable
          name: writable
        - name: custom-ca
          mountPath: /tls/custom-ca.crt
          subPath: custom-ca.crt
          readOnly: true
      volumes:
      - name: relay-config
        secret:
          secretName: relay-config
      - name: writable
        emptyDir: {}
      - name: custom-ca
        secret:
          secretName: custom-ca
      restartPolicy: Always
      terminationGracePeriodSeconds: 30

Überprüfen Sie die Bereitstellung:

kubectl get statefulset relay-client-<RELAY_ID>
kubectl get statefulset relay-client-<RELAY_ID>

Betrieb

Configuration details

Die Konfigurationsdatei muss den base64-codierten JSON-String enthalten, der von der Relay-Benutzeroberfläche generiert wurde. Beim Start liest der Relay-Client die Konfiguration, decodiert sie, validiert sie und stellt eine Verbindung mit dem angegebenen Relay-Dienst-Endpunkt her.

  • Erste Ausführung: Die Konfiguration wird verschlüsselt im Datenverzeichnis gespeichert.
  • Nachfolgende Ausführungen: Die verschlüsselte Konfiguration wird automatisch entschlüsselt und verwendet.
  • Änderungen an der Konfigurationsdatei: Erfordern einen Neustart des Containers, um wirksam zu werden.

Heartbeat-Intervall

Der Heartbeat hält inaktive TCP-Verbindungen aktiv. Verringern Sie das Intervall, wenn Ihre Firewall, Ihr Proxy oder Ihre Netzwerkadressenübersetzung (NAT) inaktive Verbindungen vor 30 Sekunden auslöst:

--heartbeat-interval=30    # Default
--heartbeat-interval=10    # For aggressive firewall or NAT environments
--heartbeat-interval=30    # Default
--heartbeat-interval=10    # For aggressive firewall or NAT environments

Intervall für die erneute Verbindung

Proaktive erneute Verbindung stellt die Verbindung nach einem festen Zeitplan wieder her. Verwenden Sie dies in Umgebungen, in denen ein Proxy oder Lastausgleich einen Timeout bei Inaktivität der Verbindung hat:

--reconnect-interval=0     # Disabled (default)
--reconnect-interval=1800  # Reconnect every 30 minutes (minimum)
--reconnect-interval=0     # Disabled (default)
--reconnect-interval=1800  # Reconnect every 30 minutes (minimum)

Integritätsendpunkt

Hinweis:

Die Option --health-addr ist mit dem Relay-Client 26.4.2 und höher verfügbar.

Das Container-Image aktiviert standardmäßig einen /healthz -HTTP-Endpunkt auf 0.0.0.0:9090. Verwenden Sie --health-addr=<address> um die Bindungsadresse zu ändern, oder --health-addr= um den Endpunkt zu deaktivieren. Der Kubernetes-Bereitschaftstest im Beispielmanifest verwendet diesen Endpunkt.

Zugreifen auf Protokolle

# Podman
podman logs -f relay1

# Kubernetes (current run)
kubectl logs -f relay-client-0

# Kubernetes (previous run, if the container restarted)
kubectl logs relay-client-0 --previous
# Podman
podman logs -f relay1

# Kubernetes (current run)
kubectl logs -f relay-client-0

# Kubernetes (previous run, if the container restarted)
kubectl logs relay-client-0 --previous

Die Aufbewahrung von Containerprotokollen wird durch Ihre Container-Laufzeit- oder Kubernetes-Cluster-Protokollierungsrichtlinie gesteuert, nicht durch den Relay-Client.

Sicherheit

Wenden Sie die folgenden Sicherheitseinstellungen in Ihrem Containermanifest an:

  • readOnlyRootFilesystem: true – verhindert die Änderung des Container-Dateisystems.
  • runAsNonRoot: true – Führt den Prozess als Nicht-Stammbenutzer aus.
  • allowPrivilegeEscalation: false – verhindert die Eskalation von Berechtigungen.
  • capabilities.drop: [ALL] – Verwirft alle Linux-Funktionen.
  • privileged: false – deaktiviert den privilegierten Modus.

Speichern Sie die Relay-Konfiguration in Kubernetes-Geheimnissen und verwenden Sie die rollenbasierte Zugriffskontrolle (RBAC), um den geheimen Zugriff einzuschränken. Betten Sie die Base64-Konfiguration nicht in das Container-Image ein und übergeben Sie sie nicht als einfache Umgebungsvariable.

Fehlersuche und ‑behebung

SymptomeUrsacheResolution
license agreement not accepted beim StartLizenz-Flag oder -Variable nicht festgelegtFügen Sie --accept-license-agreement zum Startbefehl hinzu, oder legen Sie LICENSE_AGREEMENT=acceptfest.
Konfigurationsdatei nicht gefundenFalscher Volume-Bereitstellungspfad oder geheimes GeheimnisFühren Sie kubectl describe secret relay-config und kubectl describe pod <pod-name> aus, um Bereitstellungen zu überprüfen
Verbindung mit dem Relay-Dienst nicht möglichNetzwerk- oder FirewallproblemÜberprüfen Sie die Pod-Protokolle mit kubectl logs <pod-name> und stellen Sie sicher, dass die erforderlichen ausgehenden Ziele unter Bereitstellen des Relay-Clients festgelegt sind
Die benutzerdefinierte Zusammenführung von Zertifizierungsstellen ist fehlgeschlagenNicht beide Umgebungsvariablen von Zertifizierungsstellen festgelegtLegen Sie sowohl RELAY_CUSTOM_CA_PATH als auch RELAY_CA_BUNDLE_PATH zusammen fest
Hostname wird vom Relay-Dienst nicht erkanntPod-Name ist zufällig (eigenständiger Pod, nicht StatefulSet)Verwenden Sie ein StatefulSet anstelle eines eigenständigen Pods
x509-ZertifikatsfehlerUngültiges oder nicht zugängliches ZertifizierungsstellenzertifikatÜberprüfen Sie das Zertifikatformat mit openssl x509 -in custom-ca.crt -text -noout und überprüfen Sie die Dateiberechtigungen

War diese Seite hilfreich?

Verbinden

Benötigen Sie Hilfe? Support

Möchten Sie lernen? UiPath Academy

Haben Sie Fragen? UiPath-Forum

Auf dem neuesten Stand bleiben