通过控制台创建ELB Ingress
Ingress是Kubernetes中的一种资源对象,用来管理集群外部访问集群内部服务的方式。您可以通过Ingress资源来配置不同的转发规则,从而根据转发规则访问集群内Pod。本文以Nginx工作负载为例,为您介绍如何使用控制台创建ELB Ingress。
前提条件
- 集群中需提前部署可用的工作负载用于对外提供访问。若您无可用工作负载,可参考创建无状态负载(Deployment)、创建有状态负载(StatefulSet)或创建守护进程集(DaemonSet)部署工作负载。
- 为提供对外访问的工作负载配置Service,ELB Ingress支持的Service类型请参见ELB Ingress支持的Service类型。
约束与限制
- 建议其他资源不要使用Ingress自动创建的ELB实例,否则在删除Ingress时,ELB实例会被占用,导致资源残留。
- 添加Ingress后请在CCE页面对所选ELB实例进行配置升级和维护,不可在ELB页面对配置进行更改,否则可能导致Ingress服务异常。
- Ingress转发策略中注册的URL需与后端应用提供访问的URL一致,否则将返回404错误。
- IPVS模式集群下,Ingress和Service(或不同集群Service不同端口)使用相同ELB实例时,无法在集群内的节点和容器中访问Ingress(或其他集群的Service),因为kube-proxy会在ipvs-0的网桥上挂载LB类型的Service地址,ELB的流量会被ipvs-0网桥劫持。建议Ingress和Service(或不同集群的Service)使用不同ELB实例。
- 请勿将Ingress与使用HTTP的Service对接同一个ELB下的同一个监听器,否则将产生端口冲突。
- 独享型ELB规格必须支持应用型(HTTP/HTTPS),且网络类型必须支持私网(有私有IP地址)。
- 同集群使用多个Ingress对接同一个ELB端口时,监听器的配置项(例如监听器关联的证书、监听器HTTP2属性等)均以首次创建监听器的Ingress配置为准。
添加ELB Ingress
本节以nginx作为工作负载并添加ELB Ingress为例进行说明。
- 登录CCE控制台,单击集群名称进入集群。
- 选择左侧导航栏的“服务”,在右侧选择“路由”页签,单击右上角“创建路由”。
- 设置Ingress参数。
- 名称:自定义Ingress名称,例如ingress-demo。
- 对接Nginx:此选项只有在安装了NGINX Ingress控制器插件后才会显示。如显示了“对接Nginx”,则说明您安装了NGINX Ingress控制器插件,创建ELB Ingress时不能打开该项开关,如果打开则是使用Nginx Ingress Controller,具体请参见通过控制台创建Nginx Ingress。
- 负载均衡器:选择弹性负载均衡的类型、创建方式。
ELB类型可选择“独享型”或“共享型”。独享型ELB规格需要支持应用型(HTTP/HTTPS),且网络类型必须支持私网。
创建方式可选择“选择已有”或“自动创建”。不同创建方式的配置详情请参见表1。当集群使用共享VPC时,不支持自动创建共享型ELB。
表1 ELB配置 创建方式
配置
选择已有
仅支持选择与集群在同一个VPC下的ELB实例。如果没有可选的ELB实例,请单击“创建负载均衡器”跳转到ELB控制台创建。
自动创建
- 实例名称:请填写ELB名称。
- 企业项目:该参数仅对开通企业项目的企业客户账号显示。企业项目是一种云资源管理方式,企业项目管理服务提供统一的云资源按项目管理,以及项目内的资源管理、成员管理。
- 可用区(仅独享型ELB支持):可以选择在多个可用区创建负载均衡实例,提高服务的可用性。如果业务需要考虑容灾能力,建议选择多个可用区。
- 前端子网(仅独享型ELB支持):用于分配ELB实例对外服务的IP地址。
- 后端子网(仅独享型ELB支持):用于与后端服务建立连接的IP地址。
- 网络型规格/应用型规格/规格(仅独享型ELB支持):
- 弹性规格:适用于业务用量波动较大的场景,按实际使用量收取每小时使用的容量费用。v1.21.10-r10、v1.23.8-r10、v1.25.3-r10及以上版本集群支持使用弹性规格。
- 固定规格:适用于业务用量较为稳定的场景,按固定规格折算收取每小时使用的容量费用。
- 弹性公网IP:选择“自动创建”时,可配置公网带宽的计费方式及带宽大小。
- 资源标签:通过为资源添加标签,可以对资源进行自定义标记,实现资源的分类。您可以在TMS中创建“预定义标签”,预定义标签对所有支持标签功能的服务资源可见,通过使用预定义标签可以提升标签创建和迁移效率。
- 全域弹性公网(仅独享型ELB支持):选择绑定全域弹性公网IP实例,实现公网带宽资源在实例间分配与使用,控制全域弹性公网IP与公网间通信的速率。关于全域弹性公网更多信息,请参见全域公网带宽概述。
- 监听器配置:Ingress为负载均衡器配置监听器,监听器对负载均衡器上的请求进行监听,并分发流量。配置完成后ELB实例侧将会创建对应的监听器,名称默认为k8s_<协议类型>_<端口号>,例如“k8s_HTTP_80”。
- 前端协议:支持HTTP和HTTPS。
- 对外端口:开放在负载均衡服务地址的端口,可任意指定。
- 访问控制:
- 继承ELB已有配置:CCE不对ELB侧已有的访问控制进行修改。
- 允许所有IP访问:不设置访问控制。
- 白名单:仅所选IP地址组可以访问ELB地址。
- 黑名单:所选IP地址组无法访问ELB地址。
- 证书来源:支持TLS密钥和ELB服务器证书。
- TLS密钥:创建密钥证书的方法请参见创建密钥。
- ELB服务器证书:使用在ELB服务中创建的证书。
- 服务器证书:负载均衡器创建HTTPS协议监听时需要绑定证书,以支持HTTPS数据传输加密认证。
同一个ELB实例的同一个端口配置HTTPS时,一个监听器只支持配置一个密钥证书。若使用两个不同的密钥证书将两个Ingress添加到同一个ELB下的同一个监听器,ELB侧实际只生效最先添加的证书。
- SNI:SNI(Server Name Indication)是TLS的扩展协议,在该协议下允许同一个IP地址和端口号下对外提供多个基于TLS的访问域名,且不同的域名可以使用不同的安全证书。开启SNI后,允许客户端在发起TLS握手请求时就提交请求的域名信息。负载均衡收到TLS请求后,会根据请求的域名去查找证书:若找到域名对应的证书,则返回该证书认证鉴权;否则,返回缺省证书(服务器证书)认证鉴权。
- 当选择HTTPS协议时,才支持配置“SNI”选项。
- 该功能仅支持1.15.11及以上版本的集群。
- 用于SNI的证书需要指定域名,每个证书只能指定一个域名。支持泛域名证书。
- 对接到同一个ELB端口的ingress,请勿配置域名相同但证书不同的SNI,否则将会被覆盖。
- 安全策略:安全策略包含HTTPS可选的TLS协议版本和配套的加密算法套件。
关于安全策略的详细说明,请参见安全策略。
- 选择HTTPS协议时,才支持配置“安全策略”选项。
- 该功能仅支持1.17.9及以上版本的集群。
- 后端协议:
当监听器配置为HTTP协议时,仅可选择“HTTP”。
当监听器配置为HTTPS协议时,可选择“HTTP”、“HTTPS”或“GRPC”。仅独享型ELB支持选择GRPC协议,且需开启HTTP/2,系统将自动为您添加kubernetes.io/elb.http2-enable:true注解。当前GRPC功能仅在部分区域开放,请以控制台呈现为准。
- 高级配置:
配置
说明
使用限制
获取监听器端口号
开启后可以将ELB实例的监听端口从报文的HTTP头中带到后端云服务器。
独享型ELB实例支持配置。
获取客户端请求端口号
开启后可以将客户端的源端口从报文的HTTP头中带到后端云服务器。
独享型ELB实例支持配置。
重写X-Forwarded-Host
开启后将以客户端请求头的Host重写X-Forwarded-Host传递到后端云服务器。
独享型ELB实例支持配置。
数据压缩
开启将对特定文件类型进行压缩;关闭则不会对任何文件类型进行压缩。
独享型ELB实例支持配置。
空闲超时时间
客户端连接空闲超时时间。在超过空闲超时时间一直没有请求, 负载均衡会暂时中断当前连接,直到下一次请求时重新建立新的连接。
-
请求超时时间
等待客户端请求超时时间。包括两种情况:
- 读取整个客户端请求头的超时时长,如果客户端未在超时时长内发送完整个请求头,则请求将被中断。
- 两个连续body体的数据包到达LB的时间间隔,超出请求超时时间将会断开连接。
-
响应超时时间
等待后端服务器响应超时时间。请求转发后端服务器后,在等待超过响应超时时间没有响应,负载均衡将终止等待,并返回 HTTP504错误码。
-
开启HTTP2
客户端与ELB之间的HTTPS请求的HTTP2功能的开启状态。 开启后,可提升客户端与ELB间的访问性能,但ELB与后端服务器间仍采用HTTP1.X协议。
当监听器配置为HTTPS协议时支持配置。
- 重定向至HTTPS:前端协议选择使用HTTP时,支持重定向至HTTPS。开启后可单击“修改”,对HTTPS协议的端口进行配置,详细配置说明请参见HTTPS协议的监听器配置。
- 灰度发布:路由创建完成后,可在路由操作列中创建灰度发布策略。详情请参见为ELB Ingress配置灰度发布章节。
- 转发策略配置:请求的访问地址与转发规则匹配时(转发规则由域名、URL组成,例如:10.117.117.117:80/helloworld),此请求将被转发到对应的目标Service处理。单击按钮可添加多条转发策略。
- 域名:实际访问的域名地址,不配置时可通过IP地址访问Ingress。请确保所填写的域名已注册并备案,一旦配置了域名规则后,必须使用域名访问。
- 路径匹配规则:
- 前缀匹配:例如映射URL为/healthz,只要符合此前缀的URL均可访问。例如/healthz/v1,/healthz/v2。
- 精确匹配:表示只有URL完全匹配时,访问才能生效。例如映射URL为/healthz,则必须为此URL才能访问。
- 正则匹配:按正则表达式方式匹配URL。例如正则表达式为/[A-Za-z0-9_.-]+/test。只要符合此规则的URL均可访问,例如/abcA9/test,/v1-Ab/test。正则匹配规则支持POSIX与Perl两种标准。
- 路径:需要注册的访问路径,例如:/healthz。
此处添加的访问路径要求后端应用内存在相同的路径,否则转发无法生效。
例如,Nginx应用默认的Web访问路径为“/usr/share/nginx/html”,在为Ingress转发策略添加“/test”路径时,需要应用的Web访问路径下也包含相同路径,即“/usr/share/nginx/html/test”,否则将返回404。
- 目标服务名称:请选择已有Service或新建Service。页面列表中的查询结果已自动过滤不符合要求的Service。
- 目标服务访问端口:可选择目标Service的访问端口。
- 负载均衡配置:
- 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。
- 加权轮询算法:根据后端服务器的权重,按顺序依次将请求分发给不同的服务器。它用相应的权重表示服务器的处理性能,按照权重的高低以及轮询方式将请求分配给各服务器,相同权重的服务器处理相同数目的连接数。常用于短连接服务,例如HTTP等服务。
- 加权最少连接:最少连接是通过当前活跃的连接数来估计服务器负载情况的一种动态调度算法。加权最少连接就是在最少连接数的基础上,根据服务器的不同处理能力,给每个服务器分配不同的权重,使其能够接受相应权值数的服务请求。常用于长连接服务,例如数据库连接等服务。
- 源IP算法:将请求的源IP地址进行Hash运算,得到一个具体的数值,同时对后端服务器进行编号,按照运算结果将请求分发到对应编号的服务器上。这可以使得对不同源IP的访问进行负载分发,同时使得同一个客户端IP的请求始终被派发至某特定的服务器。该方式适合负载均衡无cookie功能的TCP协议。
- 会话保持类型:默认不启用。支持以下类型:
- 负载均衡器cookie:同时需填写“会话保持时间”,范围为1-1440分钟。
- 应用程序cookie:仅共享型ELB支持设置。同时需填写“cookie名称”,长度范围为1-64。
- 当分配策略使用源IP算法时,不支持设置会话保持。
- 1.21 以下集群的独享型负载均衡无法使用会话保持能力,如果需要使用会话保持能力,推荐使用共享型负载均衡。
- 健康检查:设置负载均衡的健康检查配置,启用时支持以下配置。
参数
说明
协议
当目标服务端口配置协议为TCP时,支持TCP/HTTP/GRPC协议。仅独享型ELB支持选择GRPC协议。当前GRPC功能仅在部分区域开放,请以控制台呈现为准。
- 检查路径(仅HTTP/GRPC健康检查协议支持):指定健康检查的URL地址。检查路径只能以/开头,长度范围为1-80。
端口
健康检查默认使用业务端口(Service的NodePort或容器端口)作为健康检查的端口;您也可以重新指定端口用于健康检查,重新指定端口会为服务增加一个名为cce-healthz的服务端口配置。
- 节点端口:使用共享型负载均衡或不关联ENI实例时,节点端口作为健康检查的检查端口;如不指定将随机一个端口。取值范围为30000-32767。
- 容器端口:使用独享型负载均衡关联ENI实例时,容器端口作为健康检查的检查端口。取值范围为1-65535。
检查周期(秒)
每次健康检查响应的最大间隔时间,取值范围为1-50。
超时时间(秒)
每次健康检查响应的最大超时时间,取值范围为1-50。
最大重试次数
健康检查最大的重试次数,取值范围为1-10。
- 分配策略:可选择加权轮询算法、加权最少连接或源IP算法。
- 操作:可单击“删除”按钮删除该配置。
- 执行动作:支持“重定向至URL”和“重写URL”,仅独享型ELB支持。
- 重定向至URL:当访问请求满足转发策略时,会将请求重定向至指定的URL,并返回指定的状态码。
- 重写URL:当访问请求满足转发策略时,会根据匹配规则重写URL路径。支持使用正则表达式匹配的结果作为重写路径,您需要选择路径匹配规则为“正则匹配”。例如,转发规则中的URL配置为正则表达式/first/(.*)/(.*)/end,重写路径配置为/${1}/${2}。当客户端发送请求的路径为/first/aaa/bbb/end时,转发规则会匹配到/first/(.*)/(.*)/end,重写路径中的${1}会替换为aaa,${2}会替换为bbb,最终后端服务器接收到的请求路径为/aaa/bbb。
- 注解:Ingress有一些CCE定制的高级功能,通过注解annotations实现。在使用kubectl创建时,会用到注解,具体请参见添加Ingress时自动创建ELB和添加Ingress时对接已有ELB。
- 配置完成后,单击“确定”。创建完成后,在Ingress列表可查看到已添加的Ingress。
在ELB控制台可查看通过CCE自动创建的ELB,名称默认为“cce-lb-<ingress.UID>”。单击ELB名称进入详情页,在“监听器”页签下即可查看Ingress对应的监听器及转发策略。
Ingress创建后请在CCE页面对所选ELB实例进行配置升级和维护,不要在ELB控制台对ELB实例进行维护,否则可能导致Ingress服务异常。
图1 ELB路由设置
- 访问工作负载(例如名称为defaultbackend)的“/healthz”接口。
- 获取工作负载“/healthz”接口的访问地址。访问地址由负载均衡实例IP、对外端口、映射URL组成,例如:10.**.**.**:80/healthz。
- 在浏览器中输入“/healthz”接口的访问地址,如:http://10.**.**.**:80/healthz,即可成功访问工作负载,如图2。
相关操作
由于社区Ingress结构体中没有property属性,用户使用client-go调用创建ingress的api接口时,创建的Ingress中没有property属性。为了与社区的client-go兼容,CCE提供了相关解决方案,具体请参见Ingress中的property字段如何实现与社区client-go兼容?。