AlbConfig是由ALB Ingress Controller提供的CRD资源,ALB Ingress Controller使用AlbConfig来配置ALB实例和监听。本文介绍如何创建、修改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实例,如果一个ALB实例配置多个转发规则,那么一个AlbConfig则对应多个Ingress,所以AlbConfig与Ingress是一对多的对应关系。

注意事项

  • Kubernetes版本≥1.18。
  • 如果您使用的是Flannel网络插件,则ALB Ingress后端Service服务仅支持NodePort和LoadBalance类型。

创建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
        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当前所支持的可用区内。关于ALB Ingress支持的地域与可用区,请参见支持的地域与可用区
  2. 执行以下命令,创建AlbConfig。
    kubectl apply -f alb-test.yaml
    预期输出:
    AlbConfig.alibabacloud.com/alb-demo created
  3. 执行以下命令,查看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****

关联Ingress

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

  1. 创建并拷贝以下内容到alb.yaml文件中,用于创建IngressClass。
    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
    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。
    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
    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支持
注意
  • 目前ALB使用IPV6需要白名单权限,请提交工单申请白名单。
  • addressIpVerison字段仅在创建实例阶段生效,后续不能修改。
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: alb-demo
spec:
  config:
    addressIpVersion: DualStack
    ...

指定HTTPS证书

通过ALBConfig可以指定ALB证书,您可以通过配置ALBConfig的listeners,指定HTTPS的证书ID。具体操作步骤如下:

  1. 登录数字证书管理服务控制台
  2. 在数字证书管理服务控制台左侧导航栏,单击SSL证书
  3. SSL证书页面,单击上传证书页签。
  4. 在目标证书右侧操作列下,选择更多 > 详情,获取证书ID。
    证书详情示例如下:证书详情示例
  5. 编辑并保存AlbConfig YAML文件。
    apiVersion: alibabacloud.com/v1
    kind: AlbConfig
    metadata:
      name: alb-demo
    spec:
      config:
        #...
      listeners:
      - caEnabled: false
        certificates:
        - CertificateId: 756****-cn-hangzhou
          IsDefault: true
        port: 443
        protocol: HTTPS
      #...
    AlbConfig部分参数说明如下:
    参数 说明
    CertificateId 表示证书ID。本文配置为756****-cn-hangzhou756****为上一步获取的证书ID。

    CertificateId格式示例及说明如下:

    • 中国地域:756****-cn-hangzhou-cn-hangzhou为固定内容,配置时您只需替换756****即可。
    • 海外地域:756****-ap-southeast-1-ap-southeast-1为固定内容,配置时您只需替换756****即可。
    IsDefault 表示是否为默认证书。本文配置为true,表示是默认证书。
    protocol 表示支持监听的协议类型。本文配置为 HTTPS,表示支持HTTPS协议的监听。

支持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中指定logProjectlogStore
说明 当前Log Project需要您手动创建,不支持自动创建。创建Log Project的具体操作,请参见管理Project
apiVersion: alibabacloud.com/v1
kind: AlbConfig
metadata:
  name: alb-demo
spec:
  config:
    accessLogConfig:
      logProject: "k8s-log-xz92lvykqj1siwvif****"
      logStore: "alb_****"
    #...
说明 logStore命名需要以alb_开头,若指定logStore不存在,系统则会自动创建。
保存命令之后,可以在日志服务控制台,单击目标LogStore,查看收集的访问日志。ALB Ingress日志.png

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

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

删除ALB实例

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

kubectl -n kube-system delete AlbConfig alb-demo

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