创建负载均衡类型的服务
操作场景
负载均衡(LoadBalancer)类型的服务可以通过弹性负载均衡(ELB)从公网访问到工作负载,与弹性IP方式相比提供了高可靠的保障。负载均衡访问方式由公网弹性负载均衡服务地址以及设置的访问端口组成,例如“10.117.117.117:80”。
在访问负载均衡类型的服务时,从ELB过来的流量会先访问到节点,然后通过Service转发到Pod。
在使用CCE Turbo集群 + 独享型ELB实例时,支持ELB直通Pod,使部署在容器中的业务时延降低、性能无损耗。
从集群外部访问时,从ELB直接转发到Pod;集群内部访问可通过Service转发到Pod。
约束与限制
- CCE中的负载均衡(LoadBalancer)访问类型使用弹性负载均衡 ELB提供网络访问,存在如下产品约束:
- 自动创建的ELB实例建议不要被其他资源使用,否则会在删除时被占用,导致资源残留。
- v1.15及之前版本集群使用的ELB实例请不要修改监听器名称,否则可能导致无法正常访问。
- 创建Service后,如果服务亲和从集群级别切换为节点级别,连接跟踪表将不会被清理,建议用户创建Service后不要修改服务亲和属性,如需修改请重新创建Service。
- 当服务亲和设置为节点级别(即externalTrafficPolicy为local)时,集群内部可能使用ELB地址访问不通,具体情况请参见集群内无法访问Service的说明。
- CCE Turbo集群仅支持集群级别服务亲和。
- 独享型ELB仅支持1.17及以上集群。
- 独享型ELB规格必须支持网络型(TCP/UDP),且网络类型必须支持私网(有私有IP地址)。如果需要Service支持HTTP,则独享型ELB规格需要为网络型(TCP/UDP)和应用型(HTTP/HTTPS)。
- 使用CCE集群时,如果LoadBalancer类型Service的服务亲和类型为集群级别(Cluster),当请求进入到集群时,会使用SNAT分发到各个节点的节点端口(nodeport),不能超过节点可用的nodeport数量,而服务亲和为节点级别(Local)则无此约束。使用CCE Turbo集群时,如果是使用共享型ELB依然有此约束,而独享型ELB无此约束,建议使用CCE Turbo时配合使用独享型ELB。
- 集群服务转发模式为IPVS时,不支持配置节点的IP作为Service的externalIP,会导致节点不可用。
- IPVS模式集群下,Ingress和Service使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress,因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,Ingress对接的ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service使用不同ELB实例。
创建LoadBalancer类型Service
- 登录CCE控制台,单击集群名称进入集群。
- 在左侧导航栏中选择“服务”,在右上角单击“创建服务”。
- 设置参数。
- Service名称:自定义服务名称,可与工作负载名称保持一致。
- 访问类型:选择“负载均衡 LoadBalancer”。
- 命名空间:工作负载所在命名空间。
- 服务亲和:详情请参见服务亲和(externalTrafficPolicy)。
- 集群级别:集群下所有节点的IP+访问端口均可以访问到此服务关联的负载,服务访问会因路由跳转导致一定性能损失,且无法获取到客户端源IP。
- 节点级别:只有通过负载所在节点的IP+访问端口才可以访问此服务关联的负载,服务访问没有因路由跳转导致的性能损失,且可以获取到客户端源IP。
- 选择器:添加标签,Service根据标签选择Pod,填写后单击“确认添加”。也可以引用已有工作负载的标签,单击“引用负载标签”,在弹出的窗口中选择负载,然后单击“确定”。
- 负载均衡器:
选择对接的ELB实例,仅支持与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。
CCE控制台支持自动创建ELB实例,在下拉框选择“自动创建”,并填写以下参数:- 实例名称:请填写ELB名称。
- 公网访问:开启后,将创建 5 Mbit/s 带宽的弹性公网 IP。
- 可用区、子网和规格(仅独享型ELB实例支持选择):设置独享型ELB的可用区、子网和规格。当前仅支持自动创建网络型(TCP/UDP)独享型ELB实例。
- 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
- 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。
您可以单击负载均衡配置的“编辑”图标配置ELB实例的参数,在弹出窗口中配置ELB实例的参数。
- 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。
- 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
- 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
- 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
- 会话保持类型:默认不启用,可选择“源IP地址”。基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
当分配策略使用源IP算法时,不支持设置会话保持。
- 健康检查:设置负载均衡的健康检查配置。
- 全局检查:全局检查仅支持使用相同协议的端口,无法对多个使用不同协议的端口生效,建议使用“自定义检查”。
- 自定义检查:在端口配置中对多种不同协议的端口设置健康检查。关于自定义检查的YAML定义,请参见指定多个端口配置健康检查。
表1 健康检查参数 参数
说明
协议
当端口配置协议为TCP时,支持TCP和HTTP协议;当端口配置协议为UDP时,支持UDP协议。
- 检查路径(仅HTTP健康检查协议支持):指定健康检查的URL地址。检查路径只能以/开头,长度范围为1-80。
端口
健康检查默认使用业务端口(Service的NodePort和容器端口)作为健康检查的端口;您也可以重新指定端口用于健康检查,重新指定端口会为服务增加一个名为cce-healthz的服务端口配置。
- 节点端口:使用共享型负载均衡或不关联ENI实例时,节点端口作为健康检查的检查端口;如不指定将随机一个端口。取值范围为30000-32767。
- 容器端口:使用独享型负载均衡关联ENI实例时,容器端口作为健康检查的检查端口。取值范围为1-65535。
检查周期(秒)
每次健康检查响应的最大间隔时间,取值范围为1-50。
超时时间(秒)
每次健康检查响应的最大超时时间,取值范围为1-50。
最大重试次数
健康检查最大的重试次数,取值范围为1-10。
- 端口配置:
- 协议:请根据业务的协议类型选择。
- 服务端口:Service使用的端口,端口范围为1-65535。
- 容器端口:工作负载程序实际监听的端口,需用户确定。例如nginx默认使用80端口。
- 健康检查:健康检查选项设置为“自定义检查”时,可以为不同协议的端口配置健康检查,参数说明请参见表1。
在创建LoadBalancer类型Service时,会自动生成一个随机节点端口号(NodePort)。
- 注解:LoadBalancer类型Service有一些CCE定制的高级功能,通过注解annotations实现,具体注解的内容请参见使用Annotation配置负载均衡。
- 单击“确定”,创建Service。
通过kubectl命令行创建-使用已有ELB
您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现负载均衡 ( LoadBalancer )访问的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建并编辑nginx-deployment.yaml以及nginx-elb-svc.yaml文件。
其中,nginx-deployment.yaml和nginx-elb-svc.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yaml
apiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx imagePullSecrets: - name: default-secret
vi nginx-elb-svc.yaml
若需要开启会话保持,需要满足如下条件:
- 工作负载协议为TCP。
- 工作负载的各实例已设置反亲和部署,即所有的实例都部署在不同节点上。具体请参见调度策略(亲和与反亲和)。
apiVersion: v1 kind: Service metadata: name: nginx annotations: kubernetes.io/elb.id: <your_elb_id> # ELB ID,替换为实际值 kubernetes.io/elb.class: # 负载均衡器类型 kubernetes.io/elb.lb-algorithm: ROUND_ROBIN # 负载均衡器算法 kubernetes.io/elb.session-affinity-mode: SOURCE_IP # 会话保持类型为源IP kubernetes.io/elb.session-affinity-option: '{"persistence_timeout": "30"}' # 会话保持时间(分钟) kubernetes.io/elb.health-check-flag: 'on' # 开启ELB健康检查功能 kubernetes.io/elb.health-check-option: '{ "protocol":"TCP", "delay":"5", "timeout":"10", "max_retries":"3" }' spec: selector: app: nginx ports: - name: service0 port: 80 #访问Service的端口,也是负载均衡上的监听器端口。 protocol: TCP targetPort: 80 #Service访问目标容器的端口,此端口与容器中运行的应用强相关 nodePort: 31128 #节点的端口号,如不指定,将在30000-32767范围内随机生成一个端口号 type: LoadBalancer
上述示例通过Annotation(注解)实现负载均衡的一些高级功能,例如会话保持、健康检查等,对应的说明请参见表2。
除本示例中的功能外,如需了解更多高级功能相关注解及示例,请参见使用Annotation配置负载均衡。
表2 annotations参数 参数
是否必填
参数类型
描述
kubernetes.io/elb.id
是
String
为负载均衡实例的ID。
在关联已有ELB时:必填。
获取方法:
在控制台的“服务列表”中,单击“网络 > 弹性负载均衡 ELB”,单击ELB的名称,在ELB详情页的“基本信息”页签下找到“ID”字段复制即可。
说明:系统优先根据kubernetes.io/elb.id注解对接ELB,若此字段未指定,则会根据spec.loadBalancerIP字段(非必填,且仅1.23及以前版本可用)对接ELB。
请尽量不要使用spec.loadBalancerIP字段对接ELB,该字段在将来的集群版本中会被Kubernetes官方废弃,详情请参见Deprecation。
kubernetes.io/elb.class
是
String
请根据不同的应用场景和功能需求选择合适的负载均衡器类型。
取值如下:
- performance:独享型负载均衡,仅支持1.17及以上集群。
说明:负载均衡类型的服务对接已有的独享型ELB时,该独享型ELB必须支持网络型(TCP/UDP)规格。
kubernetes.io/elb.lb-algorithm
否
String
后端云服务器组的负载均衡算法,默认值为“ROUND_ROBIN”。
取值范围:
- ROUND_ROBIN:加权轮询算法。
- LEAST_CONNECTIONS:加权最少连接算法。
- SOURCE_IP:源IP算法。
说明:当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的权重设置(weight字段)无效,且不支持开启会话保持。
kubernetes.io/elb.session-affinity-mode
否
String
支持基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
- 不启用:不填写该参数。
- 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。
说明:当kubernetes.io/elb.lb-algorithm设置为“SOURCE_IP”(源IP算法)时,不支持开启会话保持。
kubernetes.io/elb.session-affinity-option
否
表3 Object
ELB会话保持配置选项,可设置会话保持的超时时间。
kubernetes.io/elb.health-check-flag
否
String
是否开启ELB健康检查功能。
- 开启:空值或"on"
- 关闭:"off"
开启时需同时填写kubernetes.io/elb.health-check-option字段。
kubernetes.io/elb.health-check-option
否
表4 Object
ELB健康检查配置选项。
- 创建工作负载。
kubectl create -f nginx-deployment.yaml
回显如下,表示工作负载已创建完成。
deployment/nginx created
kubectl get pod
回显如下,工作负载状态为Running状态,表示工作负载已运行中。
NAME READY STATUS RESTARTS AGE nginx-2601814895-c1xhw 1/1 Running 0 6s
- 创建服务。
kubectl create -f nginx-elb-svc.yaml
回显如下,表示服务已创建。
service/nginx created
kubectl get svc
回显如下,表示工作负载访问方式已设置成功,工作负载可访问。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3d nginx LoadBalancer 10.247.130.196 10.78.42.242 80:31540/TCP 51s
- 在浏览器中输入访问地址,例如输入10.78.42.242:80。10.78.42.242为负载均衡实例IP地址,80为对应界面上的访问端口。
可成功访问nginx。
图3 通过负载均衡访问nginx
通过kubectl命令行创建-自动创建ELB
您可以在创建工作负载时通过kubectl命令行设置Service访问方式。本节以nginx为例,说明kubectl命令实现负载均衡 ( LoadBalancer )访问的方法。
- 请参见通过kubectl连接集群,使用kubectl连接集群。
- 创建并编辑nginx-deployment.yaml以及nginx-elb-svc.yaml文件。
其中,nginx-deployment.yaml和nginx-elb-svc.yaml为自定义名称,您可以随意命名。
vi nginx-deployment.yamlapiVersion: apps/v1 kind: Deployment metadata: name: nginx spec: replicas: 1 selector: matchLabels: app: nginx template: metadata: labels: app: nginx spec: containers: - image: nginx name: nginx imagePullSecrets: - name: default-secret
vi nginx-elb-svc.yaml
若需要开启会话保持,需要满足如下条件:
- 工作负载协议为TCP。
- 工作负载的各实例已设置反亲和部署,即所有的实例都部署在不同节点上。具体请参见调度策略(亲和与反亲和)。
独享型负载均衡(公网访问)Service示例 - 仅支持1.17及以上集群:apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx namespace: default annotations: kubernetes.io/elb.class: performance kubernetes.io/elb.autocreate: '{ "type": "public", "bandwidth_name": "cce-bandwidth-1626694478577", "bandwidth_chargemode": "bandwidth", "bandwidth_size": 5, "bandwidth_sharetype": "PER", "eip_type": "5_bgp", "elb_virsubnet_ids": ["*****"], "available_zone": [ "" ], "l4_flavor_name": "L4_flavor.elb.s1.small" }' kubernetes.io/elb.enterpriseID: '0' # 负载均衡所属企业项目ID kubernetes.io/elb.lb-algorithm: ROUND_ROBIN # 负载均衡器算法 kubernetes.io/elb.session-affinity-mode: SOURCE_IP # 会话保持类型为源IP kubernetes.io/elb.session-affinity-option: '{"persistence_timeout": "30"}' # 会话保持时间(分钟) kubernetes.io/elb.health-check-flag: 'on' # 开启ELB健康检查功能 kubernetes.io/elb.health-check-option: '{ "protocol":"TCP", "delay":"5", "timeout":"10", "max_retries":"3" }' spec: selector: app: nginx ports: - name: cce-service-0 targetPort: 80 nodePort: 0 port: 80 protocol: TCP type: LoadBalancer
上述示例通过Annotation(注解)实现负载均衡的一些高级功能,例如会话保持、健康检查等,对应的说明请参见表5。
除本示例中的功能外,如需了解更多高级功能相关注解及示例,请参见使用Annotation配置负载均衡。
表5 annotations参数 参数
是否必填
参数类型
描述
kubernetes.io/elb.class
是
String
请根据不同的应用场景和功能需求选择合适的负载均衡器类型。
取值如下:
- performance:独享型负载均衡,仅支持1.17及以上集群。
kubernetes.io/elb.autocreate
是
elb.autocreate object
自动创建service关联的ELB
示例:
kubernetes.io/elb.subnet-id
-
String
为集群所在子网的ID,取值范围:1-100字符。
- Kubernetes v1.11.7-r0及以下版本的集群自动创建时为必填参数。
- Kubernetes v1.11.7-r0以上版本的集群:可不填。
kubernetes.io/elb.enterpriseID
否
String
v1.15及以上版本的集群支持此字段,v1.15以下版本默认创建到default项目下。
为ELB企业项目ID,选择后可以直接创建在具体的ELB企业项目下。
该字段不传(或传为字符串'0'),则将资源绑定给默认企业项目。
获取方法:
登录控制台后,单击顶部菜单右侧的“企业 > 项目管理”,在打开的企业项目列表中单击要加入的企业项目名称,进入企业项目详情页,找到“ID”字段复制即可。
kubernetes.io/elb.lb-algorithm
否
String
后端云服务器组的负载均衡算法,默认值为“ROUND_ROBIN”。
取值范围:
- ROUND_ROBIN:加权轮询算法。
- LEAST_CONNECTIONS:加权最少连接算法。
- SOURCE_IP:源IP算法。
说明:当该字段的取值为SOURCE_IP时,后端云服务器组绑定的后端云服务器的权重设置(weight字段)无效,且不支持开启会话保持。
kubernetes.io/elb.session-affinity-mode
否
String
支持基于源IP地址的简单会话保持,即来自同一IP地址的访问请求转发到同一台后端服务器上。
- 不启用:不填写该参数。
- 开启会话保持:需增加该参数,取值“SOURCE_IP”,表示基于源IP地址。
说明:当kubernetes.io/elb.lb-algorithm设置为“SOURCE_IP”(源IP算法)时,不支持开启会话保持。
kubernetes.io/elb.session-affinity-option
否
表3 Object
ELB会话保持配置选项,可设置会话保持的超时时间。
kubernetes.io/elb.health-check-flag
否
String
是否开启ELB健康检查功能。
- 开启:“(空值)”或“on”
- 关闭:“off”
开启时需同时填写kubernetes.io/elb.health-check-option字段。
kubernetes.io/elb.health-check-option
否
表4 Object
ELB健康检查配置选项。
表6 elb.autocreate字段数据结构说明 参数
是否必填
参数类型
描述
name
否
String
自动创建的负载均衡的名称。
取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。
默认名称:cce-lb+service.UID
type
否
String
负载均衡实例网络类型,公网或者私网。
- public:公网型负载均衡
- inner:私网型负载均衡
默认类型:inner
bandwidth_name
公网型负载均衡必填
String
带宽的名称,默认值为:cce-bandwidth-******。
取值范围:只能由中文、英文字母、数字、下划线、中划线、点组成,且长度范围为1-64个字符。
bandwidth_chargemode
否
String
带宽模式。
- bandwidth:按带宽
- traffic:按流量
默认类型:bandwidth
bandwidth_size
公网型负载均衡必填
Integer
带宽大小,默认1Mbit/s~2000Mbit/s,请根据Region带宽支持范围设置。
调整带宽时的最小单位会根据带宽范围不同存在差异。- 小于等于300Mbit/s:默认最小单位为1Mbit/s。
- 300Mbit/s~1000Mbit/s:默认最小单位为50Mbit/s。
- 大于1000Mbit/s:默认最小单位为500Mbit/s。
bandwidth_sharetype
公网型负载均衡必填
String
带宽共享方式。
- PER:独享带宽
eip_type
公网型负载均衡必填
String
弹性公网IP类型。
- 5_bgp:全动态BGP
具体类型以各区域配置为准,详情请参见弹性公网IP控制台。
available_zone
是
Array of strings
负载均衡所在可用区。
独享型负载均衡器独有字段。
l4_flavor_name
是
String
四层负载均衡实例规格名称。
- 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
- 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。
独享型负载均衡器独有字段。
l7_flavor_name
否
String
七层负载均衡实例规格名称。
- 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
- 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。
独享型负载均衡器独有字段,必须与l4_flavor_name对应规格的类型一致,即都为弹性规格或都为固定规格。
elb_virsubnet_ids
否
Array of strings
负载均衡后端所在子网,不填默认为集群子网。不同实例规格将占用不同数量子网IP,不建议使用其他资源(如集群,节点等)的子网网段。
独享型负载均衡器独有字段。
示例:
"elb_virsubnet_ids": [ "14567f27-8ae4-42b8-ae47-9f847a4690dd" ]
- 创建工作负载。
kubectl create -f nginx-deployment.yaml
回显如下,表示工作负载已开始创建。
deployment/nginx created
kubectl get pod
回显如下,工作负载状态为Running状态,表示工作负载已运行中。
NAME READY STATUS RESTARTS AGE nginx-2601814895-c1xhw 1/1 Running 0 6s
- 创建服务。
kubectl create -f nginx-elb-svc.yaml
回显如下,表示服务已创建。
service/nginx created
kubectl get svc
回显如下,表示工作负载访问方式已设置成功,工作负载可访问。
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE kubernetes ClusterIP 10.247.0.1 <none> 443/TCP 3d nginx LoadBalancer 10.247.130.196 10.78.42.242 80:31540/TCP 51s
- 在浏览器中输入访问地址,例如输入10.78.42.242:80。10.78.42.242为负载均衡实例IP地址,80为对应界面上的访问端口。
可成功访问nginx。
图4 通过负载均衡访问nginx