使用ALB Ingress时,您需要在集群中创建多种资源以配置由ALB Ingress到后端Pod的完整转发路径。您可以参考本文快速部署示例后端应用,并创建ALB Ingress以对外提供服务。
阅读前提示
阅读本文前,推荐您阅读ALB Ingress概述以了解ALB Ingress的基本概念。
使用限制
如果您使用的是Flannel网络插件,则ALB Ingress后端Service服务仅支持NodePort和LoadBalancer类型。
AlbConfig、Namespace、Ingress和Service这些资源的名称不能以aliyun开头。
低版本Nginx Ingress Controller无法识别Ingress资源中的
spec:ingressClassName
字段。如果集群中同时存在Nginx Ingress和ALB Ingress,会存在Ingress资源被低版本Nginx Ingress Controller调谐的风险。因此,请及时升级Nginx Ingress Controller版本,或通过Annotation注解项指定ALB Ingress对应的ingressClass。具体操作,请参见升级Nginx Ingress Controller组件或ALB Ingress服务高级用法。
场景示例
本教程以四个部署了Nginx的Pod为例,演示如何通过配置ALB Ingress,实现相同域名不同URL路径的流量转发。
前端请求 | 流量转发至 |
|
|
|
|
前提条件
步骤一:安装ALB Ingress Controller组件
使用ALB Ingress前,请安装ALB Ingress Controller组件。
创建集群时安装
创建ACK托管集群或ACK专有集群时,在Ingress参数配置区域,选择安装ALB Ingress。
您可以为ALB云原生网关实例来源选择新建,使用已有或暂不创建选项。这三种选项的对比如下:
如果选择新建或使用已有,则会在安装ALB Ingress Controller组件后自动创建AlbConfig以及与之匹配的IngressClass资源,在AlbConfig中会自动配置端口为80,协议为HTTP的listener
。
对比项 | 新建 | 使用已有 | 暂不创建 |
适用场景 | 在集群中第一次使用ALB Ingress,集群中不存在AlbConfig的场景。 | 希望使用已有ALB实例的场景。 | 希望在安装组件后配置AlbConfig的场景。 |
工作原理 | 新建AlbConfig后,会使用其中的配置自动创建一个ALB实例。 | 会自动创建一个AlbConfig,其中的 | 只安装ALB Ingress Controller,而不创建AlbConfig。 |
后续操作 | 在网络类型中选择ALB实例的网络类型,然后在虚拟交换机中选择ALB实例关联的虚拟交换机。 重要 为保障业务高可用,推荐您选择2个或以上不同可用区的交换机。 | 在ALB云原生网关实例中选择希望使用的ALB实例。如果您需要使用AlbConfig关联该ALB实例,请参见复用已有ALB实例。 重要 不支持使用基础版ALB实例。 | 使用已有AlbConfig,或后续完成AlbConfig的配置。 |
在已有集群中安装
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在组件管理页面,单击网络页签,在网络组件区域,在ALB Ingress Controller组件卡片的右下角单击安装。
在安装组件 ALB Ingress Controller对话框,为选择ALB 云原生网关实例来源选择新建,使用已有或暂不创建选项。这三种选项的对比如下:
重要如果选择新建或使用已有,则会在安装ALB Ingress Controller组件后自动创建AlbConfig以及与之匹配的IngressClass资源,在AlbConfig中会自动配置端口为80,协议为HTTP的
listener
。对比项
新建
使用已有
暂不创建
适用场景
在集群中第一次使用ALB Ingress,集群中不存在AlbConfig的场景。
希望使用已有ALB实例的场景。
希望在安装组件后配置AlbConfig的场景。
工作原理
新建AlbConfig后,会使用其中的配置自动创建一个ALB实例。
会自动创建一个AlbConfig,其中的
id
字段会填入被选择的ALB实例的ID。只安装ALB Ingress Controller,而不创建AlbConfig。
后续操作
在网络类型中选择ALB实例的网络类型,然后在虚拟交换机中选择ALB实例关联的虚拟交换机。
重要为保障业务高可用,推荐您选择2个或以上不同可用区的交换机。
在ALB云原生网关实例中选择希望使用的ALB实例。如果您需要使用AlbConfig关联该ALB实例,请参见复用已有ALB实例。
重要不支持使用基础版ALB实例。
使用已有AlbConfig,或后续完成AlbConfig的配置。
单击确定。
若需要在ACK专有集群中通过ALB Ingress访问服务,在部署服务前需要为ALB Ingress Controller授权。具体操作,请参见为ACK专有集群授予ALB Ingress Controller访问权限。
步骤二:部署后端服务
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击右上角使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。该配置文件用于部署两个名称分别为
coffee
和tea
的Deployment,以及两个名称分别为coffee-svc
和tea-svc
的Service。
配置完成后单击创建,页面将提示创建成功。
检查Deployment和Service创建成功:
在左侧导航栏,选择工作负载 > 无状态。可查看到名称为coffee和tea的Deployment已部署。
在左侧导航栏,选择网络 > 服务。可查看到名称为coffee-svc和tea-svc的Service已部署。
kubectl
创建并拷贝以下内容到cafe-service.yaml文件中,用于部署两个名称分别为
coffee
和tea
的Deployment,以及两个名称分别为coffee-svc
和tea-svc
的Service。执行以下命令,部署两个Deployment和两个Service。
kubectl apply -f cafe-service.yaml
预期输出:
deployment "coffee" created service "coffee-svc" created deployment "tea" created service "tea-svc" created
执行以下命令,查看应用和服务的状态。
执行以下命令,查看应用的状态。
kubectl get deployment
预期输出:
NAME READY UP-TO-DATE AVAILABLE AGE coffee 1/2 2 1 2m26s tea 1/1 1 1 2m26s
执行以下命令,查看服务的状态。
kubectl get svc
预期输出:
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE coffee-svc NodePort 172.16.XX.XX <none> 80:32056/TCP 9m38s tea-svc NodePort 172.16.XX.XX <none> 80:31696/TCP 9m38s
步骤三:创建AlbConfig
如果在步骤一:安装ALB Ingress Controller组件中,您为ALB云原生网关实例来源选择了新建或使用已有选项,controller会自动创建一个名为“alb”的AlbConfig和名为“alb”的IngressClass资源,您可忽略此步骤。
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击右上角使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
AlbConfig的名称。
说明AlbConfig的名称在集群中必须是唯一的。因此,在创建AlbConfig时,您需要确保AlbConfig名称的唯一性,以避免命名冲突。
spec.config.name
否
ALB实例的名称。
spec.config.addressType
否
ALB实例的网络类型。取值如下:
Internet(默认值):公网类型。面向公网提供应用型负载均衡服务,公网可访问。
说明应用型负载均衡通过绑定弹性公网IP进行公网服务,使用公网类型ALB实例将收取弹性公网IP的实例费与带宽、流量费用,详情参见按量付费。
Intranet:私网类型。面向VPC内部提供应用型负载均衡服务,公网不可访问。
spec.config.zoneMappings
是
设置ALB交换机ID。创建交换机具体操作请参见创建和管理交换机。
说明指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB支持的地域与可用区,请参见ALB支持的地域与可用区。
应用型负载均衡支持多可用区部署,若当前地域支持2个及以上可用区,为保障业务高可用,请至少选择2个或以上不同可用区的交换机。
spec.listeners
否
配置ALB的监听端口和协议。本文配置示例为端口80的HTTP监听。
监听定义了流量进入负载均衡的方式和规则,此处建议保留该配置,否则您需要另行创建监听才可使用ALB Ingress。
配置完成后单击创建,页面将提示创建成功。
检查ALB实例创建成功:
在顶部菜单栏,选择实例所属的地域。
在实例页面,在实例列表可查看到名称为alb-test的ALB实例,表示实例创建成功。
kubectl
拷贝以下内容到alb-test.yaml文件中,用于创建AlbConfig。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
AlbConfig的名称。
说明AlbConfig的名称在集群中必须是唯一的。因此,在创建AlbConfig时,您需要确保AlbConfig名称的唯一性,以避免命名冲突。
spec.config.name
否
ALB实例的名称。
spec.config.addressType
否
ALB实例的网络类型。取值如下:
Internet(默认值):公网类型。面向公网提供应用型负载均衡服务,公网可访问。
说明应用型负载均衡通过绑定弹性公网IP进行公网服务,使用公网类型ALB实例将收取弹性公网IP的实例费与带宽、流量费用,详情参见按量付费。
Intranet:私网类型。面向VPC内部提供应用型负载均衡服务,公网不可访问。
spec.config.zoneMappings
是
设置ALB交换机ID。创建交换机具体操作请参见创建和管理交换机。
说明指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB支持的地域与可用区,请参见ALB支持的地域与可用区。
应用型负载均衡支持多可用区部署,若当前地域支持2个及以上可用区,为保障业务高可用,请至少选择2个或以上不同可用区的交换机。
spec.listeners
否
配置ALB的监听端口和协议。本文配置示例为端口80的HTTP监听。
监听定义了流量进入负载均衡的方式和规则,此处建议保留该配置,否则您需要另行创建监听才可使用ALB Ingress。
执行以下命令,创建AlbConfig。
kubectl apply -f alb-test.yaml
预期输出:
albconfig.alibabacloud.com/alb-demo created
步骤四:创建IngressClass
IngressClass建议与AlbConfig一一对应。
如果在步骤一:安装ALB Ingress Controller组件中,您为ALB云原生网关实例来源选择了新建或使用已有选项,controller会自动创建一个名为“alb”的AlbConfig和名为“alb”的IngressClass资源,您可忽略此步骤。
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
单击右上角使用YAML创建资源。
示例模板:选择自定义。
模板:输入YAML配置文件代码。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
IngressClass的名称。
说明IngressClass的名称在集群中必须是唯一的。因此,在创建IngressClass时,您需要确保IngressClass名称的唯一性,以避免命名冲突。
spec.parameters.name
是
关联的AlbConfig的名称。
配置完成后单击创建,页面将提示创建成功。
检查IngressClass创建成功:
在左侧导航栏,选择工作负载 > 自定义资源。
选择资源对象浏览器页签。
在API组搜索栏中,输入IngressClass进行搜索,可查看到对应的IngressClass已创建。
kubectl
创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
IngressClass的名称。
说明IngressClass的名称在集群中必须是唯一的。因此,在创建IngressClass时,您需要确保IngressClass名称的唯一性,以避免命名冲突。
spec.parameters.name
是
关联的AlbConfig的名称。
执行以下命令,创建IngressClass。
kubectl apply -f alb.yaml
预期输出:
ingressclass.networking.k8s.io/alb created
步骤五:创建Ingress
控制台
登录容器服务管理控制台,在左侧导航栏选择集群。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择 。
在路由页面,单击创建 Ingress,在创建 Ingress对话框配置路由。
配置项
说明
示例值
网关类型
可按需选择ALB应用型负载均衡、MSE云原生网关和Nginx三种网关类型。
关于三种网关的差异,请参见Nginx Ingress、ALB Ingress和MSE Ingress对比。
ALB应用负载型均衡
名称
自定义路由名称。
cafe-ingress
Ingress Class
自定义Ingress的类。
alb
监听/端口
在AlbConfig中定义ALB的监听端口和协议,规定了流量进入负载均衡方式和处理规则。
HTTP:80
规则
单击+ 添加规则可新增多个路由规则。
域名:自定义域名。
路径映射:配置如下配置项。
路径:指定服务访问的URL路径。本例中不做配置,保留根路径/。
匹配规则:支持前缀匹配(Prefix)、完整匹配(Exact)和默认(ImplementationSpecific)。
服务名称:选择目标服务,即K8s内的Service。
端口:选择服务需要暴露的端口。
Ingress支持同一个域名下配置多条路径。单击+ 添加路径新增路径。
域名:demo.domain.ingress.top
路径映射:
路径:/tea
匹配规则:默认(ImplementationSpecific)
服务名称:tea-svc
端口:80
路径映射:
路径:/coffee
匹配规则:默认(ImplementationSpecific)
服务名称:coffee-svc
端口:80
TLS配置
开启TLS配置开关,配置安全的路由服务。
域名:自定义域名。
保密字典:根据需要选择对应的保密字典。
如果您需要创建Secret,请执行如下操作。
在保密字典右侧,单击创建。
在创建 Secret对话框,自定义保密字典的名称、Cert、Key,然后单击确定。
在保密字典的下拉框,选择已创建的Secret。
单击+ 新增TLS配置,可配置多条TLS。
更多详情,请参见配置HTTPS证书以实现加密通信。
关闭TLS配置,此示例中不需要配置TLS。
更多配置
灰度发布:开启灰度发布开关。灰度规则可按照请求头、Cookie 、权重三个维度进行设置。
说明请求头、Cookie 、权重可以只设置一种,若同时设置生效规则按请求头、Cookie、权重顺序匹配。
按请求头:基于Request Header的流量切分,设置后会添加注解
nginx.ingress.kubernetes.io/canary-by-header
、nginx.ingress.kubernetes.io/canary-by-header-value
或nginx.ingress.kubernetes.io/canary-by-header-pattern
。按Cookie:基于Cookie的流量切分,设置后会添加注解
nginx.ingress.kubernetes.io/canary-by-cookie
。按权重:设置请求到指定服务的百分比(值为0~100的整数),设置后会添加注解
nginx.ingress.kubernetes.io/canary-weight
。
协议:指定后端服务的协议,设置后会添加注解
nginx.ingress.kubernetes.io/backend-protocol
。支持HTTP、HTTPS、gRPC、gRPCS四种服务协议。
重写路径:将客户端请求中的路径重写后发送到后端服务,设置后会添加注解
nginx.ingress.kubernetes.io/rewrite-target
。
关闭灰度发布,协议和重写路径保持默认。此示例中不需要配置灰度发布、协议、重新路径。
自定义转发规则
开启自定义转发规则,可精细化管理入站流量。
说明转发规则的条件条目上限为10个。
在转发条件下拉框中选择:
域名:
匹配请求域名,如果设置了多个域名,则域名之间是或的关系。设置后会添加注释
alb.ingress.kubernetes.io/conditions.host-example
。路径:
匹配请求路径,如果设置了多个路径,则路径之间是或的关系。设置后会添加注释
alb.ingress.kubernetes.io/conditions.path-example
。HTTP标头:
以键值对形式匹配请求的头部信息。例如,键是:
headername
值是:headervalue1
。如果设置了多个Header值,则Header之间是或的关系。设置后会添加注释alb.ingress.kubernetes.io/conditions.http-header-example
。
在转发动作下拉框中选择:
转发至
转发到后端多服务器组。在服务名称中,请选择目标服务。在端口中,选择目标端口号。然后自定义配置权重值。
说明如果是Flannel网络插件集群则不支持ClusterIP类型服务。
选择转发至,就不需要配置规则中的路径映射。
返回固定响应
设置通过ALB给客户端返回固定响应内容,可以设置响应状态码,正文内容和正文类型。按需求配置响应状态码,响应正文类型(可选)、响应正文(可选)。
响应正文类型:
text/plain:表示无格式的内容类型。
text/css:表示XML格式的内容。
text/html:表示HTML格式的内容。
application/javascript:表示JavaScript格式的内容。
application/json:表示JSON格式内容类型。
自定义转发规则支持多种转发条件及转发动作,您可以配置域名、路径、HTTP标头转发条件,转发至、返回固定响应的转发动作。了解更多配置,请参见自定义ALB Ingress的转发规则。
关闭自定义转发规则。此示例中不需要配置自定义转发规则。
注解
您可自定义注解名称和值,也可根据名称选择或搜索要配置的注解。Ingress的注解请参见Annotations。
单击+添加注解,可对Ingress无上限地添加注解。
无需配置,此示例不需要配置注解。
标签
标签的作用是为Ingress添加对应的标签,标示该Ingress的特点。
单击+添加标签,可对Ingress无上限地添加标签。
无需配置,此示例不需要配置标签。
配置完成,在创建Ingress页面的左下角,单击确定。
检查Ingress创建成功:
在左侧导航栏,选择网络 > 路由。可查看到名称为cafe-ingress的Ingress已部署。
在cafe-ingress的端点列,可查看到端点信息。
kubectl
创建并拷贝以下内容到cafe-ingress.yaml文件中,用于创建Ingress。
可调整参数说明如下:
参数
是否必填
说明
metadata.name
是
Ingress的名称。
说明Ingress的名称在集群中必须是唯一的。因此,在创建Ingress时,您需要确保Ingress名称的唯一性,以避免命名冲突。
spec.ingressClassName
是
关联的IngressClass的名称。
spec.rules.host
否
HTTP头部host字段域名信息,需要配置为您的自有域名。
当您在浏览器中访问您的自有域名时,例如“http://demo.domain.ingress.top”,浏览器会在发送HTTP请求时自动添加一个“Host: demo.domain.ingress.top”的头部字段。这样,服务器就可以根据该头部字段来识别请求的目标主机名。在Kubernetes中,Ingress规则中的host字段会与来自请求的Host头部字段进行匹配。当匹配成功时,Ingress规则就会将请求路由到相应的后端服务进行处理。
说明此处如果配置了自有域名,需要确保该自有域名完成备案,否则可能访问时无法解析。具体操作,请参见ICP备案全流程。
此处如果未配置,那么该Ingress规则将匹配所有到达Ingress Controller的请求。
spec.rules.http.paths.path
是
转发路径URL。
spec.rules.http.paths.pathType
是
URL匹配规则。详情可参考基于URL路径转发请求。
spec.rules.http.paths.backend.service.name
是
填写您此前创建的Service名称。
spec.rules.http.paths.backend.service.port.number
是
填写您此前创建的Service的服务端口号。
这个端口号的设置非常重要,因为它决定了在路由到后端服务时使用的端口。确保端口号正确设置,以确保请求可以正确路由到后端服务并被处理。
执行以下命令,配置
coffee
和tea
服务对外暴露的域名和path
路径。kubectl apply -f cafe-ingress.yaml
预期输出:
ingress.networking.k8s.io/cafe-ingress created
(可选)执行以下命令获取ALB实例DNS地址。
kubectl get ingress
预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE cafe-ingress alb demo.domain.ingress.top alb-m551oo2zn63yov****.cn-hangzhou.alb.aliyuncs.com 80 50s
(可选)步骤六:配置域名解析
如果您在创建Ingress时配置了spec.rules.host
字段为您的自有域名,您需要将您的域名添加CNAME记录解析到ALB DNS名称。后续通过你的自有域名访问服务。
登录容器服务ACK控制台。
单击集群名称,进入集群管理页面。
在左侧导航栏,选择网络 > 路由。
在cafe-ingress的端点列,复制其对应的DNS名称。
完成以下步骤来添加CNAME解析记录。
登录域名解析控制台。
在域名解析页面单击添加域名。
在添加域名对话框中输入您的主机域名,然后单击确认。
重要您的主机域名需已完成TXT记录验证。
在目标域名的操作列单击解析设置。
在解析设置页面单击添加记录。
在添加记录面板配置以下信息完成CNAME解析配置,然后单击确认。
配置
说明
记录类型
在下拉列表中选择CNAME。
主机记录
您的域名的前缀,例如
www
。解析请求来源
选择默认。
记录值
输入域名对应的CNAME地址,即您复制的DNS名称。
TTL
全称Time To Live,表示DNS记录在DNS服务器上的缓存时间,本文使用默认值。
步骤七:测试流量转发
在浏览器中输入“测试域名+URL路径”,测试流量转发是否正确。
如果您配置了自有域名,则“测试域名”为您的自有域名。
如果您未配置自有域名,则“测试域名”为cafe-ingress的端点DNS名称。
测试域名以demo.domain.ingress.top
为例:
在浏览器中输入
demo.domain.ingress.top/coffee
,将返回coffee-svc对应的后端服务界面。在浏览器中输入
demo.domain.ingress.top/tea
,将返回tea-svc对应的后端服务界面。
相关文档
如需了解ALB Ingress服务的高级用法,例如如何将来自不同域名或URL路径的请求转发给不同的后端服务器组、配置健康检查、将HTTP访问重定向至HTTPS、灰度发布、配置自定义监听端口等,请参见ALB Ingress服务高级用法。
如需自定义ALB Ingress的转发规则,自行配置转发条件和动作,请参见自定义ALB Ingress的转发规则。
如需让HTTPS监听转发来自HTTPS协议的请求,请参见配置HTTPS证书以实现加密通信。
如果您在使用ALB Ingress过程中遇到问题,可先参见ALB Ingress异常问题排查、ALB Ingress FAQ自助排查问题。