本文汇总了使用容器服务ACK Service时的常见问题。
索引
SLB相关
-
创建Service时,Local和Cluster两种外部流量策略如何选择?
-
为什么看不到Service与LoadBalancer同步过程的事件Event信息?
-
SLB创建一直处于Pending状态如何处理?
-
SLB虚拟服务器组未更新如何处理?
-
Service注解不生效如何处理?
-
为何SLB的配置被修改?
-
为什么集群内无法访问SLB IP?
-
什么情况下会自动删除SLB?
-
误删除SLB怎么办?
-
删除Service是否会删除SLB?
-
旧版本CCM如何支持SLB重命名?
-
Local模式下如何自动设置Node权重?
-
ACK集群中SLB实例的具体用途
使用已有SLB常见问题
-
为什么复用已有SLB没有生效?
-
为什么复用已有SLB时没有配置监听?
其他
-
Service报错信息及对应处理方式
-
CCM升级失败如何处理?
-
Kubernetes的Service如何进行会话保持?
-
当Service类型为NodePort时,如何为Service配置监听?
-
如何访问NodePort类型的Service?
-
如何正确配置NodePort范围?
SLB相关
创建Service时,Local和Cluster两种外部流量策略如何选择?
不同网络插件,Local和Cluster两种外部流量策略的功能不同。关于Local和Cluster两种外部流量策略的详细区别,请参见外部流量策略功能对比。
为什么看不到Service与LoadBalancer同步过程的事件Event信息?
如果执行命令kubectl -n {your-namespace} describe svc {your-svc-name}
后看不到Event信息的话,请确认您的CCM组件版本。
-
低于v1.9.3.276-g372aa98-aliyun版本:低版本CCM组件无法看到Service与LoadBalancer同步过程的事件信息,请升级组件版本。关于如何查看及升级CCM版本,请参见升级CCM组件。
-
大于或等于v1.9.3.276-g372aa98-aliyun版本:请提交工单。
SLB创建一直处于Pending状态如何处理?
-
执行命令
kubectl -n {your-namespace} describe svc {your-svc-name}
查看事件信息。 -
处理事件中的报错信息。关于事件中不同报错信息的处理方式,请参见报错事件及对应处理方式。
如果看不到报错信息,请参见为什么看不到Service与LoadBalancer同步过程的事件Event信息?。
SLB虚拟服务器组未更新如何处理?
-
执行命令
kubectl -n {your-namespace} describe svc {your-svc-name}
查看事件信息。 -
处理事件中的报错信息。关于事件中不同报错信息的处理方式,请参见报错事件及对应处理方式。
如果看不到报错信息,请参见为什么看不到Service与LoadBalancer同步过程的事件Event信息?。
Service注解不生效如何处理?
-
按照以下步骤查看报错信息。
-
执行命令
kubectl -n {your-namespace} describe svc {your-svc-name}
查看事件信息。 -
处理事件中的报错信息。关于事件中不同报错信息的处理方式,请参见报错事件及对应处理方式。
-
-
如果没有报错信息,分以下三种场景解决:
-
确认您的CCM版本是否符合对应注解的版本要求。关于注解和CCM的版本对应关系,请参见常用注解。
-
在服务Service列表中,单击目标服务右侧操作列下的查看YAML,确认服务Service中是否有对应的注解。如果没有对应注解,配置注解信息。
关于如何配置注解,请参见通过Annotation配置传统型负载均衡CLB。
关于如何查看服务列表,请参见使用Service对外暴露应用。
-
确认注解信息是否有误。
-
为何SLB的配置被修改?
CCM使用声明式API,会在一定条件下自动根据Service的配置更新SLB配置。您自行在SLB控制台上修改的配置均存在被覆盖的风险。建议您通过注解的方式配置SLB。关于注解配置方式的更多信息,请参见通过Annotation配置传统型负载均衡CLB。
重要
请勿在SLB控制台上手动修改Kubernetes创建并维护的SLB的任何配置,否则有配置丢失的风险,造成Service不可访问。
为什么集群内无法访问SLB IP?
-
场景一:设置SLB IP为私网地址,并且没有通过Service方式创建SLB,那么SLB后端Pod和访问SLB Pod将在同一个节点,导致在集群内访问SLB IP失败。
对于四层负载均衡服务,目前不支持负载均衡后端ECS实例直接为客户端提供服务的同时,又作为负载均衡的后端服务器。因此在集群内访问SLB IP会失败。您可以通过以下方式解决该问题,从而避免访问端和目的端在同一个节点。
-
将SLB IP修改为公网地址。
-
使用Service的方式创建SLB,同时设置外部流量策略为Cluster,这种情况下kube-proxy会劫持集群内访问SLB流量,绕过SLB本身限制。
-
-
场景二:使用Service发布服务时,设置了外部流量策略为Local,导致在集群内访问SLB IP失败。
关于该问题的详细原因和解决方案,请参见Kubernetes集群中访问LoadBalancer暴露出去的SLB地址不通。
什么情况下会自动删除SLB?
自动删除SLB的策略取决于SLB是否由CCM自动创建。删除策略如下表所示。
Service操作 |
CCM自动创建的SLB |
复用的已有SLB |
删除Service |
删除SLB |
保留SLB |
修改LoadBalancer型Service为其他类型 |
删除SLB |
保留SLB |
删除Service是否会删除SLB?
如果是复用已有SLB(Service中有service.beta.kubernetes.io/alibaba-cloud-loadbalancer-id: {your-slb-id}
注解),删除Service时不会删除SLB;否则删除Service时会删除对应的SLB。
如果您更改Service类型(例如从LoadBalancer改为NodePort)也会删除对应的CCM自动创建的SLB。
误删除SLB怎么办?
-
场景一:误删除API Server SLB如何处理?
无法恢复,您需要重建集群。具体操作,请参见创建ACK Pro版集群。
-
场景二:误删除Ingress SLB如何处理?
按照以下步骤重新创建SLB。
-
登录容器服务管理控制台。
-
在控制台左侧导航栏中,单击集群。
-
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
-
选择网络 > 服务。
-
在服务页面顶部的命名空间下拉列表中,单击kube-system,然后在服务列表中,找到nginx-ingress-lb,然后单击操作列下的查看YAML。
如果没有nginx-ingress-lb,使用以下模板创建名为nginx-ingress-lb的Service。
apiVersion: v1 kind: Service metadata: labels: app: nginx-ingress-lb name: nginx-ingress-lb namespace: kube-system spec: externalTrafficPolicy: Local ports: - name: http port: 80 protocol: TCP targetPort: 80 - name: https port: 443 protocol: TCP targetPort: 443 selector: app: ingress-nginx type: LoadBalancer
-
在编辑YAML对话框中,移除status内容,然后单击更新以让CCM重建SLB。
-
-
场景三:误删除业务相关的SLB如何处理?
-
如果不需要SLB对应的Service,删除Service。
-
如果对应的Service还需要使用,解决方法如下。
-
登录容器服务管理控制台。
-
在控制台左侧导航栏中,单击集群。
-
在集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情。
-
在集群管理页面左侧导航栏选择网络 > 服务。
-
在服务页面顶部的命名空间下拉框中,单击所有命名空间,然后在服务列表中,找到业务Service,然后单击操作列下的查看YAML。
-
在编辑YAML对话框中,移除status内容,然后单击更新以让CCM重建SLB。
-
-
旧版本CCM如何支持SLB重命名?
Cloud Controller Manager组件V1.9.3.10后续版本创建的SLB支持自动打TAG从而可以重命名,而V1.9.3.10及之前的版本,您需要手动给该SLB打上一个特定的TAG从而支持SLB重命名。
说明
-
只有Cloud Controller Manager组件V1.9.3.10及之前版本创建的SLB才需要手动打TAG的方式来支持重命名。
-
Service类型为LoadBalancer。
-
登录到Kubernetes集群Master节点,请参见获取集群KubeConfig并通过kubectl工具连接集群。
-
执行
kubectl get svc -n ${namespace} ${service}
命令,查看该Service类型及IP。说明
您需要将namespace与service替换为所选集群的命名空间及服务名称。
-
执行以下命令,生成该SLB所需要的Tag。
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)}'
登录负载均衡控制台根据步骤2中所获取的IP,在其所在的地域搜索到该SLB。
-
根据步骤3生成的Key值和Value值(分别对应上图的1和2),为该SLB打上一个Tag。具体操作,请参见管理标签。
Local模式下如何自动设置Node权重?
本文以业务Pod(app=nginx)部署在三台ECS上,通过Service A对外提供服务为例,说明在Local模式下Node权重的计算方式。

-
V1.9.3.164-g2105d2e-aliyun之前版本
如下图所示,在V1.9.3.164-g2105d2e-aliyun之前版本,Local模式的Service其所有后端权重均为100,即所有流量平均分配到这三台ECS上,造成ECS 1上Pod负载较重而ECS 3上的Pod负载较轻,导致Pod负载不均。
-
V1.9.3.164-g2105d2e-aliyun之后及V1.9.3.276-g372aa98-aliyun之前版本
如图所示,在V1.9.3.164-g2105d2e-aliyun之后及V1.9.3.276-g372aa98-aliyun之前版本,CCM会根据Node上部署的Pod数量计算Node权重。经计算三台ECS权重分别为16、33、50,因此流量将大致按照1:2:3的比例分配给三台ECS,Pod负载更加均衡。
计算公式如下所示:
-
V1.9.3.276-g372aa98-aliyun及之后版本
权重计算方式因为计算精度问题,Pod间还会存在轻微的负载不均。在V1.9.3.276-g372aa98-aliyun及之后版本,CCM将Node上部署的Pod数量设置为Node权重,如图4所示,三台ECS的权重分别为1、2、3,流量会按照1:2:3的比例分配给三台ECS,Pod负载比图3的方式更加均衡。
计算公式如下所示:
使用已有SLB常见问题
为什么复用已有SLB没有生效?
-
排查CCM版本,低于v1.9.3.105-gfd4e547-aliyun的CCM版本不支持复用。关于如何查看及升级CCM版本的操作,请参见升级CCM组件。
-
确认复用的SLB是否为集群创建的,不支持复用集群创建的SLB。
-
确认SLB是否为API Server的SLB,不支持复用API Server的SLB。
-
如果是私网SLB,确认SLB是否和集群在同一个VPC中,不支持跨VPC复用SLB。
为什么复用已有SLB时没有配置监听?
确认是否在注解中配置了service.beta.kubernetes.io/alibaba-cloud-loadbalancer-force-override-listeners
为"true"
。如果没有配置,则不会自动创建监听。
说明
复用已有的负载均衡默认不覆盖已有监听,因为以下两点原因:
-
如果已有负载均衡的监听上绑定了业务,强制覆盖可能会引发业务中断。
-
由于CCM目前支持的后端配置有限,无法处理一些复杂配置。如果有复杂的后端配置需求,可以在不覆盖监听的情况下,通过控制台自行配置监听。
如存在以上两种情况不建议强制覆盖监听,如果已有负载均衡的监听端口不再使用,则可以强制覆盖。
其他
CCM升级失败如何处理?
关于CCM组件升级失败的解决方案,请参见Cloud Controller Manager(CCM)组件升级检查失败。
Service报错信息及对应处理方式
不同报错信息的解决方法如下表所示。
报错信息 |
说明及解决方法 |
|
指SLB的后端服务器配额不足。 解决方案:您可以采取以下方式,优化配额消耗。
|
|
共享型SLB不支持ENI。 解决方案:如果SLB后端使用的是ENI,您需要选择性能保障型SLB实例。在Service中添加注解 重要 添加注解需要注意是否符合CCM的版本要求。关于注解和CCM的版本对应关系,请参见常用注解。 |
|
SLB无后端服务器,请确认Service是否已关联Pod且Pod正常运行。 解决方案:
|
|
无法根据Service关联SLB。 解决方案:登录负载均衡管理控制台,根据Service的
|
|
账号欠费。 |
|
账号余额少于100元,请充值。 |
|
SLB OpenAPI限流。 解决方案:
|
|
无法删除虚拟服务器组关联的监听。 解决方案:
|
|
复用内网SLB时,该SLB和集群不在同一个VPC内。 解决方案:请确保您的SLB和集群在同一个VPC内。 |
|
虚拟交换机不足。 解决方案:通过 |
|
虚拟交换机不存在。 解决方案:
|
|
ENI模式不支持String类型的 解决方案:将Service YAML中的 |
|
低版本CCM默认创建共享型SLB,但该类型SLB已停止售卖。 解决方案:升级CCM组件。 |
|
SLB资源组一旦创建后不支持修改。 解决方案:移除Service中的注解 |
|
无法在VPC内找到指定的ENI IP。 解决方案:确认Service中是否配置了注解 |
|
SLB计费类型不支持从按量付费转为按规格收费。 解决方案:
|
|
复用了CCM创建的SLB。 解决方案:
|
|
SLB的类型一旦创建后不可更改,创建Service后更改了SLB的类型会导致该报错。 解决方案:删除重建Service。 |
|
Service已经绑定一个SLB,不能再绑定另一个SLB。 解决方案:不支持通过更改 |
当Service类型为NodePort时,如何为Service配置监听?
CCM仅支持为LoadBalancer的Service配置监听。您需要将Service类型从NodePort修改为LoadBalancer。
如何访问NodePort类型的Service?
-
如果在集群内(集群节点内)访问,您可以使用ClusterIP+Port,或者节点IP+Service中NodePort端口访问Service。默认的NodePort端口会大于30000。
-
如果在集群外(集群节点外)访问,您可以使用节点IP+Service中NodePort端口访问Service。默认的NodePort端口会大于30000。
-
如果在VPC外部(其他VPC或者公网)访问,您需要发布LoadBalancer类型的Service,然后通过Service的外部端点访问Service。
说明
如果您的Service设置了外部流量转发策略为本地,请确保被访问的节点上存在Service后端Pod。关于更多外部流量策略,请参见外部流量策略功能对比。
如何正确配置NodePort范围?
在Kubernetes中,APIServer提供了ServiceNodePortRange参数(命令行参数 --service-node-port-range
),该参数是用于限制NodePort或LoadBalancer类型的Service在节点上所监听的NodePort端口范围,该参数默认值为30000~32767。在ACK Pro集群中,您可以通过自定义Pro集群的管控面参数修改该端口范围。具体操作,请参见自定义ACK Pro集群的管控面参数。
-
您在修改NodePort端口范围时必须十分谨慎。务必保证NodePort端口范围与集群节点上Linux内核提供的
net.ipv4.ip_local_port_range
参数中的端口范围不冲突。该内核参数ip_local_port_range
控制了Linux系统上任意应用程序可以使用的本地端口号范围。ip_local_port_range
的默认值为32768~60999。 -
您所创建的ACK集群在默认配置情况下,ServiceNodePortRange参数和
ip_local_port_range
参数不会产生冲突。如果您此前为了提升端口数量限制调整了这两个参数中任意一个,导致两者范围出现重合,则可能会产生节点上的偶发网络异常,严重时会导致业务健康检查失败、集群节点离线等。建议您恢复默认值或同时调整两个端口范围到完全不重合。 -
调整端口范围后,集群中可能存在部分NodePort或LoadBalancer类型的Service仍在使用
ip_local_port_range
参数端口范围内的端口作为NodePort。此时您需要对这部分Service进行重新配置以避免冲突,可通过kubectl edit
的方式直接将spec.ports.nodePort
字段的值更改为未被占用的NodePort。
相关文档
-
Service异常问题排查
-
Service的负载均衡配置注意事项
-
通过Annotation配置传统型负载均衡CLB
-
Cloud Controller Manager
内容没看懂? 不太想学习?想快速解决? 有偿解决: 联系专家
阿里云企业补贴进行中: 马上申请
腾讯云限时活动1折起,即将结束: 马上收藏
同尘科技为腾讯云授权服务中心。
购买腾讯云产品享受折上折,更有现金返利:同意关联,立享优惠
转转请注明出处:https://www.yunxiaoer.com/168481.html