ALB Ingress FAQ

本文汇总了使用ALB Ingress时遇到的常见问题。

索引

问题分类

跳转链接

功能咨询

使用异常

性能调优

功能咨询

ALB IngressNginx Ingress有什么区别?

推荐您使用ALB Ingress,相较于Nginx Ingress需要您自己运维,ALB Ingress基于阿里云应用型负载均衡ALB(Application Load Balancer),属于全托管免运维的云服务,提供了更为强大的Ingress流量管理方式和高性能的网关服务。关于Nginx IngressALB Ingress的对比详情,请参见Nginx Ingress、ALB IngressMSE Ingress对比

ALB Ingress是否支持同时使用公网和私网?

问题现象

在实际业务场景中,既需要通过公网访问 ALB Ingress,也希望通过私网进行访问,但不清楚 ALB Ingress 是否支持同时满足公网和私网访问需求?

解决方案

支持。如果您想同时使用公网和私网访问ALB Ingress,您需要创建公网ALB实例,该实例会在每个可用区创建一个公网EIP,ALB实例可以通过EIP与公网通信。同时,该实例还会提供一个私网VIP,您可以通过私网VIP访问ALB实例,实现从私网访问的效果。如果您只想私网访问ALB Ingress,建议您创建一个私网ALB实例。

如何保证ALB Ingress使用固定的ALB域名?

通过ALBConfig创建ALB实例之后,ALB Ingress会通过IngressClass引用ALBConfig,从而使用对应的ALB实例域名。如果ALB Ingress关联的IngressClass以及ALBConfig不作变更,则域名保持不变。

为什么在集群中看不到ALB Ingress Controller Pod?

问题现象

在集群中查找 ALB Ingress Controller Pod 时,发现 kube-system 命名空间下没有相关的 Pod,无法通过常规方法查看ALB Ingress Controller 组件。

解决方案

ACK专有版才能在kube-system命名空间下看到ALB Ingress Controller Pod。ACK标准版、ACK Pro版和ACK Serverless托管了ALB Ingress Controller组件,因此无法在集群中看到ALB Ingress Controller Pod。关于ACK专有版升级到ACK Pro版的具体操作,请参见热迁移ACK专有集群至ACK托管集群Pro

如何支持挂载IP类型服务器?

问题现象

需要将后端 Pod 以 IP类型的方式挂载到 ALB,但在默认配置下,Service 无法自动创建 IP类型的服务器组,导致后端服务的流量分发受限。

解决方案

可以通过在 Service 的 annotations 中添加 alb.ingress.kubernetes.io/server-group-type: Ip 注解,实现为该 Service 创建 IP类型的服务器组,从而支持以 IP 方式将后端 Pod 注册到 ALB。

说明
  • 服务器组类型一经创建无法更改。在 Flannel 网络模式下,若修改 Service 类型(如 ClusterIP 与 NodePort 之间切换),会导致后端挂载节点类型在 IP 和 ECS 之间切换,从而无法加入原有服务器组。因此,不支持直接修改 Service 类型。

  • 如需调整服务器组类型,建议新建一个 Service,并在 annotations 中指定 server-group-type: Ip,避免影响存量服务器组挂载节点。

  • 设置 server-group-type 注解后,切勿随意删除该注解,否则会导致 Service 对应的服务器组类型不一致,出现调谐失败,进而导致后端节点无法正常加入服务器组。

apiVersion: v1
kind: Service
metadata:
  annotations:
    alb.ingress.kubernetes.io/server-group-type: Ip
  name: tea-svc
spec:
  ports:
    - port: 80
      targetPort: 80
      protocol: TCP
  selector:
    app: tea
  type: ClusterIP

创建ACK托管版集群时选择使用ALB Ingress,是否会自动创建ALB实例?

不会。创建ACK托管版集群时选择ALB Ingress,将会安装ALB Ingress Controller,并不会自动创建ALB实例。

ALB后端默认监听转发到kube-system-fake-svc-80服务器组,该服务器组的作用是什么?

创建监听必须有一个默认转发规则,并且转发规则目前只支持转发到某个服务器组。所以,当前需要通过创建kube-system-fake-svc-80服务器组实现监听功能。该服务器组不参与业务处理,但不能被删除。

使用异常

为什么ALB Ingress规则不生效?

问题现象

新建 ALB Ingress 规则后,发现路由规则没有按预期生效,无法正常转发到对应的后端服务。

问题原因

ALB实例是按照串行的方式维护路由规则。也就是说,如果多个ALB Ingress使用的是同一个ALB实例,那么一个ALB Ingress配置有问题,其他的ALB Ingress变更都不会生效。

解决方案

如果您创建的ALB Ingress没有生效,那么有可能是之前创建的ALB Ingress发生了错误。您需要将错误的ALB Ingress修正为正确后,新创建的ALB Ingress才能生效。

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

问题现象

ALB Ingress 在配置变更或关联 AlbConfig 后,未见异常事件上报,但相关变更并未生效。

解决方案

当出现未执行AlbConfig相关的调和事件,或者变更事件没有成功处理时,原因可能是IngressClassAlbConfig的绑定关系错误。请按照使用文档检查IngressClass中指定的parameters参数是否正确。详细操作,请参见使用IngressClass关联AlbConfigIngress

ALB Ingress转发规则创建后被立即删除,出现503状态码怎么办?

问题现象

ALB Ingress 转发规则创建后被立即删除,导致服务访问返回 503 状态码,无法正常进行流量分发。

解决方案

检查转发规则对应Ingress是否都配置了canary:true注解项。由于Canary灰度强制需要主干版本才能引流,所以对于主干版本的Ingress,不需要添加canary:true注解。关于如何使用ALB Ingress实现服务的灰度发布,请参见通过ALB Ingress实现灰度发布

Canary灰度方式仅支持两个Ingress且条件有限,推荐您使用自定义转发规则,使用更丰富的引流方案 。具体操作,请参见自定义ALB Ingress的转发规则

AlbConfig资源报错listener is not exist in alb, port: xxx?

问题现象

当访问除 80 端口外的其他端口时,发现请求均无法正常连接。同时,AlbConfig 资源报出 “listener is not exist in alb, port: xxx” 错误,导致相关端口未能被监听和转发流量。

解决方案

默认创建的 AlbConfig 仅包含端口 80 的监听器。如果需要监听其它端口,需要在 AlbConfig 中新增对应端口的监听配置。具体操作请参见创建监听

AlbConfig配置HTTPHTTPS监听后,无法正常访问HTTPHTTPS监听端口?

问题现象

已在 AlbConfig 中配置了 HTTP 和 HTTPS 监听端口,但实际访问时,HTTP 和 HTTPS 端口均无法正常被监听或转发,导致服务无法通过这两个端口对外提供访问。

解决方案

确认是否在 Ingress 资源的 annotations 中添加 alb.ingress.kubernetes.io/listen-ports 注解,指定 ALB Ingress 同时监听 HTTP(80)和 HTTPS(443)端口。例如:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: https-ingress
  annotations:
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 使用多个监听时需要添加annotation使ALB Ingress正常工作。
spec:
  #...

为什么在ALB控制台手动变更的配置会丢失,并且添加的规则会被删除,访问日志会被关闭?

问题现象

通过 ALB 控制台手动修改配置后,发现这些配置会丢失或被自动删除,访问日志功能也会被关闭。

解决方案

ALB Ingress需要通过修改集群内资源来实现配置变更,相应的配置会以ALB IngressALBConfig的形式保存在集群的APIServer中。在ALB控制台手动修改配置的行为并没有修改APIServer中的资源,所以修改的配置并不会生效。如果触发集群内调和操作,就会使用IngressALBConfig中的配置对控制台配置进行变更,导致出现手动修改的配置被覆盖的现象。建议您通过修改ALB IngressAlbConfig来修改对应配置。

为什么会在调谐过程中出现错误提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid?

问题现象

在调谐过程中出现以下错误提示:“Specified parameter array contains too many items, up to 15 items, Certificates is not valid”,导致 ALB Ingress 无法正常关联所需证书。

解决方案

ALB Ingress Controller组件的v2.11.0-aliyun.1版本开始,新增了对证书分页的支持。如果在调谐过程中出现错误提示:Specified parameter array contains too many items, up to 15 items, Certificates is not valid,这表明您当前使用的ALB Ingress Controller组件版本尚未支持证书分页功能,并且您的使用场景中单次调谐尝试关联的证书数量超过了15张的限制。为解决此问题,建议您将ALB Ingress Controller组件升级至最新版本。关于组件的版本信息,请参见ALB Ingress Controller。关于如何升级组件,请参见管理ALB Ingress Controller组件

在控制台上配置完创建的ALB实例后,使用kubectl apply命令更新AlbConfigACL(访问控制列表)配置,为什么会导致部分监听被删除?

问题现象

在控制台上创建并配置 ALB 实例后,通过 kubectl apply 命令更新 AlbConfig 的 ACL(访问控制列表)配置,结果发现部分监听被意外删除,导致相关端口或规则失效。

解决方案

说明

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

kubectl apply命令的语义会对ALBConfig进行覆盖式更新。因此,在使用kubectl apply命令更新ALBConfigACL配置时,请确保YAML文件中包含了完整的监听配置,以免未包含的监听被删除。

若执行kubectl apply命令后发现有监听被删除,推荐您按照以下方式进行恢复。

  1. 查看YAML文件中是否指定了完整的监听列表。

    若监听列表中缺少被删除的监听,请执行下一步操作。否则,无需执行。

  2. 执行以下命令,编辑对应的AlbConfig,将被删除的监听配置添加回来。

    kubectl -n <namespace> edit AlbConfig <albconfig-name> # 将<namespace>和<albconfig-name>分别替换为AlbConfig资源所在的命名空间和AlbConfig资源的名称。

性能调优

如何优化ServicePod变配时的Server调谐时间?

问题现象

在 Kubernetes 环境中,当 Service 关联的 Pod 扩缩容时,Server 调谐过程耗时较长,影响业务弹性扩缩容的实时性。排查发现,调谐时间随关联 Ingress 数量增加而明显变长。

解决方案

为提升 Server 调谐效率,可采取以下优化措施:

  • 限制Ingress数量:同一个Service挂载的Ingress数不超过30条。

  • 合并Ingress规则:当Ingress数量过多时,您可以将多个Service挂载在同一个Ingress下,然后通过在同一个Ingress资源下定义多条转发规则来提升Server调谐性能。

在使用Flannel网络插件且Service配置为Local模式时,如何自动分配Node权重

问题现象

在使用 Flannel 网络插件且 Service 配置为 Local 模式的场景下,节点实际接收到的流量分布不均衡,导致部分节点负载偏高,未能实现期望的流量均衡。如何自动根据节点上的 Pod 数量为节点分配权重,从而实现更合理的流量分发。

解决方案

说明

v2.13.1-aliyun.1版本开始,ALB Ingress Controller支持自动设置节点权重。请确保您升级到最新版本以使用此功能。更多信息,请参见升级ALB Ingress Controller组件

Flannel插件的集群中,当Service设置为Local模式时,Node权重的计算方式。如下图所示,示例中业务Pod(app=nginx)部署在三台ECS上,通过Service A对外提供服务。

image

Service后端Pod的总数量

描述

Pod数量 <= 100

ALB Ingress Controller会将每个节点上的Pod数量作为该节点的权重。

例如:如上图所示,三台ECSPod数量为1、2、3,则相应的ECS权重被设定为1、2、3。因此,流量将以1:2:3的比例分配至这三台ECS上,从而实现更均衡的Pod负载分配。

Pod数量 > 100

ALB Ingress Controller将根据Node上部署的Pod数量占Pod总数的百分比计算Node权重。

例如:若上图中三台ECS上的Pod数量分别为100、200、300,则相应的ECS权重被设定为16、33、50。因此,流量将依照16:33:50的比例分配到这三台ECS上,以达到更平衡的Pod负载分布。