AlbConfig是由ALB Ingress Controller提供的CRD资源,ALB Ingress Controller使用AlbConfig来配置ALB实例和监听。本文介绍如何创建、修改、更新AlbConfig以及开启日志服务等操作。
功能索引
Service、Ingress与AlbConfig的关系
ALB Ingress Controller通过API Server获取Ingress资源的变化,动态地生成AlbConfig,然后依次创建ALB实例、监听、路由转发规则以及后端服务器组。Kubernetes中Service、Ingress与AlbConfig有着以下关系:
- Service是后端真实服务的抽象,一个Service可以代表多个相同的后端服务。
- Ingress是反向代理规则,用来规定HTTP/HTTPS请求应该被转发到哪个Service上。例如,根据请求中不同的Host和URL路径,让请求转发到不同的Service上。
- AlbConfig是在ALB Ingress Controller提供的CRD资源,使用AlbConfig CRD来配置ALB实例和监听。一个AlbConfig对应一个ALB实例。

一个AlbConfig对应一个ALB实例,如果一个ALB实例配置多个转发规则,那么一个AlbConfig则对应多个Ingress,所以AlbConfig与Ingress是一对多的对应关系。
创建AlbConfig
一个AlbConfig对应一个ALB实例,如果您需要使用多个ALB实例,可以通过创建多个AlbConfig实现。创建AlbConfig操作如下。
创建并拷贝以下内容到alb-test.yaml文件中,用于创建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo spec: config: name: alb-test addressType: Internet zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15****
参数
说明
spec.config.name
(可选)表示ALB实例的名称。
spec.config.addressType
(必选)表示负载均衡的地址类型。取值如下:
Internet(默认值):负载均衡具有公网IP地址,DNS域名被解析到公网IP,因此可以在公网环境下访问。
Intranet:负载均衡只有私网IP地址,DNS域名被解析到私网IP,因此只能被负载均衡所在VPC的内网环境访问。
spec.config.zoneMappings
(必选)用于设置ALB Ingress交换机ID。至少需要指定两个不同可用区交换机ID,指定的交换机必须在ALB当前所支持的可用区内,且与集群处于同一VPC。关于ALB Ingress支持的地域与可用区,请参见支持的地域与可用区。
执行以下命令,创建AlbConfig。
kubectl apply -f alb-test.yaml
预期输出:
AlbConfig.alibabacloud.com/alb-demo created
执行以下命令,查看AlbConfig名称。
kubectl -n kube-system get AlbConfig
预期输出:
NAME AGE alb-demo 87m
AlbConfig默认配置的内容如下:
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: alb-demo # AlbConfig名称。 spec: config: accessLogConfig: logProject: "" logStore: "" addressAllocatedMode: Dynamic addressType: Internet billingConfig: internetBandwidth: 0 internetChargeType: "" payType: PostPay deletionProtectionEnabled: true edition: Standard forceOverride: false zoneMappings: - vSwitchId: vsw-wz92lvykqj1siwvif**** # AlbConfig的vSwitch,AlbConfig需要配置两个vSwitch。 - vSwitchId: vsw-wz9mnucx78c7i6iog**** # AlbConfig的vSwitch。 status: loadBalancer: dnsname: alb-s2em8fr9debkg5****.cn-shenzhen.alb.aliyuncs.com id: alb-s2em8fr9debkg5****
更新AlbConfig
在K8s中,kubectl apply
命令的语义为覆盖式更新;kubectl edit
命令的语义为在之前对象的基础上进行增量更新。已经通过AlbConfig创建的ALB实例,更改实例配置时推荐使用kubectl edit
命令进行增量式更新。更新AlbConfig操作如下。
执行以下命令,查看AlbConfig名称。
kubectl -n kube-system get AlbConfig
预期输出:
NAME AGE alb-demo 87m
执行以下命令,更新对应AlbConfig。
重要通过
kubectl apply
命令对AlbConfig进行覆盖式更新时,如果对应AlbConfig的YAML文件中没有listeners
相关配置,不会对存量监听产生影响;如果有监听配置,会按照当前配置调谐监听,因此需要将使用到的全量监听列表写全,例如80和443等常见监听。kubectl -n kube-system edit AlbConfig alb-demo ... spec: config: name: test # 输入修改后的名称。 ...
使用IngressClass关联AlbConfig与Ingress
AlbConfig通过K8s中标准的IngressClass资源与Ingress进行关联。您需要先创建IngressClass,然后关联AlbConfig。
创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。
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-demo
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-demo
执行以下命令,创建IngressClass。
kubectl apply -f alb.yaml
预期输出:
ingressclass.networking.k8s.io/alb created
在Ingress的YAML中通过
ingressClassName
参数指定名称为alb的IngressClass,关联AlbConfig。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
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: cafe-ingress 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
修改ALB实例的名称
如果您需要修改ALB实例的名称,可以执行以下命令。保存之后,新名称自动生效。
kubectl -n kube-system edit AlbConfig alb-demo
...
spec:
config:
name: test # 输入修改后的名称。
...
修改AlbConfig的vSwitch配置
如果您需要修改AlbConfig的vSwitch配置。保存之后,新配置自动生效。
kubectl -n kube-system edit AlbConfig alb-demo
...
zoneMappings:
- vSwitchId: vsw-wz92lvykqj1siwvif****
- vSwitchId: vsw-wz9mnucx78c7i6iog****
...
使用IPV6地址
在创建ALB实例时,通过AlbConfig中addressIpVersion
字段指定DualStack
即可开启IPV6支持
addressIpVerison
字段仅在创建实例阶段生效,后续不能修改。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
addressIpVersion: DualStack
...
指定TLS安全策略
当前ALBConfig配置HTTPS监听时,支持指定TLS安全策略。TLS安全策略包含自定义策略和系统默认策略,更多信息,请参见TLS安全策略。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
#...
listeners:
- port: 443
protocol: HTTPS
securityPolicyId: tls_cipher_policy_1_1
#...
开启日志服务访问日志
如果您希望ALB Ingress能够收集访问日志Access Log,可以在AlbConfig中指定logProject
和logStore
。
logProject
需要手动创建,不支持自动创建。创建logProject
的具体操作,请参见管理Project。logStore
命名需要以alb_
开头,若指定logStore
不存在,系统则会自动创建。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: alb-demo
spec:
config:
accessLogConfig:
logProject: "k8s-log-xz92lvykqj1siwvif****"
logStore: "alb_****"
#...
保存命令之后,可以在日志服务控制台,单击目标LogStore,查看收集的访问日志。
复用已有ALB实例
如果您希望复用已有ALB实例,需要在创建AlbConfig时指定ALB实例ID。
通过AlbConfig复用已有ALB实例不支持基础版ALB实例,请使用标准版ALB实例。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: reuse-alb
spec:
config:
id: ****
forceOverride: false # 表示是否覆盖已有监听,true表示强制覆盖,false表示不覆盖。
创建并使用多个ALB实例
如果您希望使用多个ALB实例,在Ingress中通过spec.ingressClassName
指定不同的IngressClass即可。
创建并拷贝以下内容到alb-demo2.yaml文件中,用于创建AlbConfig。
apiVersion: alibabacloud.com/v1 kind: AlbConfig metadata: name: demo spec: config: name: alb-demo2 # ALB实例名称。 addressType: Internet # 负载均衡具有公网IP地址。 zoneMappings: - vSwitchId: vsw-uf6ccg2a9g71hx8go**** - vSwitchId: vsw-uf6nun9tql5t8nh15****
执行以下命令,创建AlbConfig。
kubectl apply -f alb-demo2.yaml
预期输出:
AlbConfig.alibabacloud.com/demo created
创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。
1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: IngressClass metadata: name: alb-demo2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: demo
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: IngressClass metadata: name: alb-demo2 spec: controller: ingress.k8s.alibabacloud/alb parameters: apiGroup: alibabacloud.com kind: AlbConfig name: demo
执行以下命令,创建IngressClass。
kubectl apply -f alb.yaml
预期输出:
ingressclass.networking.k8s.io/alb-demo2 created
在Ingress的YAML中通过
ingressClassName
指定不同的ALB实例。1.19版本之前集群
apiVersion: networking.k8s.io/v1beta1 kind: Ingress metadata: name: demo namespace: default spec: ingressClassName: alb-demo2 rules: - host: "" http: paths: - backend: serviceName: demo-service servicePort: 80 path: /hello pathType: ImplementationSpecific
1.19及之后版本集群
apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: demo namespace: default spec: ingressClassName: alb-demo2 rules: - host: "" http: paths: - backend: service: name: demo-service port: number: 80 path: /hello pathType: ImplementationSpecific
设置监听连接请求超时时间
在ALBConfig中,可以指定监听,设置连接请求超时时间(单位为秒,取值范围为[1,180]。若在超时时间内后端服务器一直没有响应,负载均衡将放弃等待,给客户端返回HTTP 504错误码。如果不指定连接请求超时时间,则默认为60s。YAML示例如下。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
requestTimeout: 60
...
使用数据压缩功能
在ALBConfig中,可以指定监听,设置数据压缩是否开启。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: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
gzipEnabled: false
...
获取来访者真实IP
在ALBConfig中可以通过X-Forwarded-For
头字段获取来访者真实IP。XForwardedForEnabled取值如下:
true:获取来访者真实IP。
false:不获取来访者真实IP。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
#...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForEnabled: true
#...
获取实例的监听协议
在ALBConfig中可以通过X-Forwarded-For
头字段获取实例的监听协议。XForwardedForProtoEnabled取值如下:
true:获取实例的监听协议。
false:不获取实例的监听协议。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForProtoEnabled: true
...
获取负载均衡实例的ID
在ALBConfig中可以通过SLB-ID
头字段获取负载均衡实例的ID。XForwardedForSLBIdEnabled取值如下:
true:获取负载均衡实例的ID。
false:不获取负载均衡实例的ID。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBIdEnabled: true
...
获取实例的监听端口
在ALBConfig中可以通过X-Forwarded-Port
头字段获取实例的监听端口。XForwardedForSLBPortEnabled取值如下:
true:获取实例的监听端口。
false:不获取实例的监听端口。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForSLBPortEnabled: true
...
获取负载均衡实例客户端的端口
在ALBConfig中可以通过X-Forwarded-Client-srcport
头字段获取负载均衡实例客户端的端口。XForwardedForClientSrcPortEnabled取值如下:
true:获取负载均衡实例客户端的端口。
false:不获取负载均衡实例客户端的端口。
仅HTTP和HTTPS监听支持配置此参数。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
...
listeners:
- port: 80
protocol: HTTP
xForwardedForConfig:
XForwardedForClientSrcPortEnabled: true
...
设置ACL访问控制
通过ALBConfig可以为ALB监听启用访问控制功能,通过设置入方向的允许或拒绝规则,对客户端请求精确控制,管理请求转发。关于ACL的更多信息,请参见访问控制。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
name: default
spec:
config:
#...
listeners:
- port: 80
protocol: HTTPS
aclConfig:
aclEntries:
- 127.0.0.1/32
aclType: White
#...
部分参数说明如下:
aclType:用于设置监听的ACL为黑名单或白名单。取值为Black和White,分别表示黑名单和白名单。
aclEntries:用于设置访问控制条目IP地址段,例如127.0.0.1/32。
删除ALB实例
一个ALB实例对应一个AlbConfig, 因此可以通过删除AlbConfig实现删除ALB实例,但前提是先需要删除AlbConfig关联的所有Ingress。
kubectl -n kube-system delete AlbConfig alb-demo
alb-demo
可以替换为您实际需要删除的AlbConfig。