ALB Ingress异常问题排查

ALB Ingress Controller是一种用于Kubernetes集群的Ingress Controller,用于将外部流量导入到集群内部的服务。当使用ALB Ingress访问服务时,ALB Ingress Controller会监听Service关联的Endpoint资源的变化,实时将后端节点的状态同步到对应的后端服务器组中,并将变更同步到ALB实例。本文介绍在使用ALB Ingress过程中遇到的各种异常事件的诊断和解决方案。

工作原理

通过ALB Ingress访问服务时,ALB Ingress Controller组件会监控各类资源的变更,并将变更同步至关联的ALB实例。同步过程中可能会因为各项限制或配置错误导致同步过程失败,不同资源的逻辑对应关系和同步情况如下图所示。

image

步骤一:查看异常事件

  • 控制台方式:在左侧导航栏,选择网络 > 路由。选择目标命名空间,单击目标Ingress名称进入基本信息页面,然后切换到事件页签。

  • kubectl方式:

    kubectl describe ingress <ingress-name> -n <namespace>

    预期输出:

    ...
    Events:
      Type     Reason                  Age                     From     Message
      ----     ------                  ----                    ----     -------
      Warning  FailedBuildModel        2m28s (x10 over 6m43s)  ingress  listener is not exist in alb, port: 443, protocol: HTTPS
      Normal   Sync                    19s (x32 over 11d)      ingress  Scheduled for sync
      Normal   SuccessfullyReconciled  4s (x20 over 11d)       ingress  Successfully reconciled

在事件详细描述或者Message中查找与Ingress相关的事件信息。

步骤二:分析和解决异常事件

常见异常事件的报错原因及解决方案见下表。

为避免老版本ALB Ingress Controller组件不兼容新功能导致的异常事件,诊断前可参考发布记录将组件升级至目标版本。

报错信息(Message)

报错原因

解决方案

listener is not exist in alb, port: 80, protocol: HTTP

对于2.11.0及以上版本的ALB Ingress Controller组件,Ingress上的监听只会进行关联,不会自动创建。若您未在AlbConfig中创建对应的监听,却在Ingress中使用了监听,就会产生报错信息。

若您使用的是2.11.0及以上版本的ALB Ingress Controller组件,请在AlbConfig中创建Ingress资源所需的监听。具体操作,请参见通过AlbConfig配置ALB监听

listener not found for (80/HTTP), with ingresses 1

对于2.11.0及以上版本的ALB Ingress Controller组件,如果在AlbConfig中直接移除了Ingress仍在关联的监听,将会产生报错,并显示缺失的监听和关联的Ingress个数。

如需移除监听,请将监听关联的Ingress全部移除。

重要

如果移除了预期外的监听,则需重新添加已移除的监听。

none certificate found for host

开启了TLS且有域名使用了自动发现证书功能,但是在证书中心没有发现该域名可用的证书。

The param of Rules.1.RuleConditions.2.PathConfig.Values.1 is illegal

创建或修改转发规则时包含非法路径参数。

  • 如果您在ALB Ingress中使用了Rewrite注解,需要将pathType字段的参数值修改为Prefix

  • 如果您未在ALB Ingress使用Rewrite注解,那么有可能path字段中包含了特殊字符。

    说明

    非正则表达式类型的路径必须以/开头,支持大小写字母、数字和美元符号($)、加号(+)、正斜线(/)、and(&)、波浪线(~)、at(@)、下划线(_)、短划线(-)、英文半角句号(.)、英文半角冒号(:),还支持星号(*)和英文半角问号(?)作为通配符使用。

The param of ServerGroupName is illegal

报错说明ALB后端服务器组命名格式不正确。

请按照正确的格式命名服务器组名称。

当前服务器组名称的生成格式是命名空间+Service名称+端口。其中,服务器组名称的字符长度为[2, 128],必须以大小写字母或中文开头,可包含数字、英文半角句号(.)、下划线(_)和短划线(-)。

The specified resource sgp-vz2fb219vv792flx3u is in use

报错说明该ACK托管的ALB后端服务器组被另一个ALB实例引用。

登录应用型负载均衡ALB控制台,在左侧导航栏选择应用型负载均衡 ALB > 服务器组,在服务器组页面找到对应的后端服务器组,根据需求解除关联的ALB实例。

Message: 无效参数,请检查参数输入

常见于AlbConfig指定证书时,证书ID配置错误。

请检查证书ID是否使用了资源ID或数字ID,应当使用由CertIdentifier指定的证书ID。

Message: Failed to create SSL Certificate with name default-https-secret-1-b585e6 ({namespace}-{name}-{identity}). Error: 证书已经过期

Secret证书已过期。异常信息中证书名称由三部分组成:{namespace}-{name}-{identity}

  • {namespace}:异常Secret所在命名空间,示例值:default

  • {name}:异常Secret名称,示例值:https-secret-1

  • {identity}:异常Secret内容哈希值,示例值:b585e6

  1. 更新Ingress中配置在secretName中已过期的证书。新证书的有效期至少超过当前日期 1 天以上。

  2. 删除Ingress中的secretName配置,使用证书自动发现。

详细配置方式,请参见配置HTTPS证书以实现加密通信

failed to createSSLCertificateWithName: XXX

ErrorCode: NameRepeat

Message: 名称重复,请重新输入。

Ingress使用Secret证书,证书过期后使用配置AlbConfig方式上传证书会复用过期证书的名称,导致SSL证书名称重复。

invalid server group Cookie:

  • 未配置Cookie

    当会话保持配置了重写Cookie方式(sticky-session-type: "Server")时,不填写Cookie值会产生报错。错误示例如下:

    ...
    alb.ingress.kubernetes.io/sticky-session: "true"
    alb.ingress.kubernetes.io/sticky-session-type: "Server"   
    alb.ingress.kubernetes.io/cookie-timeout: "1800"
    alb.ingress.kubernetes.io/cookie: "" # 不允许为空

使用重写Cookie方式时,需配置实际的Cookie值:

...
alb.ingress.kubernetes.io/cookie: "test" 

更多参数说明,请参见通过注解实现会话保持

  • ALB Ingress Controller版本较低

    v2.15.0-aliyun.1以下版本的ALB Ingress Controller中,服务器组会话保持不支持自定义Cookie。

通过组件管理升级ALB Ingress Controller组件

The quota of alb_quota_server_added_num is exceeded for resource eni-xxxx, usage 202/200

触发了ALBquota alb_quota_server_added_num配额限制,即同一个后端服务器(IP)可被添加到ALB后端服务器组的次数限制。

通过配额中心提升服务器组配额

常见问题

ALB Ingress无异常事件,但是变更不生效怎么办?

当出现未执行AlbConfig相关的调谐事件,或者变更事件没有成功处理时,原因可能是IngressClassAlbConfig的绑定关系错误。请参考使用IngressClass关联AlbConfigIngress检查IngressClass中指定的spec.parameters参数是否关联了正确的AlbConfig资源对象名称。