AlbConfig是由ALB Ingress Controller提供的CRD资源,ALB Ingress Controller使用AlbConfig配置ALB实例和监听。本文介绍如何创建、修改、更新AlbConfig以及开启日志服务等操作。
功能索引
ALB实例配置 | |
监听配置 |
前提条件
已为集群安装ALB Ingress Controller组件。具体操作,请参见管理ALB Ingress Controller组件。
说明若需要在ACK专有集群中通过ALB Ingress访问服务,在部署服务前需要为ALB Ingress Controller授权。具体操作,请参见为ACK专有集群授予ALB Ingress Controller访问权限。
已创建两个不同可用区的交换机,并且与集群处于同一VPC。具体操作,请参见创建和管理交换机。
已通过kubectl工具连接集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群。
注意事项
推荐优先使用
kubectl edit
命令直接修改、更新资源的配置。如果必须使用kubectl apply
命令来修改、更新资源,请在执行kubectl apply
命令之前先执行kubectl diff
命令预览变更点,确保变更符合预期,然后再执行kubectl apply
命令将变更应用到Kubernetes集群。低版本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服务高级用法。
创建AlbConfig
一个AlbConfig对应一个ALB实例,如果您需要使用多个ALB实例,可以通过创建多个AlbConfig实现。创建AlbConfig操作如下。
如果您在安装ALB Ingress Controller组件时,为ALB云原生网关实例来源选择了新建或使用已有选项,Controller会自动创建一个名为“alb”的AlbConfig和名为“alb”的IngressClass资源。
创建并拷贝以下内容到alb.yaml文件中,用于创建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb spec: config: name: alb addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 替换为您的虚拟交换机的ID - vSwitchId: vsw-uf6nun9tql5t8nh15**** listeners: - port: 80 protocol: HTTP
参数
说明
spec.config.name
表示ALB实例的名称。
spec.config.addressType
表示负载均衡的地址类型。取值如下:
Internet
(默认值):ALB实例会拥有公网IP地址,DNS域名被解析到公网IP,因此可以在公网环境下访问。Intranet
:ALB实例将只拥有私网IP地址,DNS域名被解析到私网IP,因此只能在其所在的VPC内被访问。
重要addressType
参数仅在创建AlbConfig时被解析,后续更新AlbConfig不产生效果。spec.config.zoneMappings
用于设置ALB Ingress使用的虚拟交换机ID。在多个可用区的地域中,您至少需要指定两个处于不同可用区的交换机。对于只包含单个可用区的地域,指定一个交换机ID即可。指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB Ingress支持的地域与可用区,请参见ALB支持的地域与可用区。
重要在多个可用区的地域中,您至少需要指定两个处于不同可用区的交换机。
zoneMappings
参数仅在创建AlbConfig时被解析,后续更新AlbConfig不产生效果。
为集群安装ALB Ingress Controller组件时,可以选择创建默认的AlbConfig。AlbConfig的配置参数除
vSwitchID
外,其他参数将会按照以下的默认配置创建。执行以下命令,创建AlbConfig。
kubectl apply -f alb.yaml
预期输出:
AlbConfig.alibabacloud.com/alb created
执行以下命令,查看AlbConfig资源。
kubectl get AlbConfig
预期输出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
说明创建HTTPS监听并为其配置证书后,
PORT&PROTOCOL
和CERTID
中才会显示内容,内容为空是正常现象。
复用已有ALB实例
如果您希望复用已有ALB实例,需要在创建AlbConfig时指定ALB实例ID,且已有的ALB实例必须是通过应用型负载均衡ALB控制台创建的标准版或WAF增强版实例。不支持复用基础版ALB实例。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: **** # 通过ALB控制台创建的标准版或WAF增强版ALB实例ID。
forceOverride: false
listenerForceOverride: false
参数说明如下:
参数 | 说明 |
|
重要 在复用场景下,不建议您手动修改监听名称,以免错误地将监听置于或脱离ACK的控制。由AlbConfig创建或更新的监听由ACK管理,且监听名称的默认格式为 |
| 表示复用模式下是否强制覆盖ALB实例属性。
|
| 表示复用模式下是否强制覆盖监听属性。
|
更新AlbConfig
对于已经通过AlbConfig创建的ALB实例,更改实例配置时推荐使用kubectl edit
命令进行更新。更新AlbConfig操作如下。
执行以下命令,查看AlbConfig名称。
kubectl get AlbConfig
预期输出:
NAME ALBID DNSNAME PORT&PROTOCOL CERTID AGE alb alb-****** alb-******.<regionID>.alb.aliyuncs.com 28m
执行以下命令编辑AlbConfig。
kubectl edit albconfig <ALBCONFIG_NAME> # <ALBCONFIG_NAME>替换AlbConfig的名称
在AlbConfig配置文件中,更新AlbConfig的相关内容。例如,修改
spec.config.name
字段的参数,将ALB实例的名称修改为new_alb
。... spec: config: name: new_alb # 更新后的名称。 ...
使用IngressClass关联AlbConfig与Ingress
ALB Ingress使用Kubernetes原生的IngressClass资源确定AlbConfig与Ingress的关联。通过在IngressClass资源中填入
创建并拷贝以下内容到ingress_class.yaml文件中,用于创建IngressClass。
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb # IngressClass关联的AlbConfig的名称
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb
执行以下命令,创建IngressClass。
kubectl apply -f ingress_class.yaml
预期输出:
ingressclass.networking.k8s.io/alb created
创建并拷贝以下内容到ingress.yaml文件中。通过
ingressClassName
参数指定名称为alb的IngressClass关联AlbConfig。1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress spec: ingressClassName: alb # Ingress关联的IngressClass的名称 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 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
执行以下命令,创建Ingress。
kubectl apply -f ingress.yaml
预期输出:
ingress.networking.k8s.io/cafe-ingress created
完成上述步骤,就可以使用IngressClass关联AlbConfig与Ingress。
创建并使用多个ALB实例
如果您希望同时使用多个ALB实例,在Ingress资源中通过spec.ingressClassName
指定不同的IngressClass,即可将Ingress关联到不同的ALB实例。
创建并拷贝以下内容到alb-2.yaml文件中,用于创建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-2 spec: config: name: alb-2 # ALB实例名称。 addressType: Internet # 负载均衡具有公网IP地址。 zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** # 虚拟交换机的ID - vSwitchId: vsw-uf6nun9tql5t8nh15****
执行以下命令,创建AlbConfig。
kubectl apply -f alb-2.yaml
预期输出:
AlbConfig.alibabacloud.com/alb-2 created
创建并拷贝以下内容到ingress_class2.yaml文件中,用于创建IngressClass。
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2 # IngressClass关联的AlbConfig的名称
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb-2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: alb-2 # IngressClass关联的AlbConfig的名称
执行以下命令,创建IngressClass。
kubectl apply -f ingress_class2.yaml
预期输出:
ingressclass.networking.k8s.io/alb-2 created
创建并拷贝以下内容到ingress2.yaml文件中。通过
ingressClassName
参数指定不同的ALB实例。下方的示例中,就通过在ingressClassName
字段中填入alb-2
,将Ingress关联到了名为alb-2的IngressClass,以及这个IngressClass所关联的,名为alb-2的ALB实例。1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress2 spec: ingressClassName: alb-2 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-ingress2 spec: ingressClassName: alb-2 rules: - http: paths: # 配置Context Path。 - path: /tea backend: serviceName: tea-svc servicePort: 80 # 配置Context Path。 - path: /coffee backend: serviceName: coffee-svc servicePort: 80
执行以下命令,创建Ingress。
kubectl apply -f ingress2.yaml
预期输出:
ingress.networking.k8s.io/cafe-ingress2 created
使用IPv6地址
在创建ALB实例时,通过在addressIpVersion
字段中填入DualStack
即可开启双栈,同时支持IPv4与IPv6。
addressIpVerison
参数仅在创建AlbConfig时被解析,后续更新AlbConfig不产生效果。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
addressIpVersion: DualStack # 开启双栈
...
指定TLS安全策略
当前AlbConfig配置HTTPS监听时,支持指定TLS安全策略。TLS安全策略包含自定义策略和系统默认策略,更多信息,请参见TLS安全策略。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1 # 指定的安全策略ID
#...
开启日志服务访问日志
如果您希望ALB Ingress能够收集访问日志Access Log,可以在AlbConfig中指定logProject
和logStore
。
创建集群时,您选择了自动创建或使用已有日志服务Project。您可登录容器服务管理控制台,在左侧导航栏选择集群。在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息。然后,在集群资源页签,查看集群关联的日志服务 Project。
logStore
命名需要以alb_
开头,若指定logStore
不存在,则会自动创建。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"
#...
您可以在集群资源页签单击日志服务 Project右侧的名称,查看收集的访问日志。
删除ALB实例
一个AlbConfig对应一个ALB实例, 因此,如果ALB实例使用AlbConfig创建,则可以通过删除AlbConfig实现删除ALB实例。
删除AlbConfig前,请删除其关联的所有Ingress资源。
执行以下命令,删除AlbConfig。
kubectl delete AlbConfig <AlbConfig_NAME> # <AlbConfig_NAME>替换AlbConfig的名称
删除复用ALB实例的AlbConfig
在创建AlbConfig时如果选择复用已有ALB实例,因为实例并非通过AlbConfig创建,删除AlbConfig并不会删除ALB实例。如果您希望删除复用ALB实例的AlbConfig,请按照以下操作步骤操作。
使用
kubectl edit
命令修改AlbConfig,删除此AlbConfig的所有监听,即删除spec.listeners
字段下的所有条目。重要若您集群中安装的ALB Ingress Controller组件版本为v2.10.0-aliyun.1及以前版本,请执行该操作。否则,请跳过该步骤。
执行以下命令,删除AlbConfig。
重要删除AlbConfig前,请删除其关联的所有Ingress资源。
kubectl delete AlbConfig <AlbConfig_NAME> # <AlbConfig_NAME>替换AlbConfig的名称
创建监听
监听(Listeners)是ALB实例用来处理实际流量的顶层入口。只有创建了监听,ALB实例才能对外开放端口,接收客户端的请求。
在AlbConfig中设置port
和protocol
即可创建对应的监听。一旦修改了port
、protocol
以及其他监听的属性,系统将会把原有的监听删除,然后创建一个新的监听来替代它。
监听可以使用三种应用层协议:HTTP、HTTPS、QUIC。
不同协议的多个监听可以同时使用,但需要在Ingress资源中配置Annotation以保证Ingress同时适用于多个监听。具体操作,请参见配置自定义监听端口。
创建HTTP监听
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP # protocol的可选项为HTTP、HTTPS、QUIC。
...
HTTP协议自动兼容WebSocket,不需要特殊设置即可。
创建HTTPS监听
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 443
protocol: HTTPS
...
使用HTTPS监听时,需要配置证书。具体操作,请参见配置HTTPS证书以实现加密通信。
创建QUIC监听
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 443
protocol: QUIC
...
使用QUIC监听可以兼容客户端使用HTTP/3协议进行访问。使用QUIC监听的更多细节,请参见使用QUIC监听兼容HTTP/3协议。
设置监听连接请求超时时间
在AlbConfig中可以指定监听,设置连接请求超时时间(单位为秒,取值范围为[1,180])。若在超时时间内后端服务器一直没有响应,ALB实例将放弃等待,给客户端返回HTTP 504错误码。如果不指定连接请求超时时间,则默认为60秒。YAML示例如下。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
requestTimeout: 40 # 若不填入值,默认超时时间为60秒
...
使用数据压缩功能
开启该功能后,ALB实例会对某些特定文件类型进行压缩。gzipEnabled
取值如下:
true
:对特定文件类型进行压缩。false
:不会对任何文件类型进行压缩。
目前Brotli支持压缩所有类型,Gzip支持压缩的类型包括text/xml、text/plain、text/css、application/javascript、application/x-javascript、application/rss + xml、application/atom + xml、application/xml和application/json。
开启数据压缩的YAML示例如下:
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
gzipEnabled: true
...
获取客户端真实IP
开启此功能后,ALB实例在转发请求到后端服务时,在HTTP请求头中添加客户端真实IP的字段。XForwardedForEnabled
取值如下:
true
:获取来访者真实IP。false
:不获取来访者真实IP。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true
#...
获取客户端的端口
开启此功能后,ALB实例在转发请求到后端服务时,在HTTP请求头中添加客户端端口字段。XForwardedForClientSrcPortEnabled
取值如下:
true
:获取负载均衡实例客户端的端口。false
:不获取负载均衡实例客户端的端口。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
...
获取ALB实例的监听协议
开启此功能后,ALB实例在转发请求到后端服务时,在HTTP请求头中添加ALB实例使用的监听协议字段。XForwardedForProtoEnabled
取值如下:
true
:获取实例的监听协议。false
:不获取实例的监听协议。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForProtoEnabled: true
...
获取ALB实例的ID
开启此功能后,ALB实例在转发请求到后端服务时,在HTTP请求头中添加ALB实例的ID字段。XForwardedForSLBIdEnabled
取值如下:
true
:获取负载均衡实例的ID。false
:不获取负载均衡实例的ID。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBIdEnabled: true
...
获取ALB实例的监听端口
开启此功能后,ALB实例在转发请求到后端服务时,在HTTP请求头中添加实例的监听端口字段。XForwardedForSLBPortEnabled
取值如下:
true
:获取实例的监听端口。false
:不获取实例的监听端口。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBPortEnabled: true
...
指定可信代理服务器的IP
在AlbConfig中通过XForwardedForClientSourceIpsEnabled
配置项允许ALB实例从X-Forwarded-For
头部字段中获取真实客户端IP。通过XForwardedForClientSourceIpsTrusted
配置项,可以指定一组可信代理服务器的IP。ALB实例将从X-Forwarded-For
字段中的IP列表末尾开始向前遍历,选择第一个不在可信IP列表的IP作为客户端的实际IP。
例如,X-Forwarded-For
中的值为<客户端真实IP,代理IP-1,代理IP-2>
,您可以在XForwardedForClientSourceIpsTrusted
中填入代理IP-1
与代理IP-2
,以此获取真实的客户端IP。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSourceIpsEnabled: true # true表示允许ALB从X-Forwarded-For头字段中查找真实客户端IP,此时必须配置XForwardedForClientSourceIpsTrusted写入格式正确的内容;false表示不允许ALB从X-Forwarded-For头字段中查找真实客户端IP。
XForwardedForClientSourceIpsTrusted: 192.168.x.x;192.168.x.x/16 # 请输入正确格式的IP或网段,并以 ; 分隔,IP或网段之间无需添加空格。仅在XForwardedForClientSourceIpsEnabled为true时生效。
...
设置ACL访问控制
通过AlbConfig可以为ALB监听启用访问控制功能,通过设置入方向的允许或拒绝规则,对客户端请求精确控制,管理请求转发。关于ACL的更多信息,请参见配置ACL实现访问控制。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: White
#...
字段说明如下:
aclType
:用于设置监听的ACL为黑名单或白名单。取值为Black
和White
,分别表示黑名单和白名单。aclEntries
:用于设置访问控制条目IP地址段,例如127.0.0.1/32。