通过AlbConfig配置ALB实例

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

功能索引

前提条件

注意事项

  • 推荐优先使用命令直接修改、更新资源的配置。如果必须使用kubectl apply命令来修改、更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再执行kubectl apply命令将变更应用到Kubernetes集群。

  • 低版本Nginx Ingress Controller无法识别Ingress资源中的spec:ingressClassName字段。如果集群中同时存在Nginx Ingress和ALB Ingress,会存在ALB Ingress被低版本Nginx Ingress Controller调谐的风险。因此,请及时升级Nginx Ingress Controller版本,或通过Annotation注解项指定ALB Ingress对应的ingressClass。具体操作,请参见升级Nginx Ingress Controller组件ALB Ingress服务高级用法

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实例。

ALB Ingress

一个AlbConfig对应一个ALB实例,但一个AlbConfig可对应多个Ingress,即AlbConfig与Ingress是一对多的对应关系。例如,一个ALB实例配置多个转发规则,那么一个AlbConfig则对应多个Ingress。

创建AlbConfig

一个AlbConfig对应一个ALB实例,如果您需要使用多个ALB实例,可以通过创建多个AlbConfig实现。创建AlbConfig操作如下。

  1. 创建并拷贝以下内容到alb-test.yaml文件中,用于创建AlbConfig。

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb-demo
    spec:
      config:
        name: alb-test
        addressAllocatedMode: Dynamic # 可选,通过该参数可指定ALB实例的IP模式。
        addressType: Internet
        zoneMappings:
        - vSwitchId: vsw-uf6ccg2a9g71hx8go****
        - vSwitchId: vsw-uf6nun9tql5t8nh15****
      listeners:
        - port: 80
          protocol: HTTP

    参数

    说明

    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支持的地域与可用区,请参见支持的地域与可用区

    重要

    不支持更新ALB实例的地址类型及可用区。即Albconfig中的addressTypezoneMappings参数仅在创建Albconfig时生效,不支持更新。

    spec.config.addressAllocatedMode

    (可选)在AlbConfig中,可以通过addressAllocatedMode参数指定ALB实例IP模式。取值:

    • Dynamic:动态IP模式。

    • Fixed:固定IP模式。

    为集群安装ALB Ingress Controller组件时,系统将会默认创建AlbConfig。AlbConfig的配置参数除vSwitchID外,其他参数将会按照以下的默认配置创建。

    展开查看AlbConfig的默认配置

    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb-demo                      # 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: vsw-wz92lvykqj1siwvif****        # AlbConfig的vSwitch,AlbConfig需要配置两个vSwitch。
        - vSwitchId: vsw-wz9mnucx78c7i6iog****        # AlbConfig的vSwitch。
    status:
      loadBalancer:
        dnsname: alb-s2em8fr9debkg5****.cn-shenzhen.alb.aliyuncs.com
        id: alb-s2em8fr9debkg5****
  2. 执行以下命令,创建AlbConfig。

    kubectl apply -f alb-test.yaml

    预期输出:

    albconfig.alibabacloud.com/alb-demo created
  3. 执行以下命令,查看AlbConfig名称。

    kubectl -n kube-system get AlbConfig

    预期输出:

    NAME       ALBID        DNSNAME                                  PORT&PROTOCOL   CERTID                 AGE
    alb-demo   alb-******   alb-******.<regionID>.alb.aliyuncs.com   443/HTTPS       11055487-cn-<regionID>  2d

更新AlbConfig

在K8s中,kubectl apply命令的语义为覆盖式更新;kubectl edit命令的语义为在之前对象的基础上进行增量更新。已经通过AlbConfig创建的ALB实例,更改实例配置时推荐使用kubectl edit命令进行增量式更新。更新AlbConfig操作如下。

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

    kubectl -n kube-system get AlbConfig

    预期输出:

    NAME       ALBID        DNSNAME                                  PORT&PROTOCOL   CERTID                 AGE
    alb-demo   alb-******   alb-******.<regionID>.alb.aliyuncs.com   443/HTTPS       11055487-cn-<regionID>  2d
  2. 执行如下命令,更新对应的AlbConfig。

    重要
    • 优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

    • 通过kubectl apply命令对AlbConfig进行覆盖式更新时,如果对应AlbConfig的YAML文件中没有listeners相关配置,不会对存量监听产生影响;如果有监听配置,会按照当前配置调谐监听,因此需要将使用到的全量监听列表写全,例如80和443等常见监听。

    kubectl -n kube-system edit AlbConfig alb-demo

    在AlbConfig配置文件中,更新相关内容。例如,将AlbConfig的名称更新为test

    ...
     spec:
     config:
     name: test # 输入更新后的名称。
    ...

使用IngressClass关联AlbConfig与Ingress

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

AlbConfig通过K8s中标准的IngressClass资源与Ingress进行关联。您需要先创建IngressClass,然后关联AlbConfig。

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

    kubectl apply -f alb.yaml

    预期输出:

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

    kubectl apply -f ingress.yaml

    预期输出:

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

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

修改ALB实例的名称

执行以下命令,可修改ALB实例的名称。

重要

优先推荐使用kubectl edit命令直接修改资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

kubectl -n kube-system edit AlbConfig alb-demo

在配置文件中修改config.name的值,保存之后,新名称自动生效。

...
  spec:
    config:
      name: test   # 输入修改后的名称。
...

修改AlbConfig的vSwitch配置

执行以下命令,可修改AlbConfig的vSwitch配置。

重要

推荐优先使用kubectl edit命令直接修改资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

kubectl -n kube-system edit AlbConfig alb-demo

在配置文件中修改zoneMappings.vSwitchId的值,保存之后,新配置自动生效。

...
  zoneMappings:
    - vSwitchId: vsw-wz92lvykqj1siwvif**** # 输入新的vSwitchId。
    - vSwitchId: vsw-wz9mnucx78c7i6iog**** # 输入新的vSwitchId。
...

使用IPV6地址

在创建ALB实例时,通过AlbConfig中addressIpVersion字段指定DualStack即可开启IPV6支持

重要

addressIpVerison字段仅在创建实例阶段生效,后续不能修改。

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: alb-demo
spec:
  config:
    addressIpVersion: DualStack
    ...

指定TLS安全策略

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

当前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
  #...

开启日志服务访问日志

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

如果您希望ALB Ingress能够收集访问日志Access Log,可以在AlbConfig中指定logProjectlogStore

说明
  • 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,且已有的ALB实例必须是通过应用型负载均衡ALB控制台创建的标准版或WAF增强版实例。不支持复用基础版ALB实例。

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

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表示不覆盖。

创建并使用多个ALB实例

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

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

    kubectl apply -f alb-demo2.yaml

    预期输出:

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

    kubectl apply -f alb.yaml

    预期输出:

    ingressclass.networking.k8s.io/alb-demo2 created
  5. 创建并拷贝以下内容到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

设置监听连接请求超时时间

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

在ALBConfig中可以指定监听,设置连接请求超时时间(单位为秒,取值范围为[1,180])。若在超时时间内后端服务器一直没有响应,负载均衡将放弃等待,给客户端返回HTTP 504错误码。如果不指定连接请求超时时间,则默认为60秒。YAML示例如下。

apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: default
spec:
  config:
    ...
  listeners:
  - port: 80
    protocol: HTTP
    requestTimeout: 60
  ...

使用数据压缩功能

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

在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访问控制

重要

优先推荐使用kubectl edit命令直接更新资源的配置。如果必须使用kubectl apply命令来更新资源,请在执行kubectl apply命令之前先执行kubectl diff命令预览变更点,确保变更符合预期,然后再使用kubectl apply命令将变更应用到Kubernetes集群。

通过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为黑名单或白名单。取值为BlackWhite,分别表示黑名单和白名单。

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

删除ALB实例

一个ALB实例对应一个AlbConfig, 因此可以通过删除AlbConfig实现删除ALB实例,但前提是先需要删除AlbConfig关联的所有Ingress。

kubectl delete -n kube-system delete AlbConfig alb-demo

alb-demo可以替换为您实际需要删除的AlbConfig。

删除复用ALB实例的AlbConfig

如果您希望删除复用ALB实例的AlbConfig,请按照以下操作步骤操作。

  1. 删除该AlbConfig关联的所有Ingress。

    kubectl delete -n <NAMESPACE> ingress <INGRESS_NAME>  # 将<INGRESS_NAME>和<NAMESPACE>替换为要删除的Ingress的名称和命名空间。
  2. 使用kubectl edit命令修改AlbConfig,删除此AlbConfig的所有监听,即删除spec.listeners字段下的所有条目。

    重要

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

  3. 删除AlbConfig。

    kubectl -n kube-system delete AlbConfig alb-demo # 请将alb-demo替换为您实际需要删除的AlbConfig。