Los balanceadores de cargas externos (ELB) exponen los servicios para que se pueda acceder a ellos desde fuera de la organización a través de las direcciones IP de un grupo asignado a la organización desde el grupo más grande de IPs externas de instancias.
Las direcciones IP virtuales (VIP) de ELB no entran en conflicto entre las organizaciones y son únicas en todas las organizaciones. Por este motivo, debes usar los servicios de ELB solo para los servicios a los que los clientes externos a la organización necesariamente deben acceder.
Las cargas de trabajo que se ejecutan dentro de la organización pueden acceder a los servicios de ELB siempre que habilites las cargas de trabajo para que salgan de la organización. Este patrón de tráfico requiere de manera eficaz tráfico saliente de la organización antes de regresar al servicio interno.
Antes de comenzar
Para configurar los servicios de ELB, debes tener lo siguiente:
- Ser propietario del proyecto para el que configuras el balanceador de cargas Para obtener más información, consulta Cómo crear un proyecto.
- Una política de entrada
ProjectNetworkPolicy
(PNP) personalizada para permitir el tráfico a este servicio de ELB. Para obtener más información, consulta Configura PNP para permitir el tráfico al ELB. Los roles de identidad y acceso necesarios son los siguientes:
- Administrador de NetworkPolicy del proyecto: Tiene acceso para administrar las políticas de red del proyecto en el espacio de nombres del proyecto. Pídele al administrador de IAM de la organización que te otorgue el rol de administrador de NetworkPolicy del proyecto (
project-networkpolicy-admin
). - Administrador de balanceador de cargas: Pídele al administrador de IAM de tu organización que te otorgue el rol de administrador de balanceador de cargas (
load-balancer-admin
). - Administrador de balanceador de cargas global: Para los ELB globales, pídele al administrador de IAM de tu organización que te otorgue el rol de administrador de balanceador de cargas global (
global-load-balancer-admin
). Para obtener más información, consulta Descripciones de roles predefinidos.
- Administrador de NetworkPolicy del proyecto: Tiene acceso para administrar las políticas de red del proyecto en el espacio de nombres del proyecto. Pídele al administrador de IAM de la organización que te otorgue el rol de administrador de NetworkPolicy del proyecto (
Configura PNP para permitir el tráfico al ELB
Para que los servicios de ELB funcionen, debes configurar y aplicar tu propia ProjectNetworkPolicy
política de entrada personalizada para permitir el tráfico a las cargas de trabajo de este servicio de ELB.
Las políticas de red controlan el acceso a tus cargas de trabajo, no al balanceador de cargas en sí.
Los ELB exponen las cargas de trabajo a la red de tu cliente, lo que requiere políticas de red explícitas para permitir el tráfico externo al puerto de la carga de trabajo, como 8080
.
Especifica la dirección CIDR externa para permitir el tráfico a las cargas de trabajo de este ELB:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF
apiVersion: networking.gdc.goog/v1
kind: ProjectNetworkPolicy
metadata:
namespace: PROJECT
name: allow-inbound-traffic-from-external
spec:
policyType: Ingress
subject:
subjectType: UserWorkload
ingress:
- from:
- ipBlock:
cidr: CIDR
ports:
- protocol: TCP
port: PORT
EOF
Reemplaza lo siguiente:
MANAGEMENT_API_SERVER
: Es la ruta de acceso de kubeconfig del servidor de la API de administración. Si aún no generaste un archivo kubeconfig para el servidor de la API en la zona de destino, consulta Acceder para obtener más detalles.PROJECT
: Es el nombre de tu proyecto de GDC.CIDR
: Es el CIDR externo desde el que se debe acceder al ELB. Esta política es obligatoria, ya que el balanceador de cargas externo usa el retorno directo del servidor (DSR), que conserva la dirección IP externa de origen y omite el balanceador de cargas en la ruta de retorno. Para obtener más información, consulta Crea una regla de firewall de entrada global para el tráfico entre organizaciones.PORT
: Es el puerto de backend en los Pods detrás del balanceador de cargas. Este valor se encuentra en el campo.spec.ports[].targetPort
del manifiesto del recursoService
. Este campo es opcional.
Crea un balanceador de cargas externo
Puedes crear ELB globales o zonales. El alcance de los ELB globales abarca un universo de GDC. El alcance de los ELB zonales se limita a la zona especificada en el momento de la creación. Para obtener más información, consulta Balanceadores de cargas globales y zonales.
Crea ELB con tres métodos diferentes en GDC:
- Usa la CLI de gcloud para crear ELB globales o zonales.
- Usa la API del modelo de recursos de Kubernetes (KRM) de redes para crear ELB globales o zonales.
- Usa el servicio de Kubernetes directamente en el clúster de Kubernetes. Este método solo está disponible para los ELB zonales.
Puedes segmentar las cargas de trabajo de pods o VM con la API de KRM y la CLI de gdcloud. Solo puedes segmentar cargas de trabajo en el clúster en el que se crea el objeto Service
cuando usas el servicio de Kubernetes directamente en el clúster de Kubernetes.
Crea un ELB zonal
Crea un ELB zonal con la CLI de gcloud, la API de KRM o el servicio de Kubernetes en el clúster de Kubernetes:
gdcloud
Crea un ELB que apunte a cargas de trabajo de pods o VM con la CLI de gcloud.
Este ELB segmenta todas las cargas de trabajo del proyecto que coinciden con la etiqueta definida en el objeto Backend
.
Para crear un ELB con gcloud CLI, sigue estos pasos:
Crea un recurso
Backend
para definir el extremo del ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --zone=ZONE \ --cluster=CLUSTER_NAME
Reemplaza lo siguiente:
BACKEND_NAME
: Es el nombre que elegiste para el recurso de backend, comomy-backend
.LABELS
: Es un selector que define qué extremos entre los Pods y las VMs se usarán para este recurso de backend. Por ejemplo,app=web
PROJECT_NAME
: nombre del proyecto.ZONE
: Es la zona que se usará para esta invocación. Para preestablecer la marca de zona para todos los comandos que la requieren, ejecutagdcloud config set core/zone ZONE
. La marca de zona solo está disponible en entornos de varias zonas. Este campo es opcional.CLUSTER_NAME
: Es el clúster al que se limita el alcance de los selectores definidos. Si no se especifica este campo, se seleccionarán todos los extremos con la etiqueta determinada. Este campo es opcional.
Omite este paso si este ELB es para cargas de trabajo de pods. Si configuras un ELB para cargas de trabajo de VM, define una verificación de estado para el ELB:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --zone=ZONE
Reemplaza lo siguiente:
HEALTH_CHECK_NAME
: Es el nombre que elegiste para el recurso de verificación de estado, comomy-health-check
.CHECK_INTERVAL
: Es la cantidad de tiempo en segundos desde el inicio de un sondeo hasta el inicio del siguiente. El valor predeterminado es5
. Este campo es opcional.HEALTHY_THRESHOLD
: Es el tiempo que se debe esperar antes de declarar una falla. El valor predeterminado es5
. Este campo es opcional.TIMEOUT
: Es la cantidad de tiempo en segundos que se debe esperar antes de declarar una falla. El valor predeterminado es5
. Este campo es opcional.UNHEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben fallar para que el extremo se considere en mal estado. El valor predeterminado es2
. Este campo es opcional.PORT
: Es el puerto en el que se realiza la verificación de estado. El valor predeterminado es80
. Este campo es opcional.ZONE
: Es la zona en la que crearás este ELB.
Crea un recurso
BackendService
y agrégale el recursoBackend
creado anteriormente:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --zone=ZONE \ --health-check=HEALTH_CHECK_NAME
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: Es el nombre elegido para este servicio de backend.TARGET_PORT
: Es una lista separada por comas de los puertos de destino que traduce este servicio de backend, en la que cada puerto de destino especifica el protocolo, el puerto en la regla de reenvío y el puerto en la instancia de backend. Puedes especificar varios puertos de destino. Este campo debe tener el formatoprotocol:port:targetport
, comoTCP:80:8080
. Este campo es opcional.HEALTH_CHECK_NAME
: Es el nombre del recurso de verificación de estado. Este campo es opcional. Incluye este campo solo si configuras un ELB para cargas de trabajo de VM.
Agrega el recurso
BackendService
al recursoBackend
creado anteriormente:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --project=PROJECT_NAME \ --zone=ZONE
Opcional: Usa la afinidad de sesión para los ELB para garantizar que las solicitudes del mismo cliente se enruten de forma coherente al mismo backend. Para habilitar la afinidad de sesión para los balanceadores de cargas, crea una política de servicio de backend con el comando
gdcloud compute load-balancer-policy create
:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABEL
Reemplaza lo siguiente:
POLICY_NAME
: Es el nombre que elegiste para la política del servicio de backend.MODE
: Es el modo de afinidad de sesión. Se admiten dos modos:NONE
: La afinidad de sesión está inhabilitada. Las solicitudes se enrutan a cualquier backend disponible. Este es el modo predeterminado.CLIENT_IP_DST_PORT_PROTO
: Las solicitudes de la misma cuádruple (dirección IP de origen, dirección IP de destino, puerto de destino y protocolo) se enrutan al mismo backend.
RESOURCE_LABEL
: Es el selector de etiquetas que selecciona a qué servicio de backend se aplica el recursoBackendServicePolicy
en el espacio de nombres del proyecto. Si varios recursosBackendServicePolicy
coinciden con el mismo servicio de backend y, al menos, una de estas políticas tiene habilitada la afinidad de sesión, se habilitará la afinidad de sesión para este recursoBackendService
.
Crea un recurso
ForwardingRule
externo que defina la VIP en la que está disponible el servicio:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --zone=ZONE \ --project=PROJECT_NAME
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: El nombre de tu servicio de backend.FORWARDING_RULE_EXTERNAL_NAME
: Es el nombre que elegiste para la regla de reenvío.CIDR
: Este campo es opcional. Si no se especifica, se reserva automáticamente un CIDR deIPv4/32
del grupo de IP zonales. Especifica el nombre de un recursoSubnet
en el mismo espacio de nombres que esta regla de reenvío. Un recursoSubnet
representa la información de solicitud y asignación de una subred zonal. Para obtener más información sobre los recursosSubnet
, consulta Ejemplo de recursos personalizados.PROTOCOL_PORT
: Es el protocolo y el puerto que se expondrán en la regla de reenvío. Este campo debe tener el formatoip-protocol=TCP:80
. El puerto expuesto debe ser el mismo que el que expone la aplicación real dentro del contenedor.
Para verificar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Para obtener la dirección IP asignada del balanceador de cargas, describe la regla de reenvío:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Para validar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Verifica el tráfico con una solicitudcurl
a la VIP:Para obtener la VIP asignada, describe la regla de reenvío:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Verifica el tráfico con una solicitud
curl
a la VIP en el puerto especificado en el campoPROTOCOL_PORT
de la regla de reenvío:curl http://FORWARDING_RULE_VIP:PORT
Reemplaza lo siguiente:
FORWARDING_RULE_VIP
: Es la VIP de la regla de reenvío.PORT
: Es el número de puerto del campoPROTOCOL_PORT
en la regla de reenvío.
API
Crea un ELB que se dirija a cargas de trabajo de pods o VM con la API de KRM.
Este ELB segmenta todas las cargas de trabajo del proyecto que coinciden con la etiqueta definida en el objeto Backend
.
Para crear un ELB zonal con la API de KRM, sigue estos pasos:
Crea un recurso
Backend
para definir los extremos del ELB. Crea recursos deBackend
para cada zona en la que se colocan las cargas de trabajo:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOF
Reemplaza lo siguiente:
MANAGEMENT_API_SERVER
: Es la ruta de acceso de kubeconfig del servidor de la API de administración zonal. Para obtener más información, consulta Cómo cambiar a un contexto zonal.PROJECT_NAME
: nombre del proyecto.BACKEND_NAME
: El nombre del recursoBackend
.CLUSTER_NAME
: Este es un campo opcional. Este campo especifica el clúster al que se limita el alcance de los selectores definidos. Este campo no se aplica a las cargas de trabajo de VM. Si un recursoBackend
no incluye el campoclusterName
, las etiquetas especificadas se aplican a todas las cargas de trabajo del proyecto.
Omite este paso si este ELB es para cargas de trabajo de pods. Si configuras un ELB para cargas de trabajo de VM, define una verificación de estado para el ELB:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOF
Reemplaza lo siguiente:
HEALTH_CHECK_NAME
: Es el nombre que elegiste para el recurso de verificación de estado, comomy-health-check
.PORT
: Es el puerto en el que se realiza la verificación de estado. El valor predeterminado es80
.TIMEOUT
: Es la cantidad de tiempo en segundos que se debe esperar antes de declarar una falla. El valor predeterminado es5
.CHECK_INTERVAL
: Es la cantidad de tiempo en segundos desde el inicio de un sondeo hasta el inicio del siguiente. El valor predeterminado es5
.HEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben aprobarse para que el extremo se considere en buen estado. El valor predeterminado es2
.UNHEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben fallar para que el extremo se considere en mal estado. El valor predeterminado es2
.
Crea un objeto
BackendService
con el recursoBackend
creado anteriormente. Si configuras un ELB para cargas de trabajo de VM, incluye el recursoHealthCheck
.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME healthCheckName: HEALTH_CHECK_NAME EOF
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: Es el nombre elegido para tu recursoBackendService
.HEALTH_CHECK_NAME
: Es el nombre del recursoHealthCheck
que creaste anteriormente. No incluyas este campo si configuras un ELB para cargas de trabajo de pods.
Opcional: Usa la afinidad de sesión para los ELB para garantizar que las solicitudes del mismo cliente se enruten de forma coherente al mismo backend. Para habilitar la afinidad de sesión para los balanceadores de cargas, crea un recurso
BackendServicePolicy
. Este recurso define la configuración de afinidad de sesión y aplica el recursoBackendServicePolicy
al recursoBackendService
. Crea y aplica el recursoBackendServicePolicy
:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABEL
Reemplaza lo siguiente:
POLICY_NAME
: Es el nombre que elegiste para la política del servicio de backend.MODE
: Es el modo de afinidad de sesión. Se admiten dos modos:NONE
: La afinidad de sesión está inhabilitada. Las solicitudes se enrutan a cualquier backend disponible. Este es el modo predeterminado.CLIENT_IP_DST_PORT_PROTO
: Las solicitudes de la misma cuádruple (dirección IP de origen, dirección IP de destino, puerto de destino y protocolo) se enrutan al mismo backend.
RESOURCE_LABEL
: Es el selector de etiquetas que selecciona a qué servicio de backend se aplica el recursoBackendServicePolicy
en el espacio de nombres del proyecto. Si varios recursosBackendServicePolicy
coinciden con el mismo servicio de backend y, al menos, una de estas políticas tiene habilitada la afinidad de sesión, se habilitará la afinidad de sesión para este recursoBackendService
.
Crea un recurso
ForwardingRule
externo que defina la VIP en la que está disponible el servicio.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME Name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT Protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: Es el nombre de tu recursoBackendService
.FORWARDING_RULE_EXTERNAL_NAME
: Es el nombre que elegiste para tu recursoForwardingRuleExternal
.CIDR
: Este campo es opcional. Si no se especifica, se reserva automáticamente un CIDR deIPv4/32
del grupo de IP zonales. Especifica el nombre de un recursoSubnet
en el mismo espacio de nombres que esta regla de reenvío. Un recursoSubnet
representa la información de solicitud y asignación de una subred zonal. Para obtener más información sobre los recursosSubnet
, consulta Ejemplo de recursos personalizados.PORT
: Usa el campoports
para especificar un array de puertos de L4 para los que se reenvían paquetes a los backends configurados con esta regla de reenvío. Se debe especificar al menos un puerto. Usa el campoport
para especificar un número de puerto. El puerto expuesto debe ser el mismo que el que expone la aplicación real dentro del contenedor.PROTOCOL
: Es el protocolo que se usará para la regla de reenvío, comoTCP
. Una entrada en el arrayports
debe verse de la siguiente manera:ports: - port: 80 protocol: TCP
Para validar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Verifica el tráfico con una solicitudcurl
a la VIP:Para obtener la VIP, usa
kubectl get
:kubectl get forwardingruleexternal -n PROJECT_NAME
El resultado luce de la siguiente manera:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True
Verifica el tráfico con una solicitud
curl
a la VIP en el puerto especificado en el campoPORT
de la regla de reenvío:curl http://FORWARDING_RULE_VIP:PORT
Reemplaza
FORWARDING_RULE_VIP
por la VIP de la regla de reenvío.
Service de Kubernetes
Puedes crear ELB en GDC creando un objeto Service
de Kubernetes de tipo LoadBalancer
en un clúster de Kubernetes.
Para crear un servicio de ELB, haz lo siguiente:
Crea un archivo YAML para la definición de
Service
del tipoLoadBalancer
.El siguiente objeto
Service
es un ejemplo de un servicio de ELB:apiVersion: v1 kind: Service metadata: name: ELB_SERVICE_NAME namespace: PROJECT_NAME spec: ports: - port: 1235 protocol: TCP targetPort: 1235 selector: k8s-app: my-app type: LoadBalancer
Reemplaza lo siguiente:
ELB_SERVICE_NAME
: Es el nombre del servicio de ELB.PROJECT_NAME
: Es el espacio de nombres de tu proyecto que contiene las cargas de trabajo de backend.
El campo
port
configura el puerto de frontend que expones en la dirección VIP. El campotargetPort
configura el puerto de backend al que deseas retransmitir el tráfico en las cargas de trabajo de backend. El balanceador de cargas admite la traducción de direcciones de red (NAT). Los puertos de frontend y backend pueden ser diferentes.En el campo
selector
de la definición deService
, especifica pods o máquinas virtuales como las cargas de trabajo de backend.El selector define qué cargas de trabajo se tomarán como cargas de trabajo de backend para este servicio, en función de la coincidencia de las etiquetas que especifiques con las etiquetas de las cargas de trabajo. El
Service
solo puede seleccionar cargas de trabajo de backend en el mismo proyecto y el mismo clúster en los que definas elService
.Para obtener más información sobre la selección de servicios, consulta https://kubernetes.io/docs/concepts/services-networking/service/.
Guarda el archivo de definición
Service
en el mismo proyecto que las cargas de trabajo de backend.Aplica el archivo de definición
Service
al clúster:kubectl apply -f ELB_FILE
Reemplaza
ELB_FILE
por el nombre del archivo de definición deService
para el servicio de ELB.Cuando creas un ELB, el servicio obtiene dos direcciones IP. Una es una dirección IP interna a la que solo se puede acceder desde el mismo clúster. La otra es la dirección IP externa, a la que se puede acceder desde dentro y fuera de la organización. Para obtener las direcciones IP del servicio ELB, consulta el estado del servicio:
kubectl -n PROJECT_NAME get svc ELB_SERVICE_NAME
Reemplaza lo siguiente:
PROJECT_NAME
: Es el espacio de nombres de tu proyecto que contiene las cargas de trabajo de backend.ELB_SERVICE_NAME
: Es el nombre del servicio de ELB.
Debes obtener un resultado similar al siguiente ejemplo:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE elb-service LoadBalancer 10.0.0.1 20.12.1.11 1235:31931/TCP 22h
EXTERNAL-IP
es la dirección IP del servicio al que se puede acceder desde fuera de la organización.Si no obtienes un resultado, asegúrate de haber creado el servicio de ELB correctamente.
Crea un ELB global
Crea un ELB global con la CLI de gcloud o la API de KRM.
gdcloud
Crea un ELB que apunte a cargas de trabajo de pods o VM con la CLI de gcloud.
Este ELB segmenta todas las cargas de trabajo del proyecto que coinciden con la etiqueta definida en el objeto Backend
. El recurso personalizado Backend
debe tener un alcance limitado a una zona.
Para crear un ELB con gcloud CLI, sigue estos pasos:
Crea un recurso
Backend
para definir el extremo del ELB:gdcloud compute backends create BACKEND_NAME \ --labels=LABELS \ --project=PROJECT_NAME \ --cluster=CLUSTER_NAME \ --zone=ZONE
Reemplaza lo siguiente:
BACKEND_NAME
: Es el nombre que elegiste para el recurso de backend, comomy-backend
.LABELS
: Es un selector que define qué extremos entre los Pods y las VMs se usarán para este recurso de backend. Por ejemplo,app=web
PROJECT_NAME
: nombre del proyecto.CLUSTER_NAME
: Es el clúster al que se limita el alcance de los selectores definidos. Si no se especifica este campo, se seleccionarán todos los extremos con la etiqueta determinada. Este campo es opcional.ZONE
: Es la zona que se usará para esta invocación. Para preestablecer la marca de zona para todos los comandos que la requieren, ejecutagdcloud config set core/zone ZONE
. La marca de zona solo está disponible en entornos multizona. Este campo es opcional.
Omite este paso si este ELB es para cargas de trabajo de pods. Si configuras un ELB para cargas de trabajo de VM, define una verificación de estado para el ELB:
gdcloud compute health-checks create tcp HEALTH_CHECK_NAME \ --check-interval=CHECK_INTERVAL \ --healthy-threshold=HEALTHY_THRESHOLD \ --timeout=TIMEOUT \ --unhealthy-threshold=UNHEALTHY_THRESHOLD \ --port=PORT \ --global
Reemplaza lo siguiente:
HEALTH_CHECK_NAME
: Es el nombre que elegiste para el recurso de verificación de estado, comomy-health-check
.CHECK_INTERVAL
: Es la cantidad de tiempo en segundos desde el inicio de un sondeo hasta el inicio del siguiente. El valor predeterminado es5
. Este campo es opcional.HEALTHY_THRESHOLD
: Es el tiempo que se debe esperar antes de declarar una falla. El valor predeterminado es5
. Este campo es opcional.TIMEOUT
: Es la cantidad de tiempo en segundos que se debe esperar antes de declarar una falla. El valor predeterminado es5
. Este campo es opcional.UNHEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben fallar para que el extremo se considere en mal estado. El valor predeterminado es2
. Este campo es opcional.PORT
: Es el puerto en el que se realiza la verificación de estado. El valor predeterminado es80
. Este campo es opcional.
Crea un recurso
BackendService
y agrégale el recursoBackend
creado anteriormente:gdcloud compute backend-services create BACKEND_SERVICE_NAME \ --project=PROJECT_NAME \ --target-ports=TARGET_PORTS \ --health-check=HEALTH_CHECK_NAME \ --global
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: Es el nombre elegido para este servicio de backend.TARGET_PORTS
: Es una lista separada por comas de los puertos de destino que traduce este servicio de backend, en la que cada puerto de destino especifica el protocolo, el puerto en la regla de reenvío y el puerto en la instancia de backend. Puedes especificar varios puertos de destino. Este campo debe tener el formatoprotocol:port:targetport
, comoTCP:80:8080
. Este campo es opcional.HEALTH_CHECK_NAME
: Es el nombre del recurso de verificación de estado. Este campo es opcional. Incluye este campo solo si configuras un ELB para cargas de trabajo de VM.
Agrega el recurso
BackendService
al recursoBackend
creado anteriormente:gdcloud compute backend-services add-backend BACKEND_SERVICE_NAME \ --backend=BACKEND_NAME \ --backend-zone BACKEND_ZONE \ --project=PROJECT_NAME \ --global
Opcional: Usa la afinidad de sesión para los ELB para garantizar que las solicitudes del mismo cliente se enruten de forma coherente al mismo backend. Para habilitar la afinidad de sesión para los balanceadores de cargas, crea una política de servicio de backend con el comando
gdcloud compute load-balancer-policy create
:gdcloud compute load-balancer-policy create POLICY_NAME --session-affinity=MODE --selectors=RESOURCE_LABEL
Reemplaza lo siguiente:
POLICY_NAME
: Es el nombre que elegiste para la política del servicio de backend.MODE
: Es el modo de afinidad de sesión. Se admiten dos modos:NONE
: La afinidad de sesión está inhabilitada. Las solicitudes se enrutan a cualquier backend disponible. Este es el modo predeterminado.CLIENT_IP_DST_PORT_PROTO
: Las solicitudes de la misma cuádruple (dirección IP de origen, dirección IP de destino, puerto de destino y protocolo) se enrutan al mismo backend.
RESOURCE_LABEL
: Es el selector de etiquetas que selecciona a qué servicio de backend se aplica el recursoBackendServicePolicy
en el espacio de nombres del proyecto. Si varios recursosBackendServicePolicy
coinciden con el mismo servicio de backend y, al menos, una de estas políticas tiene habilitada la afinidad de sesión, se habilitará la afinidad de sesión para este recursoBackendService
.
Crea un recurso
ForwardingRule
externo que defina la VIP en la que está disponible el servicio:gdcloud compute forwarding-rules create FORWARDING_RULE_EXTERNAL_NAME \ --backend-service=BACKEND_SERVICE_NAME \ --cidr=CIDR \ --ip-protocol-port=PROTOCOL_PORT \ --load-balancing-scheme=EXTERNAL \ --project=PROJECT_NAME \ --global
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: El nombre de tu servicio de backend.FORWARDING_RULE_EXTERNAL_NAME
: Es el nombre que elegiste para la regla de reenvío.CIDR
: Este campo es opcional. Si no se especifica, se reserva automáticamente un CIDRIPv4/32
del grupo de IP global. Especifica el nombre de un recursoSubnet
en el mismo espacio de nombres que esta regla de reenvío. Un recursoSubnet
representa la información de solicitud y asignación de una subred global. Para obtener más información sobre los recursosSubnet
, consulta Ejemplos de recursos personalizados.PROTOCOL_PORT
: Es el protocolo y el puerto que se expondrán en la regla de reenvío. Este campo debe tener el formatoip-protocol=TCP:80
. El puerto expuesto debe ser el mismo que el que expone la aplicación real dentro del contenedor.
Para verificar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Para obtener la dirección IP asignada del balanceador de cargas, describe la regla de reenvío:gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME
Para validar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Verifica el tráfico con una solicitudcurl
a la VIP:Para obtener la VIP asignada, describe la regla de reenvío:
gdcloud compute forwarding-rules describe FORWARDING_RULE_EXTERNAL_NAME --global
Verifica el tráfico con una solicitud
curl
a la VIP en el puerto especificado en el campoPROTOCOL_PORT
de la regla de reenvío:curl http://FORWARDING_RULE_VIP:PORT
Reemplaza lo siguiente:
FORWARDING_RULE_VIP
: Es la VIP de la regla de reenvío.PORT
: Es el número de puerto del campoPROTOCOL_PORT
en la regla de reenvío.
API
Crea un ELB que se dirija a cargas de trabajo de pods o VM con la API de KRM. Este ELB segmenta todas las cargas de trabajo del proyecto que coinciden con la etiqueta definida en el objeto Backend. Para crear un ELB zonal con la API de KRM, sigue estos pasos:
Crea un recurso
Backend
para definir los extremos del ELB. Crea recursos deBackend
para cada zona en la que se colocan las cargas de trabajo:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.gdc.goog/v1 kind: Backend metadata: namespace: PROJECT_NAME name: BACKEND_NAME spec: clusterName: CLUSTER_NAME endpointsLabels: matchLabels: app: server EOF
Reemplaza lo siguiente:
MANAGEMENT_API_SERVER
: Es la ruta de acceso a kubeconfig del servidor de la API de administración global. Para obtener más información, consulta Cómo cambiar al contexto global.PROJECT_NAME
: nombre del proyecto.BACKEND_NAME
: El nombre del recursoBackend
.CLUSTER_NAME
: Este es un campo opcional. Este campo especifica el clúster al que se limita el alcance de los selectores definidos. Este campo no se aplica a las cargas de trabajo de VM. Si un recursoBackend
no incluye el campoclusterName
, las etiquetas especificadas se aplican a todas las cargas de trabajo del proyecto.
Omite este paso si este ELB es para cargas de trabajo de pods. Si configuras un ELB para cargas de trabajo de VM, define una verificación de estado para el ELB:
kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: HealthCheck metadata: namespace: PROJECT_NAME name: HEALTH_CHECK_NAME spec: tcpHealthCheck: port: PORT timeoutSec: TIMEOUT checkIntervalSec: CHECK_INTERVAL healthyThreshold: HEALTHY_THRESHOLD unhealthyThreshold: UNHEALTHY_THRESHOLD EOF
Reemplaza lo siguiente:
HEALTH_CHECK_NAME
: Es el nombre que elegiste para el recurso de verificación de estado, comomy-health-check
.PORT
: Es el puerto en el que se realiza la verificación de estado. El valor predeterminado es80
.TIMEOUT
: Es la cantidad de tiempo en segundos que se debe esperar antes de declarar una falla. El valor predeterminado es5
.CHECK_INTERVAL
: Es la cantidad de tiempo en segundos desde el inicio de un sondeo hasta el inicio del siguiente. El valor predeterminado es5
.HEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben aprobarse para que el extremo se considere en buen estado. El valor predeterminado es2
.UNHEALTHY_THRESHOLD
: Es la cantidad de sondeos secuenciales que deben fallar para que el extremo se considere en mal estado. El valor predeterminado es2
.
Dado que se trata de un ELB global, crea la verificación de estado en la API global.
Crea un objeto
BackendService
con el recursoBackend
creado anteriormente. Si configuras un ELB para cargas de trabajo de VM, incluye el recursoHealthCheck
.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendService metadata: namespace: PROJECT_NAME name: BACKEND_SERVICE_NAME spec: backendRefs: - name: BACKEND_NAME zone: ZONE healthCheckName: HEALTH_CHECK_NAME targetPorts: - port: PORT protocol: PROTOCOL targetPort: TARGET_PORT EOF
Reemplaza lo siguiente:
BACKEND_SERVICE_NAME
: Es el nombre elegido para tu recursoBackendService
.HEALTH_CHECK_NAME
: Es el nombre del recursoHealthCheck
que creaste anteriormente. No incluyas este campo si configuras un ELB para cargas de trabajo de Pod.ZONE
: Es la zona en la que se crea el recursoBackend
. Puedes especificar varios backends en el campobackendRefs
. Por ejemplo:- name: my-be zone: Zone-A - name: my-be zone: Zone-B
El campo
targetPorts
es opcional. En este recurso, se enumeran los puertos que traduce el recursoBackendService
. Si usas este objeto, proporciona valores para lo siguiente:PORT
: Es el puerto que expone el servicio.PROTOCOL
: Es el protocolo de capa 4 con el que debe coincidir el tráfico. Solo se admiten TCP y UDP.TARGET_PORT
: Es el puerto al que se traduce el valor dePORT
, como8080
. El valor deTARGET_PORT
no se puede repetir en un objeto determinado. Un ejemplo paratargetPorts
podría verse de la siguiente manera:targetPorts: - port: 80 protocol: TCP targetPort: 8080
Opcional: Usa la afinidad de sesión para los ELB para garantizar que las solicitudes del mismo cliente se enruten de forma coherente al mismo backend. Para habilitar la afinidad de sesión para los balanceadores de cargas, crea un recurso
BackendServicePolicy
. Este recurso define la configuración de afinidad de sesión y aplica el recursoBackendServicePolicy
al recursoBackendService
. Crea y aplica el recursoBackendServicePolicy
:kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: BackendServicePolicy metadata: namespace: PROJECT_NAME name: POLICY_NAME spec: sessionAffinity: MODE selector: matchLabels: RESOURCE_LABEL
Reemplaza lo siguiente:
POLICY_NAME
: Es el nombre que elegiste para la política del servicio de backend.MODE
: Es el modo de afinidad de sesión. Se admiten dos modos:NONE
: La afinidad de sesión está inhabilitada. Las solicitudes se enrutan a cualquier backend disponible. Este es el modo predeterminado.CLIENT_IP_DST_PORT_PROTO
: Las solicitudes de la misma cuádruple (dirección IP de origen, dirección IP de destino, puerto de destino y protocolo) se enrutan al mismo backend.
RESOURCE_LABEL
: Es el selector de etiquetas que selecciona a qué servicio de backend se aplica el recursoBackendServicePolicy
en el espacio de nombres del proyecto. Si varios recursosBackendServicePolicy
coinciden con el mismo servicio de backend y, al menos, una de estas políticas tiene habilitada la afinidad de sesión, se habilitará la afinidad de sesión para este recursoBackendService
.
Crea un recurso
ForwardingRule
externo que defina la VIP en la que está disponible el servicio.kubectl --kubeconfig MANAGEMENT_API_SERVER apply -f - <<EOF apiVersion: networking.global.gdc.goog/v1 kind: ForwardingRuleExternal metadata: namespace: PROJECT_NAME Name: FORWARDING_RULE_EXTERNAL_NAME spec: cidrRef: CIDR ports: - port: PORT Protocol: PROTOCOL backendServiceRef: name: BACKEND_SERVICE_NAME EOF
Reemplaza lo siguiente:
FORWARDING_RULE_EXTERNAL_NAME
: Es el nombre elegido para tu recursoForwardingRuleExternal
.CIDR
: Este campo es opcional. Si no se especifica, se reserva automáticamente un CIDRIPv4/32
del grupo de IP global. Especifica el nombre de un recursoSubnet
en el mismo espacio de nombres que esta regla de reenvío. Un recursoSubnet
representa la información de solicitud y asignación de una subred global. Para obtener más información sobre los recursosSubnet
, consulta Ejemplos de recursos personalizados.PORT
: Usa el campoports
para especificar un array de puertos de L4 para los que se reenvían paquetes a los backends configurados con esta regla de reenvío. Se debe especificar al menos un puerto. Usa el campoport
para especificar un número de puerto. El puerto expuesto debe ser el mismo que el que expone la aplicación real dentro del contenedor.PROTOCOL
: Es el protocolo que se usará para la regla de reenvío, comoTCP
. Una entrada en el arrayports
debe verse de la siguiente manera:ports: - port: 80 protocol: TCP
Para validar el ELB configurado, confirma la condición
Ready
en cada uno de los objetos creados. Verifica el tráfico con una solicitudcurl
a la VIP:Para obtener la VIP, usa
kubectl get
:kubectl get forwardingruleexternal -n PROJECT_NAME
El resultado luce de la siguiente manera:
NAME BACKENDSERVICE CIDR READY elb-name BACKEND_SERVICE_NAME 10.200.32.59/32 True
Verifica el tráfico con una solicitud
curl
a la VIP en el puerto especificado en el campoPORT
de la regla de reenvío:curl http://FORWARDING_RULE_VIP:PORT
Reemplaza
FORWARDING_RULE_VIP
por la VIP de la regla de reenvío.