Resuelva problemas de configuración de CLB, reutilización de instancias, acceso a NodePort y actualización de CCM en clústeres de ACK.
Índice
Configuración de CLB
|
Pregunta |
Resumen |
|
Dos instancias de CLB: servidor de API y Nginx Ingress Controller |
|
|
How do I choose between the Local and Cluster external traffic policies? |
Comparación de comportamientos de directivas de tráfico |
|
CCM sobrescribe cambios manuales en la consola de CLB |
|
|
Fórmulas de ponderación según la versión de CCM |
|
|
How do I enable connection draining for a LoadBalancer Service? |
Anotaciones para el drenado de conexiones |
|
Comando kubectl + jq para listar todos los Services de tipo LoadBalancer |
|
|
Etiquetado manual de instancias de CLB creadas por CCM v1.9.3.10 o anterior |
Acceso y ciclo de vida de CLB
|
Pregunta |
Resumen |
|
Why is a CLB IP address inaccessible from within the cluster? |
Limitaciones de capa 4 y comportamiento del modo Local |
|
Directivas de eliminación para instancias de CLB creadas por CCM frente a reutilizadas |
|
|
Pasos de recuperación para instancias de CLB del servidor de API, Ingress y aplicaciones |
Reutilización de una instancia de CLB existente
|
Pregunta |
Resumen |
|
Requisitos de versión de CCM, origen de la instancia y VPC |
|
|
Why are listeners not created when I reuse an existing CLB instance? |
Anotación de sobrescritura forzada obligatoria |
Solución de problemas de CLB
|
Pregunta |
Resumen |
|
Revisión de eventos y resolución de errores |
|
|
Revisión de eventos y resolución de errores |
|
|
Versión de CCM, presencia de anotaciones y sintaxis |
|
|
Why are no events displayed for Service and LoadBalancer synchronization? |
Versión de CCM anterior a v1.9.3.276-g372aa98-aliyun |
Mensajes de error de Service
|
Pregunta |
Resumen |
|
Cuota de servidores backend, agotamiento de IP de vSwitch, disponibilidad de nodos |
|
|
Modo ENI, puerto destino, resource group, tipo de dirección, método de facturación |
|
|
Desajuste de VPC, limitación de API, conflictos de grupos vServer |
|
|
Reutilización de CLB creado por CCM, CLB no encontrado, revinculación de CLB |
|
|
Pago vencido, saldo insuficiente, instancia compartida descontinuada |
NodePort y CCM
|
Pregunta |
Resumen |
|
Métodos de acceso según el alcance de red |
|
|
Cambio al tipo LoadBalancer |
|
|
ServiceNodePortRange y prevención de conflictos de puertos |
|
|
Enlace de solución de problemas |
|
|
How do I add permissions required for a CCM upgrade in an ACK dedicated cluster? |
Permisos de RAM para v2.11.2 y posteriores |
|
¿Cómo habilito la persistencia de sesión para un Service de Kubernetes? |
Enlace externo |
Configuración de CLB
¿Qué instancias de CLB crea un clúster de ACK de forma predeterminada?
Si se instala el complemento Nginx Ingress Controller durante la creación del clúster, este genera dos instancias de CLB:
CLB del servidor de API: Es el endpoint del servidor de API. Todas las solicitudes del clúster pasan por esta instancia a través del puerto TCP 6443. Los backends son pods del servidor de API o instancias ECS maestras.
CLB de Nginx Ingress Controller: Está asociado al Service
nginx-ingress-controlleren kube-system. Se vincula dinámicamente a los pods del Ingress Controller para balancear las solicitudes externas. Escucha en los puertos TCP 80 y 443.
¿Cómo elijo entre las directivas de tráfico externo Local y Cluster?
Las directivas de tráfico externo Local y Cluster varían según el plugin de red. Consulte External traffic policies: Local and Cluster.
¿Por qué se modificó mi configuración de CLB?
CCM utiliza una API declarativa y actualiza automáticamente la configuración de CLB basándose en la definición del Service. Los cambios realizados directamente en la consola de CLB pueden sobrescribirse.
No modifique las instancias de CLB gestionadas por Kubernetes desde la consola de CLB. Los cambios podrían perderse y dejar el Service inaccesible. Utilice anotaciones de Service en su lugar. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
¿Cómo se calculan las ponderaciones de los nodos en modo Local?
El siguiente ejemplo utiliza un pod de aplicación (app=nginx) desplegado en tres instancias ECS y expuesto mediante un Service.

v1.9.3.276-g372aa98-aliyun y posteriores
CCM establece la ponderación del nodo igual al número de pods en dicho nodo. Por ejemplo, si tres instancias ECS alojan 1, 2 y 3 pods respectivamente, sus ponderaciones serán 1, 2 y 3. El tráfico se distribuye en una proporción de 1:2:3, lo que resulta en una carga equilibrada entre los pods.
Fórmula:


Entre v1.9.3.164-g2105d2e-aliyun y v1.9.3.276-g372aa98-aliyun
Anterior a v1.9.3.164-g2105d2e-aliyun
¿Cómo habilito el drenado de conexiones para un Service de tipo LoadBalancer?
Agregue las siguientes anotaciones al Service. Cuando se elimina un servidor backend, la instancia de CLB continúa procesando las conexiones existentes durante la duración del tiempo de espera de drenado.
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drain-timeout
¿Cómo listo todas las instancias de CLB en un clúster?
-
Obtenga el nombre, namespace, dirección IP y tipo de dirección de cada Service de tipo LoadBalancer. Ejemplo de salida:
kubectl get services -A -ojson | jq '.items[] | select(.spec.type == "LoadBalancer") | {name: .metadata.name, namespace: .metadata.namespace, ip: .status.loadBalancer.ingress[0].ip, lb_type: .metadata.annotations."service.beta.kubernetes.io/alibaba-cloud-loadbalancer-address-type"}'{ "name": "test", "namespace": "default", "ip": "192.168.*.*", "lb_type": "intranet" } { "name": "nginx-ingress-lb", "namespace": "kube-system", "ip": "47.97.*.*", "lb_type": "null" }
¿Cómo habilito el renombrado de CLB para versiones anteriores de CCM?
CCM v1.9.3.10 y posteriores etiquetan automáticamente las instancias de CLB para permitir el renombrado. Para las instancias de CLB creadas por versiones anteriores de CCM, agregue la etiqueta manualmente.
Este procedimiento aplica únicamente a instancias de CLB creadas por CCM v1.9.3.10 o anterior. El tipo de Service debe ser LoadBalancer.
Conéctese al nodo maestro del clúster. Consulte Connect to an ACK cluster using kubectl.
-
Consulte el tipo de Service y la dirección IP. Reemplace
${namespace}y${service}con el namespace y el nombre del Service correspondientes.kubectl get svc -n ${namespace} ${service}# kubectl get svc -n ${namespace} ${service} nginx-local LoadBalancer 172.19.xxx.xxx 47.111.xxx.xxx 8900:31598/TCP 33d -
Genere la etiqueta para la instancia de CLB:
kubectl get svc -n ${namespace} ${service} -o jsonpath="{.metadata.uid}"|awk -F "-" '{print "kubernetes.do.not.delete: "substr("a"$1$2$3$4$5,1,32)}'# kubectl get svc -n ${namespace} ${service} -o jsonpath="{.metadata.uid}"|awk -F "-" '{print "ku kubernetes.do.not.delete: xxx Inicie sesión en la consola de CLB. Con la dirección IP obtenida en el paso 2, busque la instancia de CLB en la región correspondiente.
Agregue una etiqueta a la instancia de CLB utilizando la clave y el valor del paso 3 (elementos 1 y 2 en la figura anterior). Consulte Create and manage a CLB instance.
Acceso y ciclo de vida de CLB
¿Por qué no se puede acceder a una dirección IP de CLB desde dentro del clúster?
Dos escenarios pueden causar esto.
Escenario 1: CLB privado no creado por un Service
Cuando un pod accede a una instancia de CLB privada que no fue creada por un Service, el acceso falla si el pod y un servidor backend están en el mismo nodo. Esta es una limitación de capa 4: una instancia ECS no puede ser simultáneamente servidor backend y cliente para la misma instancia de CLB.
Para resolverlo:
Cambie la dirección IP del CLB a una dirección IP pública.
Cree la instancia de CLB a través de un Service y establezca la directiva de tráfico externo en Cluster. Kube-proxy interceptará entonces el tráfico dirigido al CLB desde dentro del clúster, evitando la limitación.
**Escenario 2: externalTrafficPolicy: Local bloquea el acceso interno**
Cuando un Service usa externalTrafficPolicy: Local, el acceso interno a la IP del CLB falla desde los nodos que no tienen un pod backend. La dirección del CLB está destinada al uso externo. El tráfico interno es interceptado por kube-proxy y enrutado localmente (iptables o IPVS). Si el nodo no tiene un pod backend local, la conexión falla.
Consulte kube-proxy adds external-lb address to local node iptables rules.
Soluciones (listadas por recomendación):
Acceda internamente a los Services mediante ClusterIP o nombre del Service. Por ejemplo, el nombre del Service de Ingress es
nginx-ingress-lb.kube-system. Este es el enfoque recomendado.-
**Cambie
externalTrafficPolicya Cluster.** Esto reenvía el tráfico a todos los nodos pero habilita SNAT, por lo que el backend no puede obtener la IP real del cliente.kubectl edit svc nginx-ingress-lb -n kube-system -
Utilice passthrough de interfaz de red elástica (ENI) en clústeres Terway. Establezca
externalTrafficPolicyen Cluster y agregue la anotaciónservice.beta.kubernetes.io/backend-type: "eni". Esto conserva la IP de origen mientras permite el acceso interno. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.apiVersion: v1 kind: Service metadata: annotations: service.beta.kubernetes.io/backend-type: eni labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Cluster
¿Cuándo se eliminan las instancias de CLB?
El comportamiento de eliminación depende de si CCM creó la instancia de CLB y de cómo se asoció con el Service.
|
Operación de Service |
CLB creado por CCM |
CLB reutilizado |
|
Eliminar el Service |
Se elimina el CLB |
Se conserva el CLB |
|
Cambiar el tipo de Service de LoadBalancer a otro tipo |
Se elimina el CLB |
Se conserva el CLB |
Si el Service reutiliza una instancia de CLB existente (anotada con service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id}), eliminar el Service no elimina la instancia de CLB. De lo contrario, eliminar el Service también elimina la instancia de CLB.
No edite un Service para cambiar una instancia de CLB creada por CCM a una reutilizada. Esto desvincula el Service del CLB creado automáticamente e impide su eliminación automática cuando se quita el Service.
¿Qué hago si elimino accidentalmente una instancia de CLB?
Si se elimina la instancia de CLB del servidor de API, no se puede recuperar. Debe recrear el clúster. Para obtener instrucciones, consulte Create an ACK Pro cluster.
Escenario 1: CLB de Ingress eliminado
Los siguientes pasos utilizan Nginx Ingress como ejemplo.
Inicie sesión en ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, busque el clúster objetivo y haga clic en su nombre. En el panel de navegación izquierdo, seleccione Network > Services.
-
Seleccione kube-system en la lista desplegable Namespace.
Si nginx-ingress-lb aparece en la lista, haga clic en Edit YAML en la columna Actions. Elimine el campo
status.loadBalancery su contenido, luego haga clic en OK. CCM reconstruirá la instancia de CLB.-
Si nginx-ingress-lb no aparece, haga clic en Create from YAML y utilice la siguiente plantilla: ``
yaml apiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Local ports: selector: app: ingress-nginx type: LoadBalancer``name: http port: 80 protocol: TCP targetPort: 80
name: https port: 443 protocol: TCP targetPort: 443
Escenario 2: CLB específico de aplicación eliminado
Si ya no necesita el Service, elimínelo.
-
Si el Service aún está en uso:
Inicie sesión en ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, busque el clúster objetivo y haga clic en su nombre. En el panel de navegación izquierdo, seleccione Network > Services.
En la lista desplegable Namespace, haga clic en All Namespaces y luego busque el Service objetivo.
En la columna Actions, haga clic en Edit YAML. Elimine el contenido de
status.loadBalancery haga clic en OK. CCM reconstruirá la instancia de CLB.
Reutilización de una instancia de CLB existente
¿Por qué falla la reutilización de una instancia de CLB existente?
Compruebe lo siguiente en orden:
Versión de CCM: Las versiones anteriores a v1.9.3.105-gfd4e547-aliyun no admiten la reutilización de instancias de CLB. Para obtener instrucciones de actualización, consulte Upgrade the CCM component.
Origen de la instancia: No se pueden reutilizar las instancias de CLB creadas por el clúster.
CLB del servidor de API: La instancia de CLB del servidor de API no se puede reutilizar.
Desajuste de VPC: Una instancia de CLB privada debe estar en la misma virtual private cloud (VPC) que el clúster. No se admite la reutilización entre distintas VPC.
¿Por qué no se crean listeners al reutilizar una instancia de CLB existente?
Verifique que la anotación service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners sea "true". Sin ella, no se crean los listeners.
CCM no sobrescribe los listeners en instancias de CLB existentes de forma predeterminada:
Sobrescribir listeners activos puede causar interrupciones del servicio.
CCM admite configuraciones de backend limitadas. Para configuraciones complejas, cree los listeners en la consola de CLB. Fuerce la sobrescritura de listeners únicamente cuando sus puertos ya no estén en uso.
Solución de problemas de CLB
¿Qué hago si una instancia de CLB permanece en estado Pending?
Ejecute
kubectl -n {your-namespace} describe svc {your-svc-name}para revisar los mensajes de eventos.Resuelva los errores reportados en los eventos. Consulte Service error messages and solutions para obtener orientación.
Si no aparecen eventos, consulte Why are no events displayed for Service and LoadBalancer synchronization?
¿Qué hago si no se actualiza un grupo vServer?
Ejecute
kubectl -n {your-namespace} describe svc {your-svc-name}para revisar los mensajes de eventos.Resuelva los errores reportados en los eventos. Consulte Service error messages and solutions para obtener orientación.
Si no aparecen eventos, consulte Why are no events displayed for Service and LoadBalancer synchronization?
¿Qué hago si una anotación de Service no surte efecto?
Ejecute
kubectl -n {your-namespace} describe svc {your-svc-name}para buscar eventos de error. Si existen errores, consulte Service error messages and solutions.-
Si no aparecen errores, compruebe lo siguiente:
Versión de CCM: Verifique que la versión de CCM admita la anotación. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
Presencia de la anotación: Inicie sesión en la consola de ACK. En la página Services, haga clic en el nombre del Service y confirme que la anotación existe. Si falta, agréguela. Consulte Use annotations to configure a Classic Load Balancer (CLB) instance.
Sintaxis de la anotación: Verifique que la clave y el valor de la anotación sean correctos.
Para ver la lista de Services, consulte Manage services.
¿Por qué no se muestran eventos de sincronización de Service y LoadBalancer?
Si kubectl -n {your-namespace} describe svc {your-svc-name} no muestra eventos, revise la versión de CCM:
Anterior a v1.9.3.276-g372aa98-aliyun: No se admiten eventos. Actualice CCM. Para obtener instrucciones de actualización, consulte Upgrade the CCM component.
v1.9.3.276-g372aa98-aliyun y posteriores: Envíe un ticket para una investigación más detallada.
Mensajes de error de Service y soluciones
Mensajes de error comunes de Service organizados por categoría.
Errores de cuota y recursos
|
Mensaje de error |
Descripción y solución |
|
|
La instancia de CLB alcanzó su cuota de servidores backend. De forma predeterminada, una instancia de CLB admite hasta 200 servidores backend. Para resolverlo: - Solicite un aumento de cuota en la página de gestión de cuotas de SLB. - Establezca |
|
|
La instancia de CLB no tiene servidores backend. Compruebe si el Service está asociado con un pod en ejecución. - Si no hay ningún pod asociado, asocie el Service con un pod de aplicación. - Si el pod no está sano, resuelva el problema. - Si el pod se ejecuta en un nodo maestro, evíctelo a un nodo trabajador. |
|
|
El vSwitch no tiene direcciones IP disponibles. Use |
Errores de configuración
|
Mensaje de error |
Descripción y solución |
|
|
Las instancias de CLB compartidas no admiten backends ENI. Agregue la anotación |
|
|
El modo ENI no admite un valor de cadena para |
|
|
El resource group de una instancia de CLB no se puede cambiar después de su creación. Elimine la anotación |
|
|
No se encuentra la dirección IP de la ENI en la VPC. Compruebe si el Service tiene la anotación |
|
|
El método de facturación de la instancia de CLB no se puede cambiar de pay-as-you-go a pago por especificación. - Elimine la anotación |
|
|
El tipo de dirección del CLB no se puede cambiar después de su creación. Elimine y vuelva a crear el Service. |
Errores de red
|
Mensaje de error |
Descripción y solución |
|
|
La instancia de CLB interna reutilizada no está en la misma VPC que el clúster. Asegúrese de que la instancia de CLB y el clúster estén en la misma VPC. |
|
|
La API de CLB está siendo limitada. 1. Inicie sesión en la página de gestión de cuotas de SLB y verifique que su cuota de CLB sea suficiente. 2. Ejecute |
|
|
No se puede eliminar un listener asociado al grupo vServer. 1. Compruebe si la anotación del Service contiene |
Errores de reutilización de CLB
|
Mensaje de error |
Descripción y solución |
|
|
No se puede localizar la instancia de CLB basándose en el Service. Inicie sesión en la consola de CLB y busque la instancia de CLB mediante la |
|
|
No se puede reutilizar una instancia de CLB creada por CCM. Revise el ID de CLB en la anotación |
|
|
El Service ya está vinculado a una instancia de CLB y no se puede vincular a otra. Para cambiar la instancia de CLB, elimine y vuelva a crear el Service. Cambiar solo el ID de CLB en la anotación |
Errores de facturación
|
Mensaje de error |
Descripción y solución |
|
|
Su cuenta tiene un pago vencido. |
|
|
El saldo de su cuenta es insuficiente. |
|
|
Las versiones anteriores de CCM crean instancias de CLB compartidas de forma predeterminada, pero las instancias compartidas están descontinuadas. Upgrade the CCM component. |
NodePort y CCM
¿Cómo accedo a un Service de tipo NodePort?
Desde dentro del clúster (en un nodo del clúster): Utilice la ClusterIP y el puerto, o bien la IP del nodo y el NodePort del Service. El valor predeterminado de NodePort es mayor que 30000.
Desde fuera del clúster (dentro de la misma VPC): Utilice la dirección IP del nodo y el NodePort del Service.
Desde fuera de la VPC (desde otra VPC o desde Internet): Exponga el Service como tipo LoadBalancer y acceda a él mediante su endpoint externo.
Si la directiva de tráfico externo es Local, compruebe que el nodo al que accede aloja un pod backend del Service. Consulte External traffic policies: Local and Cluster .
¿Cómo configuro un listener para un Service de tipo NodePort?
CCM solo admite la configuración de listeners para Services de tipo LoadBalancer. Cambie el tipo de Service de NodePort a LoadBalancer.
¿Cómo configuro el rango de NodePort?
El parámetro --service-node-port-range del servidor de API (ServiceNodePortRange) controla el rango de puertos para los Services de tipo NodePort y LoadBalancer. El rango predeterminado abarca del 30000 al 32767. En los clústeres ACK Pro, personalice los parámetros del plano de control para ajustar este rango. Consulte Customize the parameters of the control plane for an ACK Pro cluster.
Tenga en cuenta lo siguiente:
Evite conflictos de rangos de puertos. El rango de NodePort no debe superponerse con el parámetro del kernel
net.ipv4.ip_local_port_range, que controla los números de puerto locales disponibles para las aplicaciones en el nodo. El valor predeterminado deip_local_port_rangeva del 32768 al 60999.Los rangos predeterminados son seguros. Con la configuración predeterminada de ACK, ServiceNodePortRange (30000-32767) y
ip_local_port_range(32768-60999) no se superponen. Si alguno de los rangos se ha ampliado y ahora se superponen, pueden producirse excepciones de red esporádicas. En casos graves, las comprobaciones de estado fallan y los nodos quedan fuera de línea. Restaure los valores predeterminados o ajuste ambos rangos para eliminar la superposición.Reconfigure los Services existentes después de realizar cambios. Tras ajustar el rango de puertos, algunos Services de tipo NodePort o LoadBalancer podrían seguir utilizando puertos dentro del rango
ip_local_port_range. Ejecutekubectl edit <service-name>y modifique el campospec.ports.nodePortpor un NodePort que no esté en uso.
¿Qué hago si falla una actualización de CCM?
Consulte Cloud Controller Manager (CCM) upgrade check fails.
¿Cómo agrego los permisos necesarios para una actualización de CCM en un clúster dedicado de ACK?
Las versiones más recientes de CCM introducen API de Alibaba Cloud que requieren permisos adicionales de Resource Access Management (RAM). Por ejemplo, la versión v2.11.2 agrega la gestión de rutas para redes Flannel, y la v2.12.1 incorpora la gestión por lotes para Network Load Balancer (NLB).
Antes de actualizar a la versión v2.11.2 o posterior en un clúster dedicado de ACK, otorgue los permisos necesarios al rol RAM del clúster:
Inicie sesión en la ACK console. En el panel de navegación izquierdo, haga clic en Clusters.
En la página Clusters, localice el clúster objetivo y haga clic en su nombre. En el panel de navegación izquierdo, haga clic en Cluster Information.
Haga clic en la pestaña Basic Information y luego haga clic en el nombre del rol correspondiente a Master RAM Role.
-
En la consola de RAM, haga clic en Permissions > Policies en el panel de navegación izquierdo. Localice la directiva personalizada que comienza con
k8sMasterRolePolicy-Ccm-y haga clic en su nombre.En clústeres más antiguos, es posible que esta directiva no exista. Seleccione en su lugar una directiva personalizada cuyo nombre comience con
k8sMasterRolePolicy-. -
Haga clic en Edit Policy Document y agregue el permiso
nlb:ListAsynJobsa los permisos de NLB. Para clústeres Flannel, agregue también los permisosvpc:CreateRouteEntriesyvpc:DeleteRouteEntriesa los permisos de VPC."nlb:ListServerGroupServers", "nlb:GetJobStatus", "nlb:LoadBalancerLeaveSecurityGroup", "nlb:LoadBalancerJoinSecurityGroup", "nlb:ListAsynJobs" ], "Resource": "*", "Effect": "Allow" },}, { "Action": [ "vpc:Describe*", "vpc:DeleteRouteEntry", "vpc:CreateRouteEntry", "vpc:CreateRouteEntries", "vpc:DeleteRouteEntries" ], "Resource": "*", "Effect": "Allow" } ] } Envíe los cambios y continúe con la actualización de CCM.


