UiPath Documentation
test-cloud
latest
false
Importante :
La localización de contenidos recién publicados puede tardar entre una y dos semanas en estar disponible.

Guía de administración de Test Cloud

Implementar el cliente de Relay como contenedor

Ejecute el cliente de Relay como una imagen de contenedor para establecer túneles de salida seguros a Test Cloud desde entornos en contenedores. Antes de comenzar, configure un Grupo de Relay y tenga lista la cadena de configuración del cliente desde la IU de Relay.

Requisitos previos

  • Runtime de contenedor: Podman, Docker o un clúster de Kubernetes.
  • Imagen de contenedor de cliente de Relay: registry.uipath.com/relay-client:<tag>. Sustituye <tag> por una versión de Relay de la página de descargas del Customer Portal de UiPath . La versión mínima compatible es 26.4.1.
  • Un archivo de configuración codificado en base64 generado a partir de la IU de Relay.
  • Aceptación del acuerdo de licencia: establece LICENSE_AGREEMENT=accept como variable de entorno o anexa --accept-license-agreement al comando de inicio.
  • (Opcional) Un certificado de CA personalizado si tu organización utiliza PKI de empresa.

Para conocer los requisitos de hardware y los requisitos previos de red específicos de la versión, consulta Implementación del cliente de Relay.

Paso 1: obtener la configuración

  1. Abra el panel de IU de Relay.
  2. Cree o copie su configuración de Relay.
  3. Guarda la cadena de configuración codificada en base64 proporcionada por la IU.

Paso 2: configura las variables de entorno

Certificado de CA personalizado

Si tu organización utiliza una CA corporativa o autofirmada, establece las siguientes variables juntas antes de iniciar el contenedor:

VariablePropósitoObligatorio
RELAY_CUSTOM_CA_PATHRuta al certificado de CA personalizadoNo
RELAY_CA_BUNDLE_PATHRuta donde se escribe el paquete de CA fusionadoSí, si se utiliza una CA personalizada

El cliente de Relay fusiona la CA personalizada con el paquete de certificados del sistema antes de establecer cualquier conexión TLS. Ambas variables deben establecerse juntas.

Proxy

Para enrutar el tráfico saliente a través de un proxy:

VariablePropósitoObligatorio
HTTP_PROXY y HTTPS_PROXYURL del proxyNo
NO_PROXYNombres de host, dominios o direcciones IP separados por comas que omiten el proxyNo

Paso 3: Implementar

Podman

Para una alta disponibilidad, ejecuta dos contenedores en nodos independientes con nombres distintos. Reemplace <RELAY_ID> por el ID real de la IU de Relay; por ejemplo, ejecute relay1-<RELAY_ID> en el host1 y relay2-<RELAY_ID> en el host2.

Inicio rápido:

# 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

Con un certificado de CA personalizado:

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

Opciones de comando de inicio:

OpciónDescripciónEjemplo
--configCadena de configuración base64 en línea--config "base64string..."
--config-fileRuta al archivo de configuración--config-file /relay.config.b64enc
--log-levelVerbosidad del registro: trace, debug, info, warn o error--log-level debug
--heartbeat-intervalIntervalo de latido en segundos (mínimo: 10)--heartbeat-interval 10
--reconnect-intervalIntervalo de reconexión en segundos (mínimo: 1800)--reconnect-interval 1800
--health-addrDirección de enlace para el punto final /healthz . El valor predeterminado es 0.0.0.0:9090; utiliza un valor vacío para deshabilitarlo--health-addr=0.0.0.0:9090

Kubernetes

Crear secretos:

# 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"

Implementar un StatefulSet:

Usa un StatefulSet cuando se aplican restricciones de nombre de host. Los StatefulSets proporcionan nombres de host estables y predecibles (relay-client-0, relay-client-1, etc.), que el servicio de Relay utiliza para identificar y validar clientes.

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

Verifica la implementación:

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

Operaciones

Configuration details

El archivo de configuración debe contener la cadena JSON codificada en base64 generada por la IU de Relay. Al iniciarse, el cliente de Relay lee la configuración, la decodifica, la valida y se conecta al punto final de servicio de Relay especificado.

  • Primera ejecución: la configuración se almacena cifrada en el directorio de datos.
  • Ejecuciones posteriores: la configuración cifrada se descifra y se utiliza automáticamente.
  • Cambios en el archivo de configuración: requiere un reinicio del contenedor para que surta efecto.

Intervalo de latido

El latido mantiene activas las conexiones TCP inactivas. Reduce el intervalo si tu cortafuegos, proxy o traducción de direcciones de red (NAT) descarta las conexiones inactivas antes de los 30 segundos:

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

Intervalo de reconexión

La reconexión proactiva restablece la conexión en una programación fija. Usa esto en entornos donde un proxy o equilibrador de carga tiene un tiempo de espera de conexión inactiva:

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

Punto final de estado

Nota:

La opción --health-addr está disponible con el cliente de Relay 26.4.2 y versiones posteriores.

La imagen del contenedor habilita un punto final HTTP /healthz de forma predeterminada en 0.0.0.0:9090. Usa --health-addr=<address> para cambiar la dirección de enlace, o --health-addr= para deshabilitar el punto final. La sonda de preparación de Kubernetes en el manifiesto de ejemplo utiliza este punto final.

Acceder a los registros

# 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

La retención de registros del contenedor está controlada por su tiempo de ejecución del contenedor o la política de registro del clúster de Kubernetes, no por el cliente de Relay.

Seguridad

Aplica la siguiente configuración de seguridad en tu manifiesto de contenedor:

  • readOnlyRootFilesystem: true : evita la modificación del sistema de archivos del contenedor.
  • runAsNonRoot: true : ejecuta el proceso como usuario no root.
  • allowPrivilegeEscalation: false : evita la escalada de privilegios.
  • capabilities.drop: [ALL] : elimina todas las capacidades de Linux.
  • privileged: false : deshabilita el modo privilegiado.

Almacena la configuración de Relay en secretos de Kubernetes y utiliza el control de acceso basado en roles (RBAC) para restringir el acceso a los secretos. No incrustes la configuración base64 en la imagen del contenedor ni la pases como una variable de entorno simple.

Solución de problemas

SíntomaCausaResolución
license agreement not accepted al iniciarIndicador de licencia o variable no establecidaAñade --accept-license-agreement al comando de inicio o establece LICENSE_AGREEMENT=accept
No se ha encontrado el archivo de configuraciónRuta de montaje del volumen o secreto incorrectosEjecuta kubectl describe secret relay-config y kubectl describe pod <pod-name> para verificar los montajes
No se puede conectar al servicio de RelayProblema de red o firewallCompruebe los registros de pod con kubectl logs <pod-name> y verifique los destinos salientes necesarios en Implementar el cliente de Relay
Error al combinar la CA personalizadaNo se han establecido ambas variables de entorno de CAEstablezca RELAY_CUSTOM_CA_PATH y RELAY_CA_BUNDLE_PATH juntos
Nombre de host no reconocido por el servicio de RelayEl nombre del pod es aleatorio (Pod independiente, no StatefulSet)Usa un StatefulSet en lugar de un Pod independiente
Errores de certificado x509Certificado de CA no válido o inaccesibleVerifique el formato del certificado con openssl x509 -in custom-ca.crt -text -noout y compruebe los permisos de archivo

¿Te ha resultado útil esta página?

Conectar

¿Necesita ayuda? Soporte

¿Quiere aprender? UiPath Academy

¿Tiene alguna pregunta? Foro de UiPath

Manténgase actualizado