Diagnostiquez et résolvez les problèmes lorsque les services Type=LoadBalancer rencontrent des erreurs CLB ou des échecs d'accès. Consultez les Notes sur l'équilibrage de charge des services.
Prérequis
La version du composant CCM doit être la V1.9.3.276-g372aa98-aliyun ou une version ultérieure (consultez les instructions de mise à niveau et les notes de version).
Processus de diagnostic
Identifiez la source d'un problème lié à un service LoadBalancer.
-
Identifiez le service associé à l'instance CLB. Remplacez
XXX.XXX.XXX.XXXpar l'adresse IP de l'équilibreur de charge.kubectl get svc -A | grep -i LoadBalancer | grep {XXX.XXX.XXX.XXX}Un service sain affiche une sortie similaire à :
default my-svc LoadBalancer 10.x.x.x XXX.XXX.XXX.XXX 80:32xxx/TCP 5d -
Exécutez la commande suivante pour vérifier si le service présente des événements d'erreur.
kubectl -n {your-namespace} describe svc {your-svc-name}Vérifiez la section Events en bas de la sortie. Exemple de sortie d'erreur :
Events: Type Reason Age From Message ---- ------ --- ---- ------- Warning SyncLoadBalancerFailed 2m service-controller <error message here>Si des événements d'erreur existent, faites correspondre le message d'erreur avec la section Événements d'erreur de service et solutions.
S'il n'y a aucun événement d'erreur, utilisez le guide basé sur les symptômes dans la section Méthodes de dépannage.
Événements d'erreur de service et solutions
Exécutez kubectl -n {your-namespace} describe svc {your-svc-name} et faites correspondre le message d'erreur dans la section Events au tableau ci-dessous.
| Message d'erreur | Cause | Solution |
|---|---|---|
The backend server number has reached to the quota limit of this load balancers |
L'instance CLB a atteint la limite de quota de 200 serveurs backend. |
Effectuez l'une des actions suivantes : 1. Demandez une augmentation de quota sur la
page de gestion des quotas SLB
. 2. Définissez externalTrafficPolicy: Local
pour réduire le nombre de backends. En mode Cluster, ajoutez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-backend-label pour limiter les nœuds backend. 3. Créez une nouvelle instance CLB.
|
The loadbalancer does not support backend servers of eni type |
Les instances CLB partagées ne prennent pas en charge les backends Elastic Network Interface (ENI). | Ajoutez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec: "slb.s1.small" pour utiliser une instance CLB haute performance. Vérifiez la compatibilité de la version CCM. Consultez la rubrique Utilisation d'annotations pour configurer une instance Classic Load Balancer (CLB). |
There are no available nodes for LoadBalancer |
L'instance CLB ne possède aucun serveur backend. | Vérifiez l'état des pods : <br>- Si aucun pod ne correspond au service, ajoutez-en un. <br>- Si le pod est indisponible, résolvez le problème. Consultez la rubrique Dépannage des problèmes de pod. <br>- Si le pod s'exécute mais n'est pas un backend, vérifiez s'il se trouve sur un nœud master et déplacez-le vers un nœud worker. |
alicloud: not able to find loadbalancer named [%s] in openapi, but it's defined in service.loaderbalancer.ingress... or alicloud: can not find loadbalancer, but it's defined in service |
L'instance CLB référencée par le service est introuvable. | Recherchez l'instance CLB dans la console Server Load Balancer en utilisant l'EXTERNAL-IP du service. <br>- Si le CLB n'existe plus et que le service n'est pas nécessaire, supprimez-le. <br>- Si le CLB existe et a été créé manuellement, ajoutez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. Consultez la rubrique Utilisation d'annotations pour configurer une instance Classic Load Balancer (CLB). <br>- Si le CLB a été créé par CCM, ajoutez le label kubernetes.do.not.delete à l'instance CLB. Consultez la rubrique Comment renommer une instance SLB si j'utilise une version antérieure de CCM ?. |
ORDER.ARREARAGE Message: The account is arrearage. |
Le compte présente un paiement en retard. | Réglez le paiement en retard. |
PAY.INSUFFICIENT_BALANCE Message: Your account does not have enough balance. |
Le solde du compte est insuffisant.
Le solde de votre compte est insuffisant. |
Rechargez le solde du compte. |
Status Code: 400 Code: Throttlingxxx |
L'API OpenAPI de CLB subit une limitation de débit (throttling). | 1. Vérifiez votre quota CLB sur la page de gestion des quotas SLB. <br>2. Vérifiez les erreurs de service et résolvez-les : kubectl -n {your-namespace} describe svc {your-svc-name}. |
Status Code: 400 Code: RspoolVipExist Message: there are vips associating with this vServer group. |
L'écouteur lié au groupe vServer ne peut pas être supprimé. | 1. Vérifiez si l'annotation du service contient un ID CLB : service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-clb-id}. Si c'est le cas, le CLB est réutilisé. <br>2. Dans la console CLB, supprimez l'écouteur pour le port défini dans le service. Consultez la rubrique Configuration des règles de transfert des écouteurs. |
Status Code: 400 Code: NetworkConflict |
L'instance CLB interne se trouve dans un Virtual Private Cloud (VPC) différent de celui du cluster. | Déplacez l'instance CLB vers le même VPC que le cluster, ou créez une nouvelle instance CLB dans le VPC correct. |
Status Code: 400 Code: VSwitchAvailableIpNotExist Message: The specified VSwitch has no available ip. |
Le vSwitch ne dispose d'aucune adresse IP disponible. | Ajoutez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-vswitch-id: "${YOUR_VSWITCH_ID}" pour spécifier un autre vSwitch dans le même VPC. |
The specified Port must be between 1 and 65535. |
Le mode ENI ne prend pas en charge les valeurs de chaîne pour targetPort. |
Modifiez targetPort pour utiliser un entier dans le YAML du service, ou mettez à jour CCM. Consultez la rubrique Mise à niveau du composant CCM. |
Status Code: 400 Code: ShareSlbHaltSales Message: The share instance has been discontinued. |
Les anciennes versions de CCM créent par défaut des instances CLB partagées, qui sont désormais obsolètes. | Mettez à niveau le composant CCM. |
can not change ResourceGroupId once created |
Le groupe de ressources CLB ne peut pas être modifié après la création de l'instance. | Supprimez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-resource-group-id:"rg-xxxx" du service. |
can not find eniid for ip x.x.x.x in vpc vpc-xxxx |
L'IP ENI est introuvable dans le VPC. L'annotation service.beta.kubernetes.io/backend-type: eni est définie, mais le cluster utilise Flannel, qui ne prend pas en charge le mode ENI. |
Supprimez l'annotation service.beta.kubernetes.io/backend-type: eni du service. |
The operation is not allowed because the instanceChargeType of loadbalancer is PayByCLCU. or User does not have permission modify InstanceChargeType to spec. |
La méthode de facturation CLB ne peut pas passer du paiement à l'utilisation (PayByCLCU) au paiement par spécification. | Effectuez l'une des actions suivantes : <br>- Supprimez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-spec. <br>- Si le service possède l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-instance-charge-type, définissez sa valeur sur PayByCLCU. |
SyncLoadBalancerFailed the loadbalancer xxx can not be reused, can not reuse loadbalancer created by kubernetes. |
L'instance CLB a été créée par CCM et ne peut pas être réutilisée via l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. |
1. Trouvez l'ID CLB dans l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id du YAML du service. <br>2. Résolvez le problème en fonction de l'état du service : <br> - Le service est en attente : Remplacez l'ID CLB par celui d'une instance créée manuellement dans la console Classic Load Balancer (CLB). <br> - Le service n'est pas en attente, l'IP CLB correspond à l'EXTERNAL-IP du service : Supprimez l'annotation service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id. <br> - Le service n'est pas en attente, l'IP CLB ne correspond pas : Trouvez le CLB correspondant à l'EXTERNAL-IP du service dans la console et mettez à jour l'annotation. S'il n'y a aucune correspondance, utilisez l'ID d'un CLB créé manuellement et recréez le service. |
alicloud: can not change LoadBalancer AddressType once created. delete and retry |
Le type d'instance CLB ne peut pas être modifié après sa création. | Supprimez le service et recréez-le. |
the loadbalancer lb-xxxxx can not be reused, service has been associated with ip [xxx.xxx.xxx.xxx], cannot be bound to ip [xxx.xxx.xxx.xxx] |
Le service est lié à une instance CLB et ne peut pas être relié en modifiant l'annotation. | Supprimez le service et recréez-le avec l'ID d'instance CLB correct. |
Méthodes de dépannage
Pour les problèmes qui ne génèrent pas d'événements d'erreur, utilisez le guide suivant basé sur les symptômes.
| Problème | Symptôme | Solution |
|---|---|---|
| Problèmes d'accès CLB | Répartition de charge inégale entre les backends | Répartition de charge inégale entre les backends CLB |
| Erreur 503 lors des mises à jour d'applications | Erreur 503 lors des mises à jour d'applications | |
| CLB inaccessible depuis l'intérieur du cluster | CLB inaccessible depuis l'intérieur du cluster | |
| CLB inaccessible depuis l'extérieur du cluster | CLB inaccessible depuis l'extérieur du cluster | |
| Erreur « The plain HTTP request was sent to HTTPS port » | Impossible de se connecter au service HTTPS backend | |
| Problèmes de configuration CLB | Les annotations de service ne prennent pas effet | Que faire si les annotations de service ne prennent pas effet ? |
| La configuration CLB est modifiée de manière inattendue | Pourquoi la configuration de mon instance CLB est-elle modifiée ? | |
| La réutilisation d'une instance CLB existante ne prend pas effet | FAQ sur les services | |
| Aucun écouteur configuré lors de la réutilisation d'une instance CLB existante | Pourquoi aucun écouteur n'est-il configuré lorsque je réutilise une instance CLB existante ? | |
| Backends CLB incohérents | Que faire si le groupe vServer SLB n'est pas mis à jour ? | |
| Problèmes de suppression CLB | L'instance CLB est supprimée de manière inattendue | Quand une instance SLB est-elle automatiquement supprimée ? |
| L'instance CLB n'est pas supprimée après la suppression du service | Quand une instance SLB est-elle automatiquement supprimée ? |
Répartition de charge inégale entre les backends CLB
Cause : L'algorithme de planification CLB n'est pas adapté au modèle de trafic.
Symptôme : Distribution inégale des requêtes sur les serveurs backend.
Solution :
Pour les services avec
externalTrafficPolicy: Local, ajoutez l'annotationservice.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wrr"pour utiliser la planification par tourniquet pondéré (weighted round-robin).Pour les services utilisant des connexions persistantes, ajoutez l'annotation
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-scheduler:"wlc"pour la planification par moindre connexion pondérée (weighted least connections). Cela empêche une connexion longue durée de monopoliser le trafic.
Erreur 503 lors des mises à jour d'applications
Cause : La vidange de connexion (connection draining) ou l'arrêt gracieux des pods n'est pas configuré. Lors des mises à jour progressives, CLB peut router le trafic vers des pods en cours de terminaison.
Symptôme : Erreur 503 lors de l'accès au CLB pendant une mise à jour d'application.
Solution :
Ajoutez l'annotation
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-connection-drainpour activer la vidange de connexion. Consultez la rubrique Opérations courantes de gestion des écouteurs.-
Configurez
readinessProbeetpreStopsur le pod :readinessProbe : Les pods rejoignent les backends CLB uniquement après avoir réussi la sonde. Définissez la fréquence de la sonde, le délai initial et le seuil d'échec en fonction du temps de démarrage de votre application. Des délais trop courts provoquent des redémarrages répétés des pods.
preStop et terminationGracePeriodSeconds : Définissez
preStopsur la durée nécessaire à votre application pour traiter les requêtes en cours. Définissez terminationGracePeriodSeconds sur une valeur d'au moins 30 secondes supérieure à preStop.
apiVersion: v1 kind: Pod metadata: name: nginx namespace: default spec: containers: - name: nginx image: nginx # Liveness probe livenessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Readiness probe readinessProbe: failureThreshold: 3 initialDelaySeconds: 30 periodSeconds: 30 successThreshold: 1 tcpSocket: port: 5084 timeoutSeconds: 1 # Graceful termination lifecycle: preStop: exec: command: - sleep - 30 terminationGracePeriodSeconds: 60
CLB inaccessible depuis l'intérieur du cluster
Cause : externalTrafficPolicy: Local est défini sur le service. kube-proxy transfère uniquement le trafic vers les pods situés sur le même nœud que l'origine de la requête. Si le nœud ne possède aucun pod backend pour le service, la connexion échoue. Cela affecte le trafic intra-cluster routé vers l'adresse CLB. Consultez kube-proxy adds external-lb address to node-local iptables rule.
Symptôme : Le CLB est accessible depuis l'extérieur du cluster, mais les connexions échouent depuis l'intérieur.
Solution : Utilisez l'une des approches suivantes :
Accès via ClusterIP ou nom de service (recommandé pour l'accès intra-cluster) : Utilisez le ClusterIP ou le nom DNS du service au lieu de l'adresse CLB. Pour Ingress, le nom du service est
nginx-ingress-lb.kube-system.-
Passer à
externalTrafficPolicy: Cluster: Le trafic intra-cluster atteint le service quel que soit l'emplacement des pods, mais l'IP source du client n'est pas conservée. Pour modifier le service Ingress :Avec un CLB Ingress, les pods ne peuvent accéder aux services exposés via Ingress/CLB qu'à partir du nœud exécutant le pod Ingress.
kubectl edit svc nginx-ingress-lb -n kube-system -
Utiliser
externalTrafficPolicy: Clusteravec le pass-through ENI (Terway uniquement) : Si votre cluster utilise Terway avec des ENI ou plusieurs IPs par ENI, définissezexternalTrafficPolicy: Clusteret ajoutez l'annotationservice.beta.kubernetes.io/backend-type: "eni". Cela conserve l'IP source et permet l'accès intra-cluster. Consultez la rubrique Utilisation d'annotations pour configurer une instance Classic Load Balancer (CLB).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
CLB inaccessible depuis l'extérieur du cluster
Cause : Une liste de contrôle d'accès (ACL) bloque l'IP du client, le groupe vServer du CLB ne possède aucun backend, ou la vérification d'état (health check) échoue.
Symptôme : L'instance CLB est inaccessible depuis l'extérieur du cluster.
Solution :
-
Vérifiez la présence d'événements d'erreur de service et résolvez-les. Consultez la section Événements d'erreur de service et solutions.
kubectl -n {your-namespace} describe svc {your-svc-name} Vérifiez si une ACL est configurée sur l'instance CLB. Le cas échéant, assurez-vous qu'elle autorise le trafic entrant depuis l'IP du client. Consultez la rubrique Gestion des accès aux ressources (RAM).
Vérifiez si le groupe vServer du CLB est vide. S'il l'est, assurez-vous qu'un pod est associé au service et qu'il est en cours d'exécution. S'il est indisponible, résolvez d'abord le problème du pod. Consultez la rubrique Dépannage des problèmes de pod.
Vérifiez si la vérification d'état de l'écouteur CLB réussit. En cas d'échec, assurez-vous que le pod répond correctement. Consultez la FAQ sur la vérification d'état CLB.
Impossible de se connecter au service HTTPS backend
Cause : Avec un certificat sur l'écouteur CLB, CLB termine le TLS et transmet le HTTP aux backends. Si targetPort pointe vers un port HTTPS (par exemple, 443), le pod rejette la requête en texte clair avec l'erreur « The plain HTTP request was sent to HTTPS port ».
Symptôme : Les connexions backend échouent après la configuration du HTTPS sur l'écouteur CLB.
Solution : Définissez targetPort sur le port HTTP du pod. Par exemple, si Nginx sert le HTTPS sur le port 443, définissez targetPort sur 80.
apiVersion: v1
kind: Service
metadata:
annotations:
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-protocol-port: "https:443"
service.beta.kubernetes.io/alibaba-cloud-loadbalancer-cert-id: "${YOUR_CERT_ID}"
name: nginx
namespace: default
spec:
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
- name: https
port: 443
protocol: TCP
targetPort: 80
selector:
run: nginx
type: LoadBalancer