通过AlbConfig配置ALB实例

AlbConfig是由ALB Ingress Controller提供的CRD资源,ALB Ingress Controller使用AlbConfig配置ALB实例和监听。本文介绍如何创建、修改、更新AlbConfig以及开启日志服务等操作。

功能索引

ALB实例配置

监听配置

前提条件

注意事项

  • 推荐优先使用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资源。

  1. 创建并拷贝以下内容到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的默认配置

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb # AlbConfig名称。
    spec:
      config:
        accessLogConfig:
          logProject: ""
          logStore: ""
        addressAllocatedMode: Dynamic # 在AlbConfig中,可以通过addressAllocatedMode参数指定ALB实例IP模式,可取值为Dynamic(动态IP模式)和Fixed(固定IP模式)。
        addressType: Internet
        billingConfig:
          internetBandwidth: 0
          internetChargeType: ""
          payType: PostPay
        deletionProtectionEnabled: true
        edition: Standard
        forceOverride: false
        zoneMappings:
        - vSwitchId: #...
        - vSwitchId: #...
    status:
      loadBalancer:
        dnsname: alb-s2em8fr9debkg5****.cn-shenzhen.alb.aliyuncs.com
        id: alb-s2em8fr9debkg5****
  2. 执行以下命令,创建AlbConfig。

    kubectl apply -f alb.yaml

    预期输出:

    AlbConfig.alibabacloud.com/alb created
  3. 执行以下命令,查看AlbConfig资源。

    kubectl get AlbConfig

    预期输出:

    NAME   ALBID        DNSNAME                                  PORT&PROTOCOL   CERTID   AGE
    alb    alb-******   alb-******.<regionID>.alb.aliyuncs.com                            28m
    说明

    创建HTTPS监听并为其配置证书后,PORT&PROTOCOLCERTID中才会显示内容,内容为空是正常现象。

复用已有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

参数说明如下:

参数

说明

id

  • 若没有id字段或id字段为空,表示ALB实例为非复用场景。此时,forceOverride字段与listenerForceOverride字段均不生效。

  • id字段为有效值时,表示ALB实例为复用场景。

    • forceOverride字段为true,将强制覆盖ALB实例属性及监听属性。

    • forceOverride字段为false,则不会强制覆盖ALB实例属性,且根据listenerForceOverride字段决定是否强制覆盖监听属性。

重要

在复用场景下,不建议您手动修改监听名称,以免错误地将监听置于或脱离ACK的控制。由AlbConfig创建或更新的监听由ACK管理,且监听名称的默认格式为ingress-auto-listener-{port};其他格式的监听名称由ALB控制台管理。

forceOverride

表示复用模式下是否强制覆盖ALB实例属性。

  • true表示强制覆盖。

  • false表示不覆盖。不覆盖场景下编辑AlbConfig将不改变ALB实例属性。

listenerForceOverride

表示复用模式下是否强制覆盖监听属性。

  • true表示强制覆盖。

  • false表示不覆盖。

更新AlbConfig

对于已经通过AlbConfig创建的ALB实例,更改实例配置时推荐使用kubectl edit命令进行更新。更新AlbConfig操作如下。

  1. 执行以下命令,查看AlbConfig名称。

    kubectl get AlbConfig

    预期输出:

    NAME       ALBID        DNSNAME                                  PORT&PROTOCOL   CERTID   AGE
    alb        alb-******   alb-******.<regionID>.alb.aliyuncs.com                            28m
  2. 执行以下命令编辑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资源中填入

  1. 创建并拷贝以下内容到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
  2. 执行以下命令,创建IngressClass。

    kubectl apply -f ingress_class.yaml

    预期输出:

    ingressclass.networking.k8s.io/alb created
  3. 创建并拷贝以下内容到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
  4. 执行以下命令,创建Ingress。

    kubectl apply -f ingress.yaml

    预期输出:

    ingress.networking.k8s.io/cafe-ingress created

完成上述步骤,就可以使用IngressClass关联AlbConfig与Ingress。

创建并使用多个ALB实例

如果您希望同时使用多个ALB实例,在Ingress资源中通过spec.ingressClassName指定不同的IngressClass,即可将Ingress关联到不同的ALB实例。

  1. 创建并拷贝以下内容到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****
  2. 执行以下命令,创建AlbConfig。

    kubectl apply -f alb-2.yaml

    预期输出:

    AlbConfig.alibabacloud.com/alb-2 created
  3. 创建并拷贝以下内容到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的名称
  4. 执行以下命令,创建IngressClass。

    kubectl apply -f ingress_class2.yaml

    预期输出:

    ingressclass.networking.k8s.io/alb-2 created
  5. 创建并拷贝以下内容到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
  6. 执行以下命令,创建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中指定logProjectlogStore

说明
  • 创建集群时,您选择了自动创建或使用已有日志服务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,请按照以下操作步骤操作。

  1. 使用kubectl edit命令修改AlbConfig,删除此AlbConfig的所有监听,即删除spec.listeners字段下的所有条目。

    重要

    若您集群中安装的ALB Ingress Controller组件版本为v2.10.0-aliyun.1及以前版本,请执行该操作。否则,请跳过该步骤。

  2. 执行以下命令,删除AlbConfig。

    重要

    删除AlbConfig前,请删除其关联的所有Ingress资源。

    kubectl delete AlbConfig <AlbConfig_NAME> # <AlbConfig_NAME>替换AlbConfig的名称

创建监听

监听(Listeners)是ALB实例用来处理实际流量的顶层入口。只有创建了监听,ALB实例才能对外开放端口,接收客户端的请求。

在AlbConfig中设置portprotocol即可创建对应的监听。一旦修改了portprotocol以及其他监听的属性,系统将会把原有的监听删除,然后创建一个新的监听来替代它。

监听可以使用三种应用层协议: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为黑名单或白名单。取值为BlackWhite,分别表示黑名单和白名单。

  • aclEntries:用于设置访问控制条目IP地址段,例如127.0.0.1/32。