En esta página se explica cómo habilitar y usar los servicios multiclúster (MCS). Para obtener más información sobre cómo funciona MCS y sus ventajas, consulta Servicios multiclúster.
La función MCS de Google Kubernetes Engine (GKE) amplía el alcance del servicio de Kubernetes más allá del límite del clúster y te permite descubrir e invocar servicios en varios clústeres de GKE. Puede exportar un subconjunto de los servicios que ya tenga o de los nuevos.
Cuando exportas un servicio con MCS, ese servicio está disponible en todos los clústeres de tu flota.
En esta página se explica cómo configurar MCS con un solo proyecto. Para configurar una VPC compartida entre varios proyectos, sigue las instrucciones de Configurar servicios de varios clústeres con VPC compartida.
Google Cloud Recursos gestionados por MCS
MCS gestiona los siguientes componentes de Google Cloud:
Cloud DNS: MCS configura las zonas y los registros de Cloud DNS de cada servicio exportado en tus clústeres de flota. Esto te permite conectarte a servicios que se ejecutan en otros clústeres. Estas zonas y registros se crean, leen, actualizan y eliminan en función de los servicios que elijas exportar entre clústeres.
Reglas de cortafuegos: MCS configura reglas de cortafuegos que permiten que los pods se comuniquen entre sí en los clústeres de tu flota. Las reglas de firewall se crean, leen, actualizan y eliminan en función de los clústeres que añadas a tu flota. Estas reglas son similares a las que crea GKE para habilitar la comunicación entre pods de un clúster de GKE.
Cloud Service Mesh: MCS usa Cloud Service Mesh como plano de control para monitorizar los endpoints y su estado en los clústeres.
Requisitos
MCS tiene los siguientes requisitos:
MCS solo admite la exportación de servicios de clústeres de GKE nativos de VPC en Google Cloud. Para obtener más información, consulta el artículo Crear un clúster nativo de VPC. No puedes usar clústeres estándar de GKE que no sean nativos de VPC.
La conectividad entre clústeres depende de si los clústeres se ejecutan en la misma red de VPC o en redes de VPC emparejadas o compartidas. Si los clústeres están en redes independientes que no están conectadas, se bloquearán las llamadas a servicios externos. Te recomendamos que habilites MCS en proyectos en los que los clústeres estén en la misma red de VPC.
Para configurar MCS en una flota entre proyectos con una VPC compartida, sigue las instrucciones de Configurar servicios de varios clústeres con VPC compartida.
Aunque una flota puede abarcar varios proyectos y redes de VPC, un servicio de varios clústeres debe exportarse desde un único proyecto y una única red de VPC. Google Cloud
MCS no es compatible con las políticas de red.
Los clústeres deben tener habilitado el complemento
HttpLoadBalancing
. Asegúrate de que el complementoHttpLoadBalancing
esté habilitado. El complementoHttpLoadBalancing
está habilitado de forma predeterminada y no debe inhabilitarse.
Precios
Los servicios multi-clúster se incluyen en la tarifa de gestión de clústeres de GKE y no tienen ningún coste adicional por uso. Debes habilitar la API Traffic Director, pero MCS no incurre en ningún cargo por los endpoints de Cloud Service Mesh.
Antes de empezar
Antes de empezar, asegúrate de haber realizado las siguientes tareas:
Instala el SDK de Google Cloud.
Habilita la API de Google Kubernetes Engine:
Conecta tus redes de VPC con VPC Network Peering, Cloud Interconnect o Cloud VPN.
Habilita las APIs MCS, de flota (hub), Resource Manager, Cloud Service Mesh y Cloud DNS:
gcloud services enable \ multiclusterservicediscovery.googleapis.com \ gkehub.googleapis.com \ cloudresourcemanager.googleapis.com \ trafficdirector.googleapis.com \ dns.googleapis.com \ --project=PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que quieras registrar tus clústeres en una flota.
Habilitar MCS en tu proyecto
MCS requiere que los clústeres de GKE participantes estén registrados en la misma flota. Una vez que la función MCS está habilitada en una flota, cualquier clúster puede exportar servicios entre clústeres de la flota.
Habilitar MCS en un clúster de GKE
Habilita la función MCS para la flota de tu proyecto:
gcloud container fleet multi-cluster-services enable \ --project PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que quieras registrar tus clústeres en una flota. Este es tu proyecto host de la flota.Al habilitar los servicios multiclúster en el proyecto host de la flota, se crea o se asegura que exista la cuenta de servicio
service-PROJECT_NUMBER@gcp-sa-mcsd.iam.gserviceaccount.com
.Registra tus clústeres de GKE en la flota. Te recomendamos encarecidamente que registres tu clúster con Workload Identity Federation for GKE habilitado. Si no habilitas la federación de identidades de carga de trabajo para GKE, debes registrar el clúster con una Google Cloud cuenta de servicio para la autenticación y completar los pasos adicionales que se indican en Autenticar cuentas de servicio.
Para registrar tu clúster con Workload Identity Federation para GKE, ejecuta el siguiente comando:
gcloud container fleet memberships register MEMBERSHIP_NAME \ --gke-cluster CLUSTER_LOCATION/CLUSTER_NAME \ --enable-workload-identity \ --project PROJECT_ID
Haz los cambios siguientes:
MEMBERSHIP_NAME
: el nombre del grupo de miembros que elijas para representar de forma única el clúster en la flota. Por lo general, el nombre de pertenencia a la flota de un clúster es el nombre del clúster, pero es posible que tengas que especificar un nombre nuevo si ya existe otro clúster con el nombre original en la flota.CLUSTER_LOCATION
: la zona o la región en la que se encuentra el clúster.CLUSTER_NAME
: el nombre del clúster.
Concede los permisos de gestión de identidades y accesos (IAM) necesarios para MCS Importer:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "principal://iam.googleapis.com/projects/PROJECT_NUMBER/locations/global/workloadIdentityPools/PROJECT_ID.svc.id.goog/subject/ns/gke-mcs/sa/gke-mcs-importer" \ --role "roles/compute.networkViewer"
Haz los cambios siguientes:
PROJECT_ID
: el ID del proyecto del host de la flota.PROJECT_NUMBER
: el número de proyecto del proyecto host de la flota.
Asegúrate de que cada clúster de la flota tenga un espacio de nombres para compartir servicios. Si es necesario, crea un espacio de nombres con el siguiente comando:
kubectl create ns NAMESPACE
Sustituye
NAMESPACE
por el nombre del espacio de nombres.Para verificar que MCS esté habilitado, ejecuta el siguiente comando:
gcloud container fleet multi-cluster-services describe \ --project PROJECT_ID
El resultado debería ser similar al siguiente:
createTime: '2021-08-10T13:05:23.512044937Z' membershipStates: projects/PROJECT_ID/locations/global/memberships/MCS_NAME: state: code: OK description: Firewall successfully updated updateTime: '2021-08-10T13:14:45.173444870Z' name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery resourceState: state: ACTIVE spec: {}
Si el valor de
state
no esACTIVE
, consulta la sección Solución de problemas.
Autenticar cuentas de servicio
Si has registrado tus clústeres de GKE en una flota mediante una cuenta de servicio, debes seguir pasos adicionales para autenticar la cuenta de servicio.
MCS implementa un componente llamado gke-mcs-importer
. Este componente recibe actualizaciones de endpoints de Cloud Service Mesh, por lo que, para habilitar MCS, debes conceder permiso a tu cuenta de servicio para leer información de Cloud Service Mesh.
Si usas una cuenta de servicio, puedes usar la cuenta de servicio predeterminada de Compute Engine o tu propia cuenta de servicio de nodo:
Si usas una cuenta de servicio predeterminada de Compute Engine, haz lo siguiente:
Habilita los siguientes permisos:
https://www.googleapis.com/auth/compute.readonly
https://www.googleapis.com/auth/cloud-platform
Para obtener más información sobre cómo habilitar los permisos, consulta el artículo Cambiar la cuenta de servicio y los permisos de acceso de una instancia.
Asigna el rol
roles/compute.networkViewer
a la cuenta de servicio en el proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Asignar un solo rol.
Si usas tu propia cuenta de servicio de nodo, asigna el rol
roles/compute.networkViewer
a tu cuenta de servicio en el proyecto. Para obtener más información sobre cómo conceder roles, consulta el artículo Asignar un solo rol.
Usar MCS
En las siguientes secciones se explica cómo usar MCS. MCS usa la API de servicios multiclúster de Kubernetes.
Registrar un servicio para exportarlo
Para registrar un servicio para exportarlo a otros clústeres de tu flota, sigue estos pasos:
Crea un objeto
ServiceExport
llamadoexport.yaml
:# export.yaml kind: ServiceExport apiVersion: net.gke.io/v1 metadata: namespace: NAMESPACE name: SERVICE_EXPORT_NAME
Haz los cambios siguientes:
NAMESPACE
: el espacio de nombres del objetoServiceExport
. Este espacio de nombres debe coincidir con el espacio de nombres del servicio que vas a exportar.SERVICE_EXPORT_NAME
: el nombre de un servicio de tu clúster que quieras exportar a otros clústeres de tu flota.
Para crear el recurso
ServiceExport
, ejecuta el siguiente comando:kubectl apply -f export.yaml
La exportación inicial de tu servicio tarda aproximadamente cinco minutos en sincronizarse con los clústeres registrados en tu flota. Una vez que se exporta un servicio, las sincronizaciones de endpoints posteriores se producen inmediatamente.
Puedes exportar el mismo servicio desde varios clústeres para crear un único endpoint de servicio multiclúster de alta disponibilidad con distribución del tráfico entre clústeres. Antes de exportar servicios que tengan el mismo nombre y espacio de nombres, asegúrate de que quieres que se agrupen de esta forma. No recomendamos exportar servicios en los espacios de nombres default
y kube-system
debido a la alta probabilidad de que se produzcan conflictos de nombres no deseados y la agrupación no deseada resultante. Si exportas más de cinco servicios con el mismo nombre y espacio de nombres, la distribución del tráfico en los servicios importados podría limitarse a cinco servicios exportados.
Consumir servicios entre clústeres
MCS solo admite ClusterSetIP y servicios sin interfaz. Solo están disponibles los registros "A" de DNS.
Después de crear un objeto ServiceExport
, el siguiente nombre de dominio se resuelve en
el servicio exportado desde cualquier pod de cualquier clúster de flota:
SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
La salida incluye los siguientes valores:
SERVICE_EXPORT_NAME
yNAMESPACE
: los valores que definas en tu objetoServiceExport
.
En el caso de los servicios ClusterSetIP, el dominio se resuelve en ClusterSetIP
. Para encontrar este valor, busca el objeto ServiceImport
en un clúster del espacio de nombres en el que se creó el objeto ServiceExport
. El objeto ServiceImport
se crea automáticamente.
Por ejemplo:
kind: ServiceImport
apiVersion: net.gke.io/v1
metadata:
namespace: EXPORTED-SERVICE-NAMESPACE
name: SERVICE-EXPORT-TARGET
status:
ports:
- name: https
port: 443
protocol: TCP
targetPort: 443
ips: CLUSTER_SET_IP
MCS crea un objeto Endpoints
como parte de la importación de un Service
en un clúster. Al investigar este objeto, puedes monitorizar el progreso de una importación de servicios. Para encontrar el nombre del objeto Endpoints
, busca el valor de la anotación net.gke.io/derived-service
en un objeto ServiceImport
correspondiente al servicio importado. Por ejemplo:
kind: ServiceImport
apiVersion: net.gke.io/v1
annotations: net.gke.io/derived-service: DERIVED_SERVICE_NAME
metadata:
namespace: EXPORTED-SERVICE-NAMESPACE
name: SERVICE-EXPORT-TARGET
A continuación, busca el objeto Endpoints
para comprobar si MCS ya ha propagado los endpoints al clúster de importación. El objeto Endpoints
se crea en el mismo espacio de nombres que el objeto ServiceImport
, con el nombre almacenado en la anotación net.gke.io/derived-service
. Por ejemplo:
kubectl get endpoints DERIVED_SERVICE_NAME -n NAMESPACE
Haz los cambios siguientes:
DERIVED_SERVICE_NAME
: el valor de la anotaciónnet.gke.io/derived-service
en el objetoServiceImport
.NAMESPACE
: el espacio de nombres del objetoServiceExport
.
Puedes consultar el estado de los endpoints en el panel de control de Cloud Service Mesh en la Google Cloud consola.
En el caso de los servicios sin interfaz gráfica, el dominio se resuelve en la lista de direcciones IP de los endpoints de los clústeres de exportación. Cada pod de backend con un nombre de host también se puede direccionar de forma independiente con un nombre de dominio con el siguiente formato:
HOSTNAME.MEMBERSHIP_NAME.LOCATION.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
La salida incluye los siguientes valores:
SERVICE_EXPORT_NAME
yNAMESPACE
: los valores que definas en tu objetoServiceExport
.MEMBERSHIP_NAME
: el identificador único de la flota del clúster en el que se encuentra el pod.LOCATION
: la ubicación de la membresía. Las membresías son deglobal
o su ubicación es una de las regiones o zonas en las que se encuentra el pod, comous-central1
.HOSTNAME
: el nombre de host del pod.
También puedes dirigirte a un pod de backend con un nombre de host exportado desde un clúster registrado en una pertenencia global mediante un nombre de dominio con el siguiente formato:
HOSTNAME.MEMBERSHIP_NAME.SERVICE_EXPORT_NAME.NAMESPACE.svc.clusterset.local
Inhabilitar MCS
Para inhabilitar MCS, sigue estos pasos:
En cada clúster de tu flota, elimina cada objeto ServiceExport que hayas creado:
kubectl delete serviceexport SERVICE_EXPORT_NAME \ -n NAMESPACE
Haz los cambios siguientes:
SERVICE_EXPORT_NAME
: el nombre de tu objeto ServiceExport.NAMESPACE
: el espacio de nombres del objetoServiceExport
.
Comprueba que el
ServiceExport
desaparece de la lista en 30 minutos.Anula el registro de tus clústeres de la flota si no es necesario que estén registrados para otro propósito.
Para inhabilitar la función
multiclusterservicediscovery
, sigue estos pasos:gcloud container fleet multi-cluster-services disable \ --project PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que has registrado los clústeres.Inhabilita la API de MCS:
gcloud services disable multiclusterservicediscovery.googleapis.com \ --project PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que has registrado los clústeres.
Limitaciones
Número de clústeres, pods y puertos de servicio
Los siguientes límites no se aplican y, en algunos casos, puedes superarlos en función de la carga de tus clústeres o proyectos, y de la tasa de rotación de los endpoints. Es posible que tengas problemas de rendimiento cuando se superen estos límites.
En Kubernetes, un servicio se identifica de forma única por su nombre y el espacio de nombres al que pertenece. Este nombre y el par de espacios de nombres se denominan nombre con espacio de nombres.
Exportación de clústeres: un solo servicio, identificado por un nombre con espacio de nombres, se puede exportar de forma segura desde un máximo de 5 clústeres simultáneamente. Si se supera ese límite, es posible que solo se pueda importar un subconjunto de endpoints a los clústeres consumidores. Puedes exportar diferentes servicios de distintos subconjuntos de clústeres.
Número de pods detrás de un solo servicio: es seguro si no supera los 250 pods detrás de un solo servicio. Si las cargas de trabajo son relativamente estáticas y el número de servicios de varios clústeres es pequeño, es posible que se supere este número considerablemente y se alcancen miles de endpoints por servicio. Al igual que con los servicios de un solo clúster,
kube-proxy
monitoriza todos los endpoints de cada nodo. Si supera este límite, sobre todo al exportar datos de varios clústeres simultáneamente, es posible que necesite nodos más grandes.Número de servicios multiclúster exportados simultáneamente: le recomendamos que no exporte simultáneamente más de 250 puertos de servicio únicos.
Un puerto de servicio único se identifica mediante un nombre con espacio de nombres y un número de puerto, es decir, una tupla (nombre, espacio de nombres, número de puerto). Esto significa que:
Los servicios con el mismo nombre y puerto de espacio de nombres, exportados desde varios clústeres, se consideran un único puerto de servicio.
Dos servicios con el mismo nombre y puerto, pero con espacios de nombres diferentes, por ejemplo, (nombre, ns1, puerto-80) y (nombre, ns2, puerto-80), son dos puertos de servicio diferentes, por lo que se contabilizan como dos de los 250 puertos de servicio únicos.
Un servicio exportado que exponga los puertos 80 y 443 cuenta como dos de los 250 puertos de servicio únicos, independientemente del número de clústeres de la flota que exporten este servicio simultáneamente.
Cada servicio multiclúster se tiene en cuenta para la cuota de servicios de backend y cada zona de cada clúster de exportación crea un grupo de puntos finales de red (NEG). Aumentar estas cuotas no cambia el límite indicado para el recuento total de puertos de servicio únicos.
Tipos de servicio
MCS solo admite ClusterSetIP y servicios sin encabezado. No se admiten los servicios NodePort y LoadBalancer, y pueden provocar un comportamiento inesperado.
Usar el agente IPmasq con MCS
MCS funciona correctamente cuando se usa un intervalo de IPs de Pod predeterminado u otro que no esté enmascarado.
Si usas un intervalo de IPs de pods personalizado o un ConfigMap de agente IPmasq personalizado, se puede enmascarar el tráfico de MCS. Esto impide que MCS funcione porque las reglas de cortafuegos solo permiten el tráfico de IPs de pods.
Para evitar este problema, debes usar el intervalo de IPs de pods predeterminado o especificar todos los intervalos de IPs de pods en el campo nonMasqueradeCIDRs
del ConfigMap del agente IPmasq.
Si usas Autopilot o debes usar un intervalo de IPs de pods que no sea el predeterminado y no puedes especificar todos los intervalos de IPs de pods en el ConfigMap, debes usar la política de NAT de salida para configurar el enmascaramiento de IPs.
Reutilizar números de puerto en un servicio MCS
No puedes reutilizar el mismo número de puerto en un servicio MCS, aunque los protocolos sean diferentes.
Esto se aplica tanto a un servicio de Kubernetes como a todos los servicios de Kubernetes de un servicio de MCS.
MCS con clústeres en varios proyectos
No puedes exportar un servicio si ya lo están exportando otros clústeres de un proyecto diferente de la flota con el mismo nombre y espacio de nombres. Puedes acceder al servicio en otros clústeres de la flota en otros proyectos, pero esos clústeres no pueden exportar el mismo servicio en el mismo espacio de nombres.
Solución de problemas
En las siguientes secciones se ofrecen consejos para solucionar problemas con MCS.
Ver el estado de la función MCS
Ver el estado del recurso Feature puede ayudarte a confirmar si MCS se ha configurado correctamente. Puedes ver el estado con el siguiente comando:
gcloud container fleet multi-cluster-services describe
El resultado debería ser similar al siguiente:
createTime: '2021-08-10T13:05:23.512044937Z'
membershipStates:
projects/PROJECT_ID/locations/global/memberships/MCS_NAME:
state:
code: OK
description: Firewall successfully updated
updateTime: '2021-08-10T13:14:45.173444870Z'
name: projects/PROJECT_NAME/locations/global/features/multiclusterservicediscovery
resourceState:
state: ACTIVE
spec: {}
Incluye, entre otra información, el estado general de la función en resourceState
y el estado de las suscripciones individuales en membershipStates
.
Si has habilitado la función MCS siguiendo las instrucciones de Habilitar MCS en tu clúster de GKE, pero el valor de resourceState.state
no es ACTIVE
, ponte en contacto con el equipo de Asistencia.
El estado de cada suscripción consta de su ruta y del campo state
. Este último contiene code
y description
, que son útiles para solucionar problemas.
Códigos de los estados de la suscripción
Un código, representado por el campo state.code
, indica el estado general del miembro en relación con MCS. Hay cuatro valores posibles:
OK
: la membresía se ha añadido correctamente a MCS y ya se puede usar.WARNING
: MCS está conciliando la configuración de la suscripción. El campo de descripción puede proporcionar más información sobre la causa de este código.FAILED
: esta suscripción no se ha añadido a MCS. Esta suscripción aFAILED
no afecta a otras suscripciones de la flota con un códigoOK
. El campo de descripción puede proporcionar más información sobre la causa de este código.ERROR
: a esta membresía le faltan recursos. Esta suscripción aERROR
no afecta a otras suscripciones de la flota con un códigoOK
. El campo de descripción puede proporcionar más información sobre la causa de este código.
Descripciones de los estados de la suscripción
Para ver información sobre el estado de la membresía en MCS, consulta el campo state.description
. Este campo proporciona información sobre la configuración del proyecto y del centro, así como sobre el estado de la flota y de las suscripciones. Para ver información sobre los servicios individuales y su configuración, consulta el campo Status.Conditions
del objeto ServiceExport
. Para obtener más información, consulta la sección Analizar ServiceExport
.
El campo state.description
contiene la siguiente información:
Firewall successfully created
: Este mensaje indica que la regla de cortafuegos del miembro se ha creado o actualizado correctamente. El código de la suscripción esOK
.Firewall creation pending
: este mensaje indica que la regla de cortafuegos del miembro está pendiente de creación o actualización. El código de la suscripción esWARNING
. Esta pertenencia puede tener problemas para actualizarse y conectarse a los nuevos servicios y pertenencias multiclúster que se hayan añadido mientras la regla de cortafuegos esté pendiente.GKE Cluster missing
: este mensaje indica que el clúster de GKE registrado no está disponible o se ha eliminado. El código de la suscripción esERROR
. Esta pertenencia debe anularse manualmente de la flota después de eliminar un clúster de GKE.Project that member lives in is missing required permissions and/or has not enabled all required APIs - additional setup steps are required
: este mensaje indica que hay errores internos StatusForbidden (403) y que el código de la suscripción esFAILED
. Este error se produce en los siguientes casos:No has habilitado las APIs necesarias en el proyecto del miembro.
Si el clúster miembro se encuentra en un proyecto distinto al de la flota, consulta la configuración entre proyectos para asegurarte de que has completado todos los pasos necesarios. Si has completado todos los pasos, asegúrate de que las siguientes APIs estén habilitadas en el proyecto de registro con los siguientes comandos:
gcloud services enable multiclusterservicediscovery.googleapis.com --project PROJECT_ID gcloud services enable dns.googleapis.com --project PROJECT_ID gcloud services enable trafficdirector.googleapis.com --project PROJECT_ID gcloud services enable cloudresourcemanager.googleapis.com --project PROJECT_ID
Sustituye
PROJECT_ID
por el ID del proyecto en el que has registrado los clústeres.La cuenta de servicio
mcsd
ogkehub
requiere más permisos en el proyecto del miembro.Las cuentas de servicio
mcsd
ygkehub
se deberían haber creado automáticamente en el proyecto host de la flota con todos los permisos necesarios. Para verificar que las cuentas de servicio existen, ejecuta los siguientes comandos:gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-mcsd gcloud projects get-iam-policy PROJECT_ID | grep gcp-sa-gkehub
Sustituye
PROJECT_ID
por el ID del proyecto host de la flota.
Estos comandos deberían mostrar el nombre completo de las cuentas de servicio
mcsd
ygkehub
.Multiple VPCs detected in the hub - VPC must be peered with other VPCs for successful connectivity
: este mensaje se produce cuando los clústeres alojados en diferentes VPCs se registran en la misma flota. El estado de la suscripción esOK
. La red de VPC de un clúster se define mediante su red de NetworkConfig. Los servicios de varios clústeres requieren una red plana, y estas VPCs deben estar emparejadas activamente para que los servicios de varios clústeres se conecten correctamente entre sí. Para obtener más información, consulta el artículo sobre emparejar dos redes.Member does not exist in the same project as hub - additional setup steps are required, errors may occur if not completed.
: este mensaje te recuerda que los clústeres entre proyectos requieren pasos de configuración adicionales. El estado de la suscripción esOK
. Las pertenencias entre proyectos se definen como un clúster miembro que no está en el mismo proyecto que la flota. Para obtener más información, consulta la configuración entre proyectos.Non-GKE clusters are currently not supported
: Este mensaje te recuerda que MCS solo admite clústeres de GKE. Los clústeres que no sean de GKE no se pueden añadir a MCS. El estado de la suscripción esFAILED
.
Examinando ServiceExport
Para ver el estado de un servicio concreto y los posibles errores, consulta el campo Status.Conditions
del recurso ServiceExport
de ese servicio:
kubectl describe serviceexports PROJECT_ID -n NAMESPACE
El resultado debería ser similar al siguiente:
Name: SERVICE_NAME
Namespace: NAMESPACE
Labels: <none>
Annotations: <none>
API Version: net.gke.io/v1
Kind: ServiceExport
Metadata:
Creation Timestamp: 2024-09-06T15:57:40Z
Finalizers:
serviceexport.net.gke.io
Generation: 2
Resource Version: 856599
UID: 8ac44d88-4c08-4b3d-8524-976efc455e4e
Status:
Conditions:
Last Transition Time: 2024-09-06T16:01:53Z
Status: True
Type: Initialized
Last Transition Time: 2024-09-06T16:02:48Z
Status: True
Type: Exported
Events: <none>
Cuando el controlador de MCS detecta un recurso ServiceExport
, añade las siguientes condiciones al campo Status.Conditions
:
Initialized
: true si el controlador de MCS ha recogido e intentado reconciliar el servicio representado porServiceExport
.Exported
: true si el servicio representado porServiceExport
se ha validado correctamente.
Cada condición contiene los campos obligatorios Type
, Status
y LastTransitionTime
. A medida que el controlador de MCS reconcilia y valida el servicio, el campo Status
de la condición correspondiente cambia de False
a True
.
Errores
Si se produce un error en la validación, el controlador asigna el valor False
al campo Status
de la condición Exported
y añade los campos Reason
y Message
con más información sobre el error. El campo Reason
puede tener uno de los siguientes valores:
NoMatchingService
: no se ha encontrado ningún servicio que coincida con el nombre y el espacio de nombres deServiceExport
en el clúster indicado.
Comprueba si el servicio de Kubernetes que quieres exportar está en el mismo clúster. Comprueba si el nombre y el espacio de nombres de ambos recursos (Service
yServiceExport
) coinciden exactamente.Conflict
: Ya existe un servicio exportado con el mismo nombre y espacio de nombres que no coincide con el que exporta esteServiceExport
o se ha exportado desde otra red u otro proyecto, lo que no está permitido. Consulta las limitaciones.
Consulta los detalles en el campoMessage
y, si es necesario, consulta la sección Limitaciones. Asegúrate de que el nombre y el espacio de nombres deService
yServiceExport
coincidan y de que todos los recursos se creen en la misma red o proyecto.ReadinessProbeError
: Hay unreadinessProbe
configurado en un contenedor de un pod que respalda el servicio.Kubernetes ReadinessProbes
se traducen aGoogle cloud HealthChecks
y deben cumplir las mismas restricciones.A continuación, se explica cómo se alinean los campos de comprobación de la disponibilidad con los parámetros de comprobación del estado:
PeriodSeconds
corresponde aCheckInterval
TimeoutSeconds
corresponde aTimeout
SuccessThreshold
corresponde aHealthyThreshold
FailureThreshold
corresponde aUnhealthyThreshold
Para alinear
ReadinessProbes
con las restricciones deHealthCheck
, MCS implementa lo siguiente:PeriodSeconds
yTimeoutSeconds
tienen un límite de 300 segundos. Si se supera este límite, se produce un error.SuccessThreshold
yFailureThreshold
tienen un límite de 10 segundos. Si se supera este límite, se produce un error.- Se informa de un error y se produce un fallo en la creación de recursos (posiblemente de todos los recursos) si
TimeoutSeconds
es mayor quePeriodSeconds
.
El motivo de estas restricciones es evitar problemas de escalabilidad, superposición de sondeos posteriores, lentitud de las comprobaciones de estado o de disponibilidad, etc. Ajusta los parámetros de
readinessProbe
según las validaciones anteriores. Es importante corregir estos errores en todos los servicios de la flota. Consulta la sección Problemas conocidos para obtener más información.ServiceError
: se ha producido un error al obtener el servicio correspondiente.
Este error suele estar relacionado con un problema de la infraestructura de Google Cloud. Si el problema persiste, ponte en contacto con el equipo de Asistencia de Google Cloud.PodsError
: se ha producido un error al obtener el pod o los pods de backend
Este error suele estar relacionado con un problema de la infraestructura de Google Cloud. Si el problema persiste, ponte en contacto con el equipo de Asistencia de Google Cloud.EndpointsError
: se ha producido un error al agregar Endpoints para un servicio sin encabezado
Este error suele estar relacionado con un problema de la infraestructura de Google Cloud. Si el problema persiste, ponte en contacto con el equipo de Asistencia de Google Cloud.
El campo Message
proporciona contexto adicional sobre el error.
Problemas habituales con los permisos
Las APIs necesarias no están habilitadas en el proyecto.
Asegúrate de haber habilitado las APIs necesarias tal como se indica en la sección Antes de empezar.
Para una flota entre proyectos, sigue la sección Habilitar las APIs necesarias correspondiente en Configurar servicios de varios clústeres con VPC compartida.
La cuenta de servicio
mcsd
ogkehub
no tiene permisos suficientesEn una configuración de un solo proyecto, todos los permisos necesarios se conceden automáticamente a las cuentas de servicio que crean automáticamente GKE Hub y MCS.
En el caso de una flota entre proyectos, debes crear enlaces de gestión de identidades y accesos adicionales. Sigue la sección Crear enlaces de gestión de identidades y accesos que corresponda en el artículo Configurar servicios de varios clústeres con VPC compartida.
Problemas conocidos
Servicios MCS con varios puertos
Hay un problema conocido con los servicios de varios clústeres con varios puertos (TCP/UDP) en GKE Dataplane V2, en el que algunos endpoints no se programan en el plano de datos. Este problema afecta a las versiones de GKE anteriores a la 1.26.3-gke.400.
Como solución alternativa, cuando uses GKE Dataplane V2, utiliza varios MCS con un solo puerto en lugar de un MCS con varios puertos.
Número de puerto reutilizado en un servicio MCS
No puedes reutilizar el mismo número de puerto en un MCS Service aunque los protocolos sean diferentes.
Esto se aplica tanto a un servicio de Kubernetes como a todos los servicios de Kubernetes de un servicio de MCS.
MCS con VPC compartida
Con la implementación actual de MCS, si despliega más de una flota en la misma VPC compartida, los metadatos se comparten entre las flotas. Cuando se crea un servicio en una flota, los metadatos del servicio se exportan o importan en todas las demás flotas que forman parte de la misma VPC compartida y que son visibles para el usuario.
La comprobación del estado usa el puerto predeterminado en lugar de containerPort
Cuando despliegas un servicio con un campo targetPort
que hace referencia a un puerto con nombre en un despliegue, MCS configura el puerto predeterminado para la comprobación del estado en lugar del containerPort
especificado.
Para evitar este problema, usa valores numéricos en los campos Servicio
ports.targetPort
y Despliegue
readinessProbe.httpGet.port
en lugar de valores con nombre.
Una sonda de preparación no válida para un solo servicio interrumpe otros servicios
Hay un posible readinessProbe
error de configuración conocido que se describe en el artículo Examinar ServiceExports
. Con la implementación actual de MCS, si se produce este error en un solo servicio exportado, puede impedir que se sincronicen algunos o todos los demás servicios de la flota.
Es importante que las configuraciones de todos los servicios estén en buen estado. Si un servicio de MCS no se actualiza, asegúrate de que ninguno de los ServiceExports de ninguno de los clústeres de ninguno de los espacios de nombres indique ReadinessProbeError como motivo de que la condición de estado Exported
sea False. Consulta Analizar ServiceExports
para saber cómo comprobar las condiciones.
Siguientes pasos
- Consulta más información sobre los servicios.
- Consulta cómo exponer aplicaciones con Servicios.
- Implementa un ejemplo básico de servicios de varios clústeres.