Aviso de actualización para balanceador de cargas de 1.7.0 a 1.7.2

A partir de la versión 1.7.0 de Kubernetes, cada servicio nuevo que crees con type LoadBalancer contará con verificaciones de estado para los nodos habilitados de forma predeterminada (siempre que todos los nodos del clúster ejecuten la versión v1.7.0 o una posterior).

Sin embargo, hay un problema conocido en las versiones 1.7.0 y 1.7.1 de Kubernetes que hace que los nodos respondan de manera incorrecta a las verificaciones de estado del balanceador de cargas de red de GCP. Cuando esto ocurre, el balanceador de cargas de red configurado por Kubernetes muestra fallas consistentes en las verificaciones de estado en todos los nodos del clúster, pero el tráfico aún se reenvía a los backends.

Aunque este problema se solucionó en la versión 1.7.2, es posible que debas tomar medidas cuando actualices un clúster existente de la versión 1.7.0 o 1.7.1 a 1.7.2. La actualización puede causar un potencial desbalance de cargas. Cuando las verificaciones de estado funcionan correctamente para los nodos que ejecutan la versión 1.7.2, el balanceador de cargas GCP reenvía todo el tráfico a esos nodos y se aleja de los nodos de la versión 1.7.0 o 1.7.1 con verificaciones de estado que fallan. Este desbalance puede causar interrupciones en el servicio si no hay suficientes nodos "en buen estado" (como en los nodos que ejecutan la versión 1.7.2) para manejar la carga de tráfico de tu clúster.

Puedes mitigar este problema quitando manualmente las verificaciones de estado de los balanceadores de cargas afectados antes de actualizar los nodos a la versión 1.7.2.

Determina si tu clúster está afectado

Si los nodos de tu clúster ejecutan Kubernetes versión 1.7.0 o 1.7.1, tu clúster podría verse afectado si realizaste alguna de las siguientes acciones:

  • Creaste un servicio nuevo con --type LoadBalancer.
  • Actualizaste un servicio existente con --type LoadBalancer y lo convertiste en otro tipo (ClusterIP, ExternalName, etc.). Luego, lo revertiste con LoadBalancer.
  • Actualizaste el campo sessionAffinity en un servicio LoadBalancer existente.
  • Configuraste el campo externalTrafficPolicy como Cluster en un servicio LoadBalancer existente.

Para confirmar si tu clúster está afectado, sigue estas instrucciones:

  1. En Google Cloud Console, navega hacia GKE y selecciona tu clúster.
  2. Haz clic en la pestaña Descubrimiento y balanceo de cargas.
  3. Busca un servicio en el que el campo Tipo sea LoadBalancer y haz clic en el nombre del servicio.
  4. En el panel Detalles del servicio, busca el campo LoadBalancer. Este es el recurso GCP LoadBalancer adjunto a tu clúster.
  5. Haz clic en nombre del Balanceador de cargas.
  6. Deberías ver el panel Balanceo de cargas; allí, busca las verificaciones de estado adjuntas. Si hay una verificación de estado adjunta con el nombre k8s-XXX-node, tu clúster se ve afectado.

Repite los pasos anteriores para todos los servicios de balanceador de cargas en tu clúster.

Puedes determinar el servicio Kubernetes correspondiente con el Menú avanzado de la siguiente manera:

  1. Haz clic en la pestaña Reglas de reenvío.
  2. Selecciona tu entrada de balanceador de cargas.
  3. Deberías ver el nombre del servicio en el campo Descripción con el siguiente formato: {"kubernetes.io/service-name":"$NAMESPACE/$SERVICE_NAME"}.

Actualiza la mitigación de riesgos

Para mitigar el riesgo de un posible desbalance de carga y garantizar una actualización segura a la versión 1.7.2, haz lo siguiente:

  1. Antes de la actualización, quita manualmente las verificaciones de estado de todos los balanceadores de cargas afectados en tu clúster.
  2. Actualiza tus nodos a la versión 1.7.2.
  3. Después de la actualización, reemplaza las verificaciones de estado en cada balanceador de cargas en tu clúster.

Antes de actualizar

Para quitar la verificación de estado del nodo de un balanceador de cargas:

  1. En Google Cloud Console, navega hacia GKE y selecciona tu clúster.
  2. Haz clic en la pestaña Descubrimiento y balanceo de cargas.
  3. Localiza tu servicio LoadBalancer afectado y haz clic en el nombre del servicio.
  4. En el panel Detalles del servicio, busca el campo LoadBalancer. Este es el recurso GCP LoadBalancer adjunto a tu clúster.
  5. Haz clic en nombre del Balanceador de cargas.
  6. En el panel Balanceo de cargas, haz clic en el vínculo Menú avanzado.
  7. En el Menú avanzado, haz clic en Grupos de destino.
  8. 1. Ten en cuenta el nombre de la verificación de estado, k8s-XXX-node, en el que XXX es el ID de hash de tu clúster. Necesitarás esto más adelante para restablecer la verificación de estado, si así lo deseas.
  9. Edita la agrupación de destino correspondiente para el balanceador de cargas en "sin verificación de estado". Esta es una actualización in situ que no debería causar tiempo de inactividad en tu servicio.

Repite los pasos anteriores para cada balanceador de cargas afectado de tu clúster.

Una vez que hayas quitado las verificaciones de estado, puedes actualizar de forma segura tus nodos a la versión 1.7.2 sin el riesgo de un desbalance de tráfico en tus nodos. El balanceador de cargas GCP continuará reenviando el tráfico a los nodos sin verificaciones de estado independientemente del estado, este comportamiento es idéntico al de los clústeres que ejecutan Kubernetes versión 1.6.x y anteriores.

Después de actualizar

Una vez que hayas actualizado, puedes reemplazar las verificaciones de estado del nodo en los balanceadores de cargas de tu clúster de la siguiente manera:

  1. En Google Cloud Console, navega hasta tu clúster.
  2. Haz clic en la pestaña Descubrimiento y balanceo de cargas.
  3. Localiza tu servicio LoadBalancer afectado y haz clic en el nombre del servicio.
  4. En el panel Detalles del servicio, busca el campo LoadBalancer. Este es el recurso GCP LoadBalancer adjunto a tu clúster.
  5. Haz clic en nombre del balanceador de cargas.
  6. En el panel Balanceo de cargas, haz clic en el vínculo Menú avanzado.
  7. En el Menú avanzado, haz clic en Grupos de destino.
  8. Edita el grupo de destino que le corresponde al balanceador de cargas y establece el mismo valor de formato k8s-XXX-node que anotaste durante la eliminación de las verificaciones de estado antes de la actualización. Esta es una actualización local que no debería causar tiempo de inactividad en tu servicio.

Repite los pasos anteriores para cada balanceador de cargas afectado de tu clúster.