En este documento, se te guía a través de un ejemplo práctico para implementar una puerta de enlace externa de varios clústeres que enruta el tráfico de Internet a una aplicación que se ejecuta en dos clústeres de GKE diferentes.
Las Gateways de varios clústeres proporcionan una forma eficaz de administrar el tráfico de los servicios implementados en varios clústeres de GKE. Si usas la infraestructura global de balanceo de cargas de Google, puedes crear un solo punto de entrada para tus aplicaciones, lo que simplifica la administración y mejora la confiabilidad.En este instructivo, usarás una aplicación de ejemplo de store para simular una situación real en la que un servicio de compras en línea es propiedad de equipos independientes y está operado por ellos, y se implementa en una flota de clústeres de GKE compartidos.
Antes de comenzar
Las puertas de enlace de varios clústeres requieren cierta preparación del entorno antes de que puedan implementarse. Antes de continuar, sigue los pasos que se indican en Prepara tu entorno para las puertas de enlace de varios clústeres:
Implemente clústeres de GKE
Registra tus clústeres en una flota (si aún no lo hiciste).
Habilita el Service de varios clústeres y los controladores de puertas de enlace de varios clústeres.
Por último, revisa las limitaciones y los problemas conocidos del controlador de puerta de enlace de GKE antes de usarlo en tu entorno.
Puerta de enlace externa, varios clústeres y varias regiones
En este instructivo, crearás una puerta de enlace externa de varios clústeres con la que se entrega tráfico externo en una aplicación que se ejecuta en dos clústeres de GKE.
En los siguientes pasos, haz lo siguiente:
- Implementa la aplicación
storede muestra en los clústeresgke-west-1ygke-east-1. - Configura los servicios en cada clúster que se exportará a tu flota (servicios de varios clústeres).
- Implementa una puerta de enlace externa de varios clústeres y una HTTPRoute en tu clúster de configuración (
gke-west-1).
Después de implementar la aplicación y los recursos de las puertas de enlace, puedes controlar el tráfico en los dos clústeres de GKE con el enrutamiento basado en rutas de acceso:
- Las solicitudes a
/westse enrutan a los Podsstoreen el clústergke-west-1. - Las solicitudes a
/eastse enrutan a los Podsstoreen el clústergke-east-1. - Las solicitudes a cualquier otra ruta de acceso se enrutan a cualquiera de los clústeres, según su estado, capacidad y proximidad al cliente solicitante.
Implementa la aplicación de demostración
Crea la Deployment
storey el espacio de nombres en los tres clústeres que se implementaron en Prepara tu entorno para las puertas de enlace de varios clústeres:kubectl apply --context gke-west-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yaml kubectl apply --context gke-west-2 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yaml kubectl apply --context gke-east-1 -f https://raw.githubusercontent.com/GoogleCloudPlatform/gke-networking-recipes/main/gateway/gke-gateway-controller/multi-cluster-gateway/store.yamlImplementa los siguientes recursos en cada clúster:
namespace/store created deployment.apps/store createdEn todos los ejemplos de esta página, se usa la app implementada en este paso. Asegúrate de que la app se implemente en los tres clústeres antes de probar cualquiera de los pasos restantes. En este ejemplo, solo se usan los clústeres
gke-west-1ygke-east-1, ygke-west-2se usa en otro ejemplo.
Service de varios clústeres
Los servicios son la forma en que los Pods se exponen a los clientes. Debido a que el controlador de puertas de enlace de GKE usa el balanceo de cargas nativo del contenedor, no usa el balanceo de cargas de ClusterIP o Kubernetes para llegar a los Pods. El tráfico se envía directamente desde el balanceador de cargas a las direcciones IP del Pod. Sin embargo, los objetos de Service desempeñan una función crítica como un identificador lógico para la agrupación de Pods.
Los servicios de varios clústeres (MCS) son un estándar de API para los Services que abarcan clústeres y a través de su controlador de GKE se ofrece un descubrimiento de servicios en clústeres de GKE. El controlador de la puerta de enlace de varios clústeres usa recursos de la API de MCS para agrupar Pods en un Service que se pueda dirigir a varios profesionales o a través de ellos.
La API de Services de varios clústeres define los siguientes recursos personalizados:
- ServiceExports asigna a un Service de Kubernetes mediante la exportación de los extremos de ese Service a todos los clústeres registrados en la flota. Cuando un Service tiene una ServiceExport correspondiente, significa que se puede abordar con una puerta de enlace de varios clústeres.
- Con el controlador de Service de varios clústeres se genera ServiceImports de forma automática. ServiceExport y ServiceImport vienen en pares. Si existe una ServiceExport en la flota, se crea una ServiceImport correspondiente para permitir que se acceda al Service asignado a ServiceExport desde todos los clústeres.
La exportación de Services funciona de la siguiente manera. Existe un Service de almacenamiento en gke-west-1 que selecciona un grupo de Pods en ese clúster. Se crea un objeto ServiceExport en el clúster que permite que se pueda acceder a los Pods en gke-west-1 desde los otros clústeres de la flota. ServiceExport se asigna a los Services que tienen el mismo nombre y el mismo espacio de nombres que el recurso de ServiceExport y los expone.
apiVersion: v1
kind: Service
metadata:
name: store
namespace: store
spec:
selector:
app: store
ports:
- port: 8080
targetPort: 8080
---
kind: ServiceExport
apiVersion: net.gke.io/v1
metadata:
name: store
namespace: store
En el siguiente diagrama, se muestra lo que sucede después de implementar una ServiceExport. Si existe un par Service y ServiceExport, el controlador de Service de varios clústeres implementa una ServiceImport correspondiente en cada clúster de GKE de la flota. ServiceImport es la representación local del Service store en cada clúster. Esto permite que el client Pod en gke-east-1 use ClusterIP o los Service sin interfaz gráfica para llegar a los store Pods en gke-west-1 Cuando se usan de esta manera, los Service de varios clústeres proporcionan un balanceo de cargas este-oeste entre clústeres sin necesidad de un Service LoadBalancer interno.
Si deseas usar los Service de varios clústeres para el balanceo de cargas de clúster a clúster, consulta Configura Service de varios clústeres.
Las puertas de enlace de varios clústeres también usan ServiceImports, pero no para el balanceo de cargas de clúster a clúster. En cambio, las puerta de enlace usan ServiceImports como identificadores lógicos para un Service que existe en otro clúster o que se extiende a varios clústeres. La siguiente HTTPRoute hace referencia a una ServiceImport en lugar de un recurso de Service. Si se hace referencia a una ServiceImport, esto indica que reenvía el tráfico a un grupo de Pods de backend que se ejecutan en uno o más clústeres.
kind: HTTPRoute
apiVersion: gateway.networking.k8s.io/v1
metadata:
name: store-route
namespace: store
labels:
gateway: multi-cluster-gateway
spec:
parentRefs:
- kind: Gateway
namespace: store
name: external-http
hostnames:
- "store.example.com"
rules:
- backendRefs:
- group: net.gke.io
kind: ServiceImport
name: store
port: 8080
En el siguiente diagrama, se muestra cómo la HTTPRoute enruta el tráfico store.example.com a los Pods store en gke-west-1 y gke-east-1. El balanceador de cargas los trata como un grupo de backends. Si los Pods de uno de los clústeres se encuentran en mal estado, son inaccesibles o no tienen capacidad de tráfico, la carga de tráfico se balancea a los Pods restantes en el otro clúster. Los clústeres nuevos se pueden agregar o quitar con el Service store y ServiceExport. Esto agrega o quita con transparencia los Pods de backend sin ningún cambio explícito en la configuración del enrutamiento.
Exporta Services
En este punto, la aplicación se ejecuta en ambos clústeres. A continuación, deberás exponer las aplicaciones y exportarlas mediante la implementación de objetos Service y ServiceExports en cada clúster.
Aplica el siguiente manifiesto al clúster
gke-west-1para crear tus Services y servicios y exportaciones destoreystore-west-1:cat << EOF | kubectl apply --context gke-west-1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: store --- apiVersion: v1 kind: Service metadata: name: store-west-1 namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-west-1 namespace: store EOFAplica el siguiente manifiesto al clúster
gke-east-1para crear tus Services y servicios y exportaciones destoreystore-east-1:cat << EOF | kubectl apply --context gke-east-1 -f - apiVersion: v1 kind: Service metadata: name: store namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store namespace: store --- apiVersion: v1 kind: Service metadata: name: store-east-1 namespace: store spec: selector: app: store ports: - port: 8080 targetPort: 8080 --- kind: ServiceExport apiVersion: net.gke.io/v1 metadata: name: store-east-1 namespace: store EOFVerifica que se hayan creado las ServiceExports correctas en el clúster.
kubectl get serviceexports --context CLUSTER_NAME --namespace storeReemplaza CLUSTER_NAME por
gke-west-1ygke-east-1. El resultado se ve de la manera siguiente:# gke-west-1 NAME AGE store 2m40s store-west-1 2m40s # gke-east-1 NAME AGE store 2m25s store-east-1 2m25sEl resultado demuestra que el Service
storecontiene Podsstoreen ambos clústeres, y los Servicesstore-west-1ystore-east-1solo contienen Podsstoreen sus clústeres respectivos. Estos Service superpuestos se usan para apuntar a los Pods en varios clústeres o en un subconjunto de Pods en un solo clúster.Después de unos minutos, verifica que el controlador de Services de varios clústeres haya creado de forma automática el
ServiceImportsadjunto en todos los clústeres de la flota.kubectl get serviceimports --context CLUSTER_NAME --namespace storeReemplaza CLUSTER_NAME por
gke-west-1ygke-east-1. El resultado debe parecerse al siguiente:# gke-west-1 NAME TYPE IP AGE store ClusterSetIP ["10.112.31.15"] 6m54s store-east-1 ClusterSetIP ["10.112.26.235"] 5m49s store-west-1 ClusterSetIP ["10.112.16.112"] 6m54s # gke-east-1 NAME TYPE IP AGE store ClusterSetIP ["10.72.28.226"] 5d10h store-east-1 ClusterSetIP ["10.72.19.177"] 5d10h store-west-1 ClusterSetIP ["10.72.28.68"] 4h32mEsto demuestra que se puede acceder a los tres Services desde ambos clústeres en la flota. Sin embargo, debido a que solo hay un clúster de configuración activo por flota, solo puedes implementar puertas de enlace y HTTPRouters que hagan referencia a estas ServiceImports en
gke-west-1. Cuando una HTTPRouter en el clúster de configuración hace referencia a estas ServiceImports como backends, la puerta de enlace puede reenviar tráfico a estos servicios sin importar desde qué clúster se exporten.
Implementa la puerta de enlace y HTTPRouter
Una vez que se implementaron las aplicaciones, puedes configurar una puerta de enlace con la GatewayClass gke-l7-global-external-managed-mc. Con esta puerta de enlace se crea un balanceador de cargas de aplicaciones externo configurado para distribuir el tráfico entre los clústeres de destino.
Aplica el siguiente manifiesto
Gatewayal clúster de configuración,gke-west-1en este ejemplo:cat << EOF | kubectl apply --context gke-west-1 -f - kind: Gateway apiVersion: gateway.networking.k8s.io/v1 metadata: name: external-http namespace: store spec: gatewayClassName: gke-l7-global-external-managed-mc listeners: - name: http protocol: HTTP port: 80 allowedRoutes: kinds: - kind: HTTPRoute EOFA través de esta configuración de puerta de enlace se implementan recursos externos del balanceador de cargas de aplicaciones con la siguiente convención de nombres:
gkemcg1-NAMESPACE-GATEWAY_NAME-HASH.Los recursos predeterminados creados con esta configuración son los siguientes:
- 1 Balanceador de cargas:
gkemcg1-store-external-http-HASH - 1 Dirección IP pública:
gkemcg1-store-external-http-HASH - 1 Regla de reenvío:
gkemcg1-store-external-http-HASH - 2 Servicios de backend:
- Configuración predeterminada 404 de servicio de backend
gkemcg1-store-gw-serve404-HASH - Configuración predeterminada 500 de servicio de backend
gkemcg1-store-gw-serve500-HASH
- Configuración predeterminada 404 de servicio de backend
- 1 Verificación de estado
- Verificación de estado 404 predeterminada:
gkemcg1-store-gw-serve404-HASH
- Verificación de estado 404 predeterminada:
- 0 reglas de enrutamiento (el mapa de URL está vacío)
En esta etapa, cualquier solicitud a GATEWAY_IP:80 genera una página predeterminada que muestra el siguiente mensaje:
fault filter abort.- 1 Balanceador de cargas:
Aplica el siguiente manifiesto
HTTPRouteal clúster de configuración,gke-west-1en este ejemplo:cat << EOF | kubectl apply --context gke-west-1 -f - kind: HTTPRoute apiVersion: gateway.networking.k8s.io/v1 metadata: name: public-store-route namespace: store labels: gateway: external-http spec: hostnames: - "store.example.com" parentRefs: - name: external-http rules: - matches: - path: type: PathPrefix value: /west backendRefs: - group: net.gke.io kind: ServiceImport name: store-west-1 port: 8080 - matches: - path: type: PathPrefix value: /east backendRefs: - group: net.gke.io kind: ServiceImport name: store-east-1 port: 8080 - backendRefs: - group: net.gke.io kind: ServiceImport name: store port: 8080 EOFEn esta etapa, cualquier solicitud a GATEWAY_IP:80 genera una página predeterminada que muestra el siguiente mensaje:
fault filter abort.Después de la implementación, este HTTPRoute configura el siguiente comportamiento de enrutamiento:
- Las solicitudes a
/westse enrutan a los Podsstoreen el clústergke-west-1, ya que los Pods que selecciona la ServiceExportstore-west-1solo existen en el clústergke-west-1. - Las solicitudes a
/eastse enrutan a los Podsstoreen el clústergke-east-1, porque los Pods que selecciona la ServiceExportstore-east-1solo existen en el clústergke-east-1. - Las solicitudes a cualquier otra ruta de acceso se enrutan en
storelos Pods en cualquiera de los clústeres, según su estado, capacidad y proximidad al cliente solicitante. - Las solicitudes a GATEWAY_IP:80 generan una página predeterminada que muestra el siguiente mensaje:
fault filter abort.
Ten en cuenta que si todos los Pods en un clúster determinado están en mal estado (o no existen), el tráfico al Service
storesolo se enviará a los clústeres que en realidad tengan Podsstore. La existencia de un ServiceExport y un Service en un clúster determinado no garantiza que el tráfico se envíe a ese clúster. Los Pods deben existir y responder de manera afirmativa a la verificación de estado del balanceador de cargas. De lo contrario, el balanceador de cargas solo enviará tráfico a Podsstoreen buen estado en otros clústeres.Se crean recursos nuevos con esta configuración:
- 3 Servicios de backend
- El
storeservicio de backendgkemcg1-store-store-8080-HASH - El
store-east-1servicio de backendgkemcg1-store-store-east-1-8080-HASH - El
store-west-1servicio de backendgkemcg1-store-store-west-1-8080-HASH
- El
- 3 Verificaciones de estado (
- )
- La
storeverificación de estadogkemcg1-store-store-8080-HASH - La
store-east-1verificación de estadogkemcg1-store-store-east-1-8080-HASH - La
store-west-1verificación de estadogkemcg1-store-store-west-1-8080-HASH
- La
- 1 regla de enrutamiento en el URLmap:
- La
store.example.comregla de enrutamiento: - 1 Host:
store.example.com - Varios
matchRulespara enrutar a los nuevos servicios de backend
- La
- Las solicitudes a
En el siguiente diagrama, se muestran los recursos que implementaste en ambos clústeres.
Debido a que gke-west-1 es el clúster de configuración de puerta de enlace, es el clúster en el que el controlador de puerta de enlace observa nuestras puerta de enlace, HTTPRoutes y ServiceImports. Cada clúster tiene una ServiceImport store y otra ServiceImport específica para ese clúster. Ambos apuntan a los mismos Pods. Esto permite que HTTPRoute especifique con exactitud dónde debe ir el tráfico: a los Pods store en un clúster específico o a los Pods store en todos los clústeres.
Ten en cuenta que este es un modelo de recursos lógico, no una descripción del flujo de tráfico. La ruta de tráfico va directamente del balanceador de cargas a los Pods de backend y no tiene relación directa con el clúster que es el clúster de configuración.
Valida la implementación
Ahora puedes emitir solicitudes a nuestra puerta de enlace de varios clústeres y distribuir el tráfico entre varios clústeres de GKE.
Verifica que la puerta de enlace y la HTTPRoute se hayan implementado de forma correcta inspeccionando del estado y los eventos de la puerta de enlace.
kubectl describe gateways.gateway.networking.k8s.io external-http --context gke-west-1 --namespace storeEl resultado debería ser similar al siguiente:
Name: external-http Namespace: store Labels: <none> Annotations: networking.gke.io/addresses: /projects/PROJECT_NUMBER/global/addresses/gkemcg1-store-external-http-laup24msshu4 networking.gke.io/backend-services: /projects/PROJECT_NUMBER/global/backendServices/gkemcg1-store-gw-serve404-80-n65xmts4xvw2, /projects/PROJECT_NUMBER/global/backendServices/gke... networking.gke.io/firewalls: /projects/PROJECT_NUMBER/global/firewalls/gkemcg1-l7-default-global networking.gke.io/forwarding-rules: /projects/PROJECT_NUMBER/global/forwardingRules/gkemcg1-store-external-http-a5et3e3itxsv networking.gke.io/health-checks: /projects/PROJECT_NUMBER/global/healthChecks/gkemcg1-store-gw-serve404-80-n65xmts4xvw2, /projects/PROJECT_NUMBER/global/healthChecks/gkemcg1-s... networking.gke.io/last-reconcile-time: 2023-10-12T17:54:24Z networking.gke.io/ssl-certificates: networking.gke.io/target-http-proxies: /projects/PROJECT_NUMBER/global/targetHttpProxies/gkemcg1-store-external-http-94oqhkftu5yz networking.gke.io/target-https-proxies: networking.gke.io/url-maps: /projects/PROJECT_NUMBER/global/urlMaps/gkemcg1-store-external-http-94oqhkftu5yz API Version: gateway.networking.k8s.io/v1 Kind: Gateway Metadata: Creation Timestamp: 2023-10-12T06:59:32Z Finalizers: gateway.finalizer.networking.gke.io Generation: 1 Resource Version: 467057 UID: 1dcb188e-2917-404f-9945-5f3c2e907b4c Spec: Gateway Class Name: gke-l7-global-external-managed-mc Listeners: Allowed Routes: Kinds: Group: gateway.networking.k8s.io Kind: HTTPRoute Namespaces: From: Same Name: http Port: 80 Protocol: HTTP Status: Addresses: Type: IPAddress Value: 34.36.127.249 Conditions: Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has deprecated this condition, do not depend on it. Observed Generation: 1 Reason: Scheduled Status: True Type: Scheduled Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Accepted Status: True Type: Accepted Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Listeners: Attached Routes: 1 Conditions: Last Transition Time: 2023-10-12T07:00:41Z Message: Observed Generation: 1 Reason: Programmed Status: True Type: Programmed Last Transition Time: 2023-10-12T07:00:41Z Message: The OSS Gateway API has altered the "Ready" condition semantics and reservedit for future use. GKE Gateway will stop emitting it in a future update, use "Programmed" instead. Observed Generation: 1 Reason: Ready Status: True Type: Ready Name: http Supported Kinds: Group: gateway.networking.k8s.io Kind: HTTPRoute Events: Type Reason Age From Message ---- ------ ---- ---- ------- Normal UPDATE 35m (x4 over 10h) mc-gateway-controller store/external-http Normal SYNC 4m22s (x216 over 10h) mc-gateway-controller SYNC on store/external-http was a successUna vez que la puerta de enlace se implementó correctamente, recupera la dirección IP externa de la puerta de enlace
external-http.kubectl get gateways.gateway.networking.k8s.io external-http -o=jsonpath="{.status.addresses[0].value}" --context gke-west-1 --namespace storeReemplaza
VIPen los siguientes pasos por la dirección IP que recibas como resultado.Envía tráfico a la ruta raíz del dominio. Esto balancea las cargas del tráfico a la ServiceImport
store, que se encuentra en los clústeresgke-west-1ygke-east-1. El balanceador de cargas envía tu tráfico a la región más cercana a ti y es posible que no veas respuestas de la otra región.curl -H "host: store.example.com" http://VIPEl resultado confirma que el Pod entregó la solicitud desde el clúster
gke-east-1:{ "cluster_name": "gke-east-1", "zone": "us-east1-b", "host_header": "store.example.com", "node_name": "gke-gke-east-1-default-pool-7aa30992-t2lp.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-dg22z", "pod_name_emoji": "⏭", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:32:51" }A continuación, envía el tráfico a la ruta
/west. Esto enruta el tráfico a la ServiceImportstore-west-1, que solo tiene Pods en ejecución en el clústergke-west-1. Un objeto ServiceImport específico del clúster, comostore-west-1, permite que el propietario de una aplicación envíe tráfico de forma explícita a un clúster específico, en lugar de permitir que el balanceador de cargas tome la decisión.curl -H "host: store.example.com" http://VIP/westEl resultado confirma que el Pod entregó la solicitud desde el clúster
gke-west-1:{ "cluster_name": "gke-west-1", "zone": "us-west1-a", "host_header": "store.example.com", "node_name": "gke-gke-west-1-default-pool-65059399-2f41.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-d25m5", "pod_name_emoji": "🍾", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:39:15", }Por último, envía tráfico a la ruta
/east.curl -H "host: store.example.com" http://VIP/eastEl resultado confirma que el Pod entregó la solicitud desde el clúster
gke-east-1:{ "cluster_name": "gke-east-1", "zone": "us-east1-b", "host_header": "store.example.com", "node_name": "gke-gke-east-1-default-pool-7aa30992-7j7z.c.agmsb-k8s.internal", "pod_name": "store-5f5b954888-hz6mw", "pod_name_emoji": "🧜🏾", "project_id": "agmsb-k8s", "timestamp": "2021-06-01T17:40:48" }
Realiza una limpieza
Después de completar los ejercicios de este documento, sigue estos pasos para quitar los recursos a fin de prevenir cobros no deseados en tu cuenta:
Anula el registro de tus clústeres en la flota si no es necesario que estén registrados para otro propósito.
Inhabilita la función
multiclusterservicediscovery:gcloud container fleet multi-cluster-services disableInhabilitar entrada de varios clústeres
gcloud container fleet ingress disableInhabilita las API:
gcloud services disable \ multiclusterservicediscovery.googleapis.com \ multiclusteringress.googleapis.com \ trafficdirector.googleapis.com \ --project=PROJECT_ID
Soluciona problemas
Sin upstream en buen estado
Síntoma:
El siguiente problema puede ocurrir cuando creas una puerta de enlace, pero no puedes acceder a los servicios de backend (código de respuesta 503):
no healthy upstream
Motivo:
Este mensaje de error indica que el sistema de sondeo de verificación de estado no puede encontrar servicios de backend en buen estado. Es posible que tus servicios de backend estén en buen estado, pero es posible que debas personalizar las verificaciones de estado.
Solución alternativa:
Para resolver este problema, personaliza la verificación de estado según los requisitos de tu aplicación (por ejemplo, /health) mediante un HealthCheckPolicy.
¿Qué sigue?
- Obtén más información sobre el controlador de puerta de enlace.