本文汇总了使用ALB Ingress时遇到的常见问题。
索引
问题分类 | 跳转链接 |
功能咨询 | |
使用异常 | |
性能调优 |
功能咨询
ALB Ingress和Nginx Ingress有什么区别?
推荐您使用ALB Ingress,相较于Nginx Ingress需要您自己运维,ALB Ingress基于阿里云应用型负载均衡ALB(Application Load Balancer),属于全托管免运维的云服务,提供了更为强大的Ingress流量管理方式和高性能的网关服务。关于Nginx Ingress与ALB Ingress的对比详情,请参见Nginx Ingress、ALB Ingress和MSE 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相关的调和事件,或者变更事件没有成功处理时,原因可能是IngressClass和AlbConfig的绑定关系错误。请按照使用文档检查IngressClass中指定的parameters
参数是否正确。详细操作,请参见使用IngressClass关联AlbConfig与Ingress。
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配置HTTP和HTTPS监听后,无法正常访问HTTP和HTTPS监听端口?
问题现象
已在 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 Ingress或ALBConfig的形式保存在集群的APIServer中。在ALB控制台手动修改配置的行为并没有修改APIServer中的资源,所以修改的配置并不会生效。如果触发集群内调和操作,就会使用Ingress或ALBConfig中的配置对控制台配置进行变更,导致出现手动修改的配置被覆盖的现象。建议您通过修改ALB Ingress或AlbConfig来修改对应配置。
为什么会在调谐过程中出现错误提示: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命令更新AlbConfig的ACL(访问控制列表)配置,为什么会导致部分监听被删除?
问题现象
在控制台上创建并配置 ALB 实例后,通过 kubectl apply
命令更新 AlbConfig 的 ACL(访问控制列表)配置,结果发现部分监听被意外删除,导致相关端口或规则失效。
解决方案
优先推荐使用kubectl edit
命令直接更新资源的配置。如果必须使用kubectl apply
命令来更新资源,请在执行kubectl apply
命令之前先执行kubectl diff
命令预览变更点,确保变更符合预期,然后再使用kubectl apply
命令将变更应用到Kubernetes集群。
kubectl apply
命令的语义会对ALBConfig进行覆盖式更新。因此,在使用kubectl apply
命令更新ALBConfig的ACL配置时,请确保YAML文件中包含了完整的监听配置,以免未包含的监听被删除。
若执行kubectl apply
命令后发现有监听被删除,推荐您按照以下方式进行恢复。
查看YAML文件中是否指定了完整的监听列表。
若监听列表中缺少被删除的监听,请执行下一步操作。否则,无需执行。
执行以下命令,编辑对应的AlbConfig,将被删除的监听配置添加回来。
kubectl -n <namespace> edit AlbConfig <albconfig-name> # 将<namespace>和<albconfig-name>分别替换为AlbConfig资源所在的命名空间和AlbConfig资源的名称。
性能调优
如何优化Service中Pod变配时的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对外提供服务。
Service后端Pod的总数量 | 描述 |
Pod数量 <= 100个 | ALB Ingress Controller会将每个节点上的Pod数量作为该节点的权重。 例如:如上图所示,三台ECS的Pod数量为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负载分布。 |