在注册集群中,ALB Ingress对集群服务(Service)外部可访问的API对象进行管理,提供七层负载均衡能力。本文介绍如何使用ALB Ingress将来自不同域名或URL路径的请求转发给不同的后端服务器组,将HTTP访问重定向至HTTPS以及实现灰度发布等功能。
基于域名转发请求
通过创建一个简单的Ingress,根据指定的正常域名或空域名转发请求,示例如下。
基于正常域名转发请求
以下 YAML 示例将路由路径配置为 /hello,访问 demo.domain.ingress.top/hello 时会转发到后端服务。
部署以下模板,分别创建Service、Deployment和Ingress,将访问请求通过Ingress的域名转发至Service。
展开查看示例YAML
1.19及之后版本集群
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
namespace: default
spec:
ingressClassName: alb
rules:
- host: demo.domain.ingress.top
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: ImplementationSpecific
1.19版本之前集群
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
namespace: default
spec:
ingressClassName: alb
rules:
- host: demo.domain.ingress.top
http:
paths:
- backend:
serviceName: demo-service
servicePort: 80
path: /hello
pathType: ImplementationSpecific
执行以下命令,通过指定的正常域名访问服务。
替换ADDRESS为ALB实例对应的域名地址,可通过kubectl get ing获取。
curl -H "host: demo.domain.ingress.top" <ADDRESS>/hello
基于空域名转发请求
以下 YAML 示例将域名配置为空,路由路径配置为 /hello,访问<ADDRESS>/hello时会转发到后端服务。
部署以下模板,创建Ingress。
展开查看示例YAML
1.19及之后版本集群
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo
namespace: default
spec:
ingressClassName: alb
rules:
- host: ""
http:
paths:
- backend:
service:
name: demo-service
port:
number: 80
path: /hello
pathType: ImplementationSpecific
1.19版本之前集群
apiVersion: v1
kind: Service
metadata:
name: demo-service
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo
sessionAffinity: None
type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo
template:
metadata:
labels:
app: demo
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo
namespace: default
spec:
ingressClassName: alb
rules:
- host: ""
http:
paths:
- backend:
serviceName: demo-service
servicePort: 80
path: /hello
pathType: ImplementationSpecific
执行以下命令,通过空域名访问服务。
替换ADDRESS为ALB实例对应的域名地址,可通过kubectl get ing获取。
curl <ADDRESS>/hello
基于URL路径转发请求
ALB Ingress支持按照URL转发请求,可以通过匹配规则(pathType)字段设置不同的URL匹配策略。pathType支持以下三种匹配方式。
三种匹配方式的示例如下:
前缀匹配(Prefix)
URL路径采用以/分隔的前缀匹配方式,匹配时区分大小写,并按路径中的每个元素逐级比较。
以下示例 YAML 中,当路由规则配置为/时,所有以/开头的路径(如/hello等)都能被匹配和访问。
部署以下模板,创建Ingress。
展开查看示例YAML
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-path-prefix
namespace: default
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
backend:
service:
name: demo-service
port:
number: 80
pathType: Prefix
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo-path-prefix
namespace: default
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /
backend:
serviceName: demo-service
servicePort: 80
pathType: Prefix
执行以下命令,访问服务。
替换ADDRESS为ALB实例对应的域名地址,可通过kubectl get ing获取。
curl <ADDRESS>/hello
完整匹配(Exact)或默认(ImplementationSpecific)
在以下示例 YAML 中,路由规则配置为 /hello 时,仅能匹配并访问 /hello 路径。
部署以下模板,创建Ingress。
展开查看示例YAML
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-path
namespace: default
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /hello
backend:
service:
name: demo-service
port:
number: 80
pathType: Exact
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: demo-path
namespace: default
spec:
ingressClassName: alb
rules:
- http:
paths:
- path: /hello
backend:
serviceName: demo-service
servicePort: 80
pathType: Exact
执行以下命令,访问服务。
替换ADDRESS为ALB实例对应的域名地址,可通过kubectl get ing获取。
curl <ADDRESS>/hello
配置健康检查
ALB Ingress支持配置健康检查,可以通过设置以下注解来实现。
展开查看完整YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/healthcheck-enabled: "true"
alb.ingress.kubernetes.io/healthcheck-path: "/"
alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
alb.ingress.kubernetes.io/healthy-threshold-count: "3"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
ingressClassName: alb
rules:
- http:
paths:
# 配置Context Path
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
# 配置Context Path
- path: /coffee
pathType: ImplementationSpecific
backend:
service:
name: coffee-svc
port:
number: 80
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/healthcheck-enabled: "true"
alb.ingress.kubernetes.io/healthcheck-path: "/"
alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
alb.ingress.kubernetes.io/healthcheck-httpcode: "http_2xx"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
alb.ingress.kubernetes.io/healthy-threshold-count: "3"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
ingressClassName: alb
rules:
- http:
paths:
# 配置Context Path。
- path: /tea
backend:
serviceName: tea-svc
servicePort: 80
# 配置Context Path。
- path: /coffee
backend:
serviceName: coffee-svc
servicePort: 80
注解示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/healthcheck-enabled: "true"
alb.ingress.kubernetes.io/healthcheck-path: "/"
alb.ingress.kubernetes.io/healthcheck-protocol: "HTTP"
alb.ingress.kubernetes.io/healthcheck-httpversion: "HTTP1.1"
alb.ingress.kubernetes.io/healthcheck-method: "HEAD"
alb.ingress.kubernetes.io/healthcheck-code: "http_2xx"
alb.ingress.kubernetes.io/healthcheck-timeout-seconds: "5"
alb.ingress.kubernetes.io/healthcheck-interval-seconds: "2"
alb.ingress.kubernetes.io/healthy-threshold-count: "3"
alb.ingress.kubernetes.io/unhealthy-threshold-count: "3"
spec:
... ...
参数 | 描述 | 默认值 |
alb.ingress.kubernetes.io/healthcheck-enabled
| 是否开启后端服务器组的健康检查。 true:开启健康检查。
false:不开启健康检查。
| false
|
alb.ingress.kubernetes.io/healthcheck-path
| 健康检查路径。 | /
|
alb.ingress.kubernetes.io/healthcheck-protocol
| 健康检查使用的协议。 HTTP:使用HTTP协议,通过发送HEAD或GET请求模拟浏览器的访问行为检查服务器应用是否健康。
HTTPS:使用HTTPS协议,通过发送HEAD或GET请求模拟浏览器的访问行为检查服务器应用是否健康。
TCP:使用TCP协议,通过发送SYN握手报文检测服务器端口是否存活。
GRPC:使用gRPC协议,通过发送POST或GET请求检查服务器应用是否健康。
| HTTP
|
alb.ingress.kubernetes.io/healthcheck-httpversion
| HTTP协议版本,healthcheck-protocol为HTTP或HTTPS时生效。 | HTTP1.1
|
alb.ingress.kubernetes.io/healthcheck-method
| 健康检查的方法。
重要 healthcheck-protocol为GRPC时,需要选择POST或GET。
| HEAD
|
alb.ingress.kubernetes.io/healthcheck-httpcode
| 健康检查状态码。仅当探测请求成功且返回指定状态码时,才认为该后端服务器状态正常。 可以填入以下选项中的任意一个或多个组合,多个状态码用英文半角逗号(,)分隔: http_2xx
http_3xx
http_4xx
http_5xx
| http_2xx
|
alb.ingress.kubernetes.io/healthcheck-code
| 健康检查状态码,仅当探测请求成功且返回指定状态码时,才认为该后端服务器状态正常。与healthcheck-httpcode同时使用时,以此字段为准。 可选参数依赖于healthcheck-protocol中填入的值: HTTP或HTTPS:
可以填入以下选项中的任意一个或多个组合,多个状态码用英文半角逗号(,)分隔: http_2xx
http_3xx
http_4xx
http_5xx
GRPC:取值范围:[0, 99]。
支持范围输入,最多填入20个范围值,多个范围值使用半角逗号(,)分隔。
| HTTP或HTTPS
默认值:http_2xx GRPC
默认值:0
|
alb.ingress.kubernetes.io/healthcheck-timeout-seconds
| 健康检查超时时间,单位秒(s)。取值范围:[1, 300]。 | 5
|
alb.ingress.kubernetes.io/healthcheck-interval-seconds
| 健康检查间隔周期,单位秒(s)。取值范围:[1, 50]。 | 2
|
alb.ingress.kubernetes.io/healthy-threshold-count
| 健康检查成功多少次判定为成功。取值范围:[2, 10]。 | 3
|
alb.ingress.kubernetes.io/unhealthy-threshold-count
| 健康检查失败多少次判定为失败。取值范围:[2, 10]。 | 3
|
alb.ingress.kubernetes.io/healthcheck-connect-port
| 健康检查使用的端口。 | 0
|
配置HTTP重定向至HTTPS
ALB Ingress通过配置以下注解,实现将 HTTP 请求重定向至 HTTPS 443 端口。
展开查看完整示例YAML
1.19及之后版本集群
apiVersion: v1
kind: Service
metadata:
name: demo-service-ssl
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo-ssl
sessionAffinity: None
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ssl
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo-ssl
template:
metadata:
labels:
app: demo-ssl
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo-ssl
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
namespace: default
spec:
ingressClassName: alb
tls:
- hosts:
- ssl.alb.ingress.top
rules:
- host: ssl.alb.ingress.top
http:
paths:
- backend:
service:
name: demo-service-ssl
port:
number: 80
path: /
pathType: Prefix
1.19版本之前集群
apiVersion: v1
kind: Service
metadata:
name: demo-service-ssl
namespace: default
spec:
ports:
- name: port1
port: 80
protocol: TCP
targetPort: 8080
selector:
app: demo-ssl
sessionAffinity: None
type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-ssl
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: demo-ssl
template:
metadata:
labels:
app: demo-ssl
spec:
containers:
- image: registry.cn-hangzhou.aliyuncs.com/alb-sample/cafe:v1
imagePullPolicy: IfNotPresent
name: demo-ssl
ports:
- containerPort: 8080
protocol: TCP
---
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
namespace: default
spec:
ingressClassName: alb
tls:
- hosts:
- ssl.alb.ingress.top
rules:
- host: ssl.alb.ingress.top
http:
paths:
- backend:
serviceName: demo-service-ssl
servicePort: 80
path: /
pathType: Prefix
参数 | 描述 | 注解示例 |
alb.ingress.kubernetes.io/ssl-redirect: "true"
| 将 HTTP 请求重定向到 HTTPS 443 端口。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/ssl-redirect: "true"
name: demo-ssl
... ...
|
支持后端HTTPS和gRPC协议
当前 ALB 支持 HTTPS 和 gRPC 作为后端协议,您只需在 Ingress 中添加以下注解。
展开查看完整YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-protocol: "grpc"
name: demo-alb-ingress
spec:
ingressClassName: alb
tls:
- hosts:
- demo.alb.ingress.top
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grpc-demo-svc
port:
number: 9080
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-protocol: "grpc"
name: demo-alb-ingress
spec:
ingressClassName: alb
tls:
- hosts:
- demo.alb.ingress.top
rules:
- host: demo.alb.ingress.top
http:
paths:
- backend:
serviceName: grpc-demo-svc
servicePort: 9080
path: /
pathType: Prefix
说明 Ingress创建后,后端协议不支持修改,如果您需要变更协议,请删除重建Ingress。
参数 | 描述 | YAML示例 |
alb.ingress.kubernetes.io/backend-protocol
| https:后端服务使用 HTTPS 协议。 grpc:后端服务使用 gRPC 协议。 使用 Ingress 转发 gRPC 服务时,需为对应域名配置 SSL 证书,并通过 TLS 协议进行通信。
| apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-protocol: "grpc"
name: demo-alb-ingress
... ...
|
配置重写
ALB Ingress支持重写(Rewrite)功能,在接收到客户端请求后,修改请求中的Path部分,再发送给后端Service。重写通过以下两个Annotation实现:
配置示例
示例场景一:移除前缀
下方的YAML示例中path: /something(/|$)(.*)通过正则表达式将客户端请求的路径分为了三个部分:
alb.ingress.kubernetes.io/rewrite-target注解中配置的重写路径为/(路径标准前缀)+${2}(第二捕获组的内容),路径的重写效果如下:
客户端原始路径 | 是否匹配Path正则表达式 | 重写后路径 |
/something
| 匹配,第二捕获组为空。 | /
|
/something/
| 匹配,第二捕获组为空。 | /
|
/something/new
| 匹配,第二捕获组的内容为new。 | /new
|
/something-new/item
| 不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。 |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
alb.ingress.kubernetes.io/rewrite-target: /${2} # 该注解支持正则表达式替换。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /something(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080
示例场景二:捕获并重新排列多个部分
下方示例捕获路径/items/(.*)/(.*)/(.*)中的多个部分并进行重新排列,并且在用户无感的情况下更改了URL的格式(改为类POST形式)。重写路径为/(路径标准前缀)+${2}(第二捕获组的内容)+?code=+${3}(第三捕获组的内容),路径的重写效果如下:
示例中明确要求路径中有四个分段,使用这种方式要求客户端使用的路径为固定格式。
客户端原始路径 | 是否匹配Path正则表达式 | 重写后路径 |
/items/electronics/computers/554
| 匹配,第二捕获组的内容为computers,第三捕获组的内容为554。 | /computers?code=554。
|
/items/produce/fruits/12
| 匹配,第二捕获组的内容为fruits,第三捕获组的内容为12。 | /fruits?code=12
|
/items/headphones/5
| 不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。 |
/drinks/41
| 不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。 |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
alb.ingress.kubernetes.io/rewrite-target: /${2}?code=${3} # 该注解支持正则表达式替换。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /items/(.*)/(.*)/(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080
示例场景三:将多个路径重写到单一路径
下方示例通过同时对多个路径(/app-a(/|$)(.*)和/app-b(/|$)(.*))进行正则匹配,将多个路径重写到一个单一路径。重写路径为/app-c/+${2}(第二捕获组的内容),路径的重写效果如下:
客户端原始路径 | 是否匹配Path正则表达式 | 重写后路径 |
/app-a/item1
| 匹配,第二捕获组的内容为item1。 | /app-c/item1
|
/app-a/item2
| 匹配,第二捕获组的内容为item2。 | /app-c/item2
|
/app-a或/app-a/
| 匹配,第二捕获组为空。 | /app-c/
|
/drinks/41
| 不匹配,在本示例中未匹配到路由规则,ALB Ingress返回503状态码。 |
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: rewrite-ingress
annotations:
alb.ingress.kubernetes.io/use-regex: "true" # 允许path字段使用正则表达式。
alb.ingress.kubernetes.io/rewrite-target: /app-c/${2} # 该注解支持正则表达式替换。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /app-a(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080
- path: /app-b(/|$)(.*)
pathType: Prefix
backend:
service:
name: rewrite-svc
port:
number: 9080
示例场景四:重写域名
alb.ingress.kubernetes.io/rewrite-target 注解仅支持更改路径,如需更改URL中的其他部分,例如域名与参数,请使用自定义转发规则。
验证重写规则匹配
使用sed命令可以提前测试客户端使用的特定路径是否匹配path中配置的正则表达式,并查看重写后的新路径。
以示例场景二:捕获并重新排列多个部分中的捕获路径/items/(.*)/(.*)/(.*)和重写规则/${2}?code=${3}为例:
将下方的示例命令保存到path2.txt:
/items/electronics/computers/554
/items/produce/fruits/12
/items/headphones/5
/drinks/41
查看路径是否匹配,以及重写后的路径:
下方命令中对示例中的path正则表达式(/items/(.*)/(.*)/(.*))和重写后的路径(/${2}?code=${3})进行了改写,在sed命令中特殊字符/前需要使用转义字符\,捕获组内容的写法由${2}改为\2。
sed -E 's#\/items\/(.*)\/(.*)\/(.*)#Matched: [&] ---> Rewritten: [/\2?code=\3]#' path2.txt
预期输出如下,前两条路径匹配重写规则,会被重写到新的路径;后两条路径不匹配,不会被重写。
Matched: [/items/electronics/computers/554] ---> Rewritten: [/computers?code=554]
Matched: [/items/produce/fruits/12] ---> Rewritten: [/fruits?code=12]
/items/headphones/5
/drinks/41
配置自定义监听端口
ALB Ingress 支持通过注解自定义监听端口,可实现服务同时暴露 80(HTTP)和 443(HTTPS)端口。
展开查看完整YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
spec:
ingressClassName: alb
tls:
- hosts:
- demo.alb.ingress.top
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
name: cafe-ingress
spec:
ingressClassName: alb
tls:
- hosts:
- demo.alb.ingress.top
rules:
- host: demo.alb.ingress.top
http:
paths:
- backend:
serviceName: tea-svc
servicePort: 80
path: /tea
pathType: ImplementationSpecific
重要 ALB不支持直接在Ingress中创建新的监听。为确保Ingress能够正常工作,您需要先在AlbConfig中创建所需的监听端口和协议,然后在Ingress中将这些监听与服务关联起来。关于如何创建ALB监听,请参见通过AlbConfig配置ALB监听。
参数 | 描述 | YAML示例 |
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
| 使服务同时监听 80 和 443 端口。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]'
... ...
|
配置转发规则优先级
默认情况下,ALB 转发规则的优先级排序依据如下:
不同Ingress按照namespace/name的字典顺序优先级进行排列,字典顺序小的优先级高。
先比较 namespace,若相同则再比 name,各字符逐一比较。
同一个Ingress按照rule字段先后顺序进行排序,配置在上面的优先级高。
rules:
- host: www.example.com
http: ...
- host: www.test.com
http: ...
若不修改Ingress的namespace/name字段,可以配置以下Ingress注解定义ALB转发规则优先级:
展开查看完整的YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/order: "2"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/order: "2"
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- backend:
serviceName: tea-svc
servicePort: 80
path: /tea
pathType: ImplementationSpecific
参数 | 描述 | 取值范围 | YAML示例 |
alb.ingress.kubernetes.io/order
| 定义 ALB 转发规则的优先级,值越小优先级越高。 同一个监听内规则优先级必须唯一。 | [1,1000] 默认值:10 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/order: "2"
spec:
... ...
|
通过注解实现灰度发布
ALB支持复杂路由处理,具备基于 Header、Cookie 及权重的灰度发布能力。可通过配置以下相关注解灵活实现各类灰度发布策略。关于灰度发布最佳实践,请参见通过ALB Ingress实现灰度发布。
参数 | 描述 | 说明 |
alb.ingress.kubernetes.io/canary: "true"
| 开启灰度发布能力 | |
通过注解实现会话保持
ALB Ingress支持通过以下注解实现会话保持。
展开查看完整YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress-v3
annotations:
alb.ingress.kubernetes.io/sticky-session: "true"
alb.ingress.kubernetes.io/sticky-session-type: "Insert" # 支持自定义cookie时,植入cookie类型需为Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
ingressClassName: alb
rules:
- http:
paths:
- backend:
service:
name: tea-svc
port:
number: 80
path: /tea2
pathType: ImplementationSpecific
- backend:
service:
name: coffee-svc
port:
number: 80
path: /coffee2
pathType: ImplementationSpecific
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
name: cafe-ingress-v3
annotations:
alb.ingress.kubernetes.io/sticky-session: "true"
alb.ingress.kubernetes.io/sticky-session-type: "Insert" # 支持自定义cookie时,植入cookie类型需为Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
ingressClassName: alb
rules:
- http:
paths:
#配置Context Path。
- path: /tea2
pathType: ImplementationSpecific
backend:
serviceName: tea-svc
servicePort: 80
#配置Context Path。
- path: /coffee2
pathType: ImplementationSpecific
backend:
serviceName: coffee-svc
servicePort: 80
注解示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress-v3
annotations:
alb.ingress.kubernetes.io/sticky-session: "true"
alb.ingress.kubernetes.io/sticky-session-type: "Insert" # 支持自定义cookie时,植入cookie类型需为Server。
alb.ingress.kubernetes.io/cookie-timeout: "1800"
alb.ingress.kubernetes.io/cookie: "test"
spec:
... ...
参数 | 描述 | 默认值 |
alb.ingress.kubernetes.io/sticky-session
| 是否启用会话保持。 | false
|
alb.ingress.kubernetes.io/sticky-session-type
| Cookie的处理方式。 Insert:植入Cookie。客户端第一次访问时,负载均衡会在返回请求中植入Cookie(即在HTTP或HTTPS响应报文中插入SERVERID),下次客户端携带此Cookie访问时,负载均衡服务会将请求定向转发给之前记录到的后端服务器。
Server:重写Cookie。负载均衡发现用户自定义了Cookie,将会对原来的Cookie进行重写,下次客户端携带新的Cookie访问时,负载均衡服务会将请求定向转发给之前记录到的后端服务器。
说明 当前服务器组StickySessionEnabled为true时,该参数生效。服务器组参数详情请参见创建服务器组。 | Insert
|
alb.ingress.kubernetes.io/cookie-timeout
| Cookie 超时时间(单位:秒)取值:1~86400; sticky-session-type配置为Insert时,此注解生效。
| 1000 |
alb.ingress.kubernetes.io/cookie
| 自定义Cookie值。 sticky-session-type配置为Server时,此注解必填,不允许为空。
| "" |
指定服务器组负载均衡算法
ALB Ingress 可通过以下注解指定服务器组的负载均衡算法,具体取值及说明见下表。
展开查看完整YAML示例
1.19及之后版本集群
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch可按需配置为wrr、sch和wlc。
alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、sch或wlc均无需配置此参数。
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1
kind: Ingress
metadata:
annotations:
alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch也可按需配置为wrr、sch和wlc。
alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、sch或wlc均无需配置此参数。
name: cafe-ingress
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- backend:
serviceName: tea-svc
servicePort: 80
path: /tea
pathType: ImplementationSpecific
参数 | 取值 | 描述 | |
alb.ingress.kubernetes.io/backend-scheduler
| wrr
| 加权轮询,权重高的后端服务器被轮询到概率更高(默认值)。 | apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/backend-scheduler: "uch" # 此处的uch可按需配置为wrr、sch和wlc。
alb.ingress.kubernetes.io/backend-scheduler-uch-value: "test" # 仅负载均衡算法为uch时,需要配置此参数。当调度算法为wrr、sch或wlc均无需配置此参数。
spec:
... ...
|
wlc
| 根据每台后端服务器设定的权重值和后端服务器的实际负载(即连接数)进行轮询。权重相同则优先选择连接数少的服务器。 |
sch
| 源IP一致性Hash,基于客户端源IP请求做哈希分配,同一IP分配至同一后端服务器。 |
uch
| URL参数一致性Hash。 通过注解alb.ingress.kubernetes.io/backend-scheduler-uch-value指定URL参数进行一致性Hash。 |
跨域配置
ALB Ingress 支持通过以下注解参数控制跨域行为。可指定允许访问的站点、请求方法、请求和响应头、凭证携带及预检(OPTIONS)缓存时间,满足不同安全和业务场景下的跨域访问需求。
展开查看完整YAML示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
annotations:
alb.ingress.kubernetes.io/enable-cors: "true"
alb.ingress.kubernetes.io/cors-expose-headers: ""
alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
alb.ingress.kubernetes.io/cors-allow-credentials: "true"
alb.ingress.kubernetes.io/cors-max-age: "600"
alb.ingress.kubernetes.io/cors-allow-origin: "允许跨域的域名"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloud-nodeport
port:
number: 80
注解示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
annotations:
alb.ingress.kubernetes.io/enable-cors: "true"
alb.ingress.kubernetes.io/cors-expose-headers: ""
alb.ingress.kubernetes.io/cors-allow-methods: "GET,POST"
alb.ingress.kubernetes.io/cors-allow-credentials: "true"
alb.ingress.kubernetes.io/cors-max-age: "600"
alb.ingress.kubernetes.io/cors-allow-origin: "允许跨域的域名"
spec:
... ...
参数 | 描述 | 默认值 |
alb.ingress.kubernetes.io/enable-cors
| 启用 CORS 跨域配置。 | 默认值:"true" |
alb.ingress.kubernetes.io/cors-allow-origin
| 允许通过浏览器访问服务器资源的站点。 站点之间使用英文半角逗号(,)分割。 单个value值必须以http://或者https://开头后跟一个正确域名,或者一级的泛域名。不支持使用IP地址。 | |
alb.ingress.kubernetes.io/cors-allow-methods
| 允许跨域方法。 不区分大小写。跨域方法之间使用英文半角逗号(,)分割。 | 默认值:GET, PUT, POST, DELETE, PATCH, OPTIONS 示例:alb.ingress.kubernetes.io/cors-allow-methods: "PUT, GET, POST, OPTIONS"
|
alb.ingress.kubernetes.io/cors-allow-headers
| 允许跨域传播的请求头。 支持配置为*或配置一个或多个 value 值,多个 value 值用半角逗号(,)隔开。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。 | 默认值:DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization 示例:alb.ingress.kubernetes.io/cors-allow-headers: "X-Forwarded-For, X-app123-XPTO"
|
alb.ingress.kubernetes.io/cors-expose-headers
| 允许暴露的Header列表, 支持配置为*或配置一个或多个 value 值,多个 value 值用半角逗号(,)隔开。单个 value 值只允许包含大小写字母、数字,不能以下划线(_)和短划线(-)开头或结尾,最大长度限制为 32 个字符。 | |
alb.ingress.kubernetes.io/cors-allow-credentials
| 设置跨域访问时是否允许携带凭证信息。 | |
alb.ingress.kubernetes.io/cors-max-age
| 对于非简单请求,设置OPTIONS预检请求在浏览器的最大缓存时间(秒),取值范围[0, 172800]。 | 默认值:172800 |
后端长链接
传统负载均衡采用短链接访问后端服务器组,每次请求都需建立和断开TCP连接,成为高性能系统的瓶颈。后端长链接支持极大减少了连接资源消耗,大幅提高处理性能。您可以在ALB Ingress中通过注解alb.ingress.kubernetes.io/backend-keepalive开启后端长链接。参考示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: alb-ingress
annotations:
alb.ingress.kubernetes.io/backend-keepalive: "true"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: cloud-nodeport
port:
number: 80
支持QPS限速
ALB本身支持转发规则的QPS限速功能,限速值要求在1~100000之间。当前在ALB Ingress只需要设置alb.ingress.kubernetes.io/traffic-limit-qps注解即可。参考示例如下:
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: cafe-ingress
annotations:
alb.ingress.kubernetes.io/traffic-limit-qps: "50"
spec:
ingressClassName: alb
rules:
- host: demo.alb.ingress.top
http:
paths:
- path: /tea
pathType: ImplementationSpecific
backend:
service:
name: tea-svc
port:
number: 80
- path: /coffee
pathType: ImplementationSpecific
backend:
service:
name: coffee-svc
port:
number: 80