You need to enable JavaScript to run this app.
导航

通过 kubectl 创建 ALB Ingress

最近更新时间2024.03.01 14:07:23

首次发布时间2023.11.17 14:23:37

ALB Ingress 基于火山引擎应用型负载均衡(Application Load Balancer,ALB),提供更加丰富的七层负载均衡能力。本文主要介绍通过 YAML 文件创建 ALBInstance,并配置 ALB Ingress 的相关操作。

背景信息

ALBInstance 是 ALB Ingress Controller 管理的 CRD 资源,ALB Ingress Controller 使用 ALBInstance 来配置和监听 ALB 实例。
alt

说明

一个 ALBInstance 对应一个 ALB 实例,但一个 ALBInstance 可对应多个 Ingress,即 ALBInstance 与 Ingress 是一对多的对应关系。

使用限制

  • 请勿擅自在 ALB 控制台上更改通过创建 ALB Ingress 维护的 ALB 实例、监听器、后端服务器组和转发规则,否则将造成集群中的 Ingress 服务异常,须自行承担责任。
  • 请勿修改监听器和后端服务器组的名称中带有k8s_前缀的内容。
  • 请勿修改转发规则描述中带有k8s_前缀的内容。
  • 若在 ALB 控制台上修改 ALB Ingress 指定或维护的资源和配置(例如:转发规则),可能存在配置被覆盖的风险。
  • 使用应用型负载均衡(Application Load Balancer,ALB)产品,会产生云基础资源使用费用。详细信息,请参见 应用型负载均衡产品计费

创建 ALBInstance

对接已有 ALB 实例

使用如下 YAML 配置,创建 ALBInstance 并对接已有 ALB 实例。

apiVersion: loadbalancer.vke.volcengine.com/v1beta1
kind: ALBInstance
metadata:
  name: alb # ALBInstance 资源名称
spec:
  instanceID: "alb-2dgns526uiv41fi5***" # 已有 ALB 实例的 ID。
  listeners:
  - protocol: "HTTP" # 监听器的协议
    port: 80 # 监听器协议为 HTTP 时的监听端口
  - protocol: "HTTPS" # 监听器的协议
    port: 443 # 监听器协议为 HTTPS 时的监听端口
    certificateID: "cert-2wx20lm7uquww7oot***" # 监听器协议为 HTTPS 时默认全域名使用的服务器证书
    domainExtensions:
    - domain: "test.com" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
      certificateID: "cert-2wx20lo6vuww07oot***" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
    enableHTTP2: true
    enableQUIC: true

spec字段中的详细参数说明如下所示。

字段类型是否必选描述取值示例是否支持修改
instanceIDString指定已存在的 ALB 实例 ID。alb-2dgns526uiv41fi5***

listeners.protocol

String

监听器协议。取值:

  • HTTP(默认值)
  • HTTPS

HTTP

listeners.port

Integer

监听器端口。取值:

  • 取值范围:1~65535
  • 默认值:80

80

listeners.certificateIDString监听器关联的证书 ID,创建 HTTPS 监听器时必选。cert-2wx20lm7uquww7***

listeners.domainExtensions.domain

String

HTTPS 监听器关联的扩展域名。

说明

需要和listeners.domainExtensions.certificateID同时配置。

test.com

listeners.domainExtensions.certificateID

String

HTTPS 监听器扩展域名使用的服务器证书。

说明

需要和listeners.domainExtensions.domain同时配置。

cert-2wx20lo6vuww07***

listeners.enableHTTP2

Boolean

HTTP2.0 特性开关,该参数仅对 HTTPS 监听器有效。取值:

  • true:启用 HTTP2.0 协议特性。
  • false:(默认值)禁用 HTTP2.0 协议特性。

true

listeners.enableQUIC

Boolean

QUIC 特性开关,该参数仅对 HTTPS 监听器有效。取值:

  • true:启用 QUIC 协议特性。
  • false:(默认值)禁用 QUIC 协议特性。

true

说明

当您选择创建 HTTPS 协议的监听器时,需要首先完成 HTTPS 证书配置,详情请参见 配置 HTTPS 证书

新建 ALB 实例

使用如下 YAML 配置,创建 ALBInstance 并同时创建新的 ALB 实例。

apiVersion: loadbalancer.vke.volcengine.com/v1beta1
kind: ALBInstance
metadata:
  name: alb # ALBInstance 资源名称
spec:
  instance:
    name: "demo-alb" # ALB 实例名称
    zoneMappings: # ALB 实例位于多可用区的子网列表
    - subnetId: "subnet-bp12mw1f8k3jg0****" # 子网 ID,用于 ALB 实例在此可用区下的私网 IP 地址分配
    - subnetId: "subnet-bp12mw1f8k3jg1****" 
    addressType: "public" # 负载均衡类型。取值:public(公网类型)、 private(私网类型)
    eipSpec:
      isp: "BGP" # 公网负载均衡实例的 EIP 线路类型。取值:BGP
      bandwidth: 10 # 带宽上限。当 billingType 为 2 时,取值范围为 1~500Mbps;当 billingType 为 3 时,取值范围为 1~200Mbps
      billingType: 2 # 计费类型。取值:2(按量计费-按带宽上限)、3(按量计费-按实际流量)
      bandwidthPackageID: "bwp-2d63yyj3ki4u858oz***" # 共享带宽资源包 ID
    ipVersion: "ipv4" # IP 版本。取值:ipv4
    deleteProtection: "on" # ALB 实例的删除保护功能,on 表示开启,off 表示关闭
  listeners:
  - protocol: "HTTP" # 监听器的协议
    port: 80 # 监听器协议为 HTTP 时的监听端口
  - protocol: "HTTPS" # 监听器的协议
    port: 443 # 监听器协议为 HTTPS 时的监听端口
    certificateID: "cert-2wx20lm7uquww7oot********" # 监听器协议为 HTTPS 时默认全域名使用的服务器证书
    domainExtensions:
    - domain: "test.com" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
      certificateID: "cert-2wx20lo6vuww07oot********" # 监听器协议为 HTTPS 时支持指定域名绑定服务器证书
    enableHTTP2: true
    enableQUIC: true

spec字段中的详细参数说明如下所示。

字段类型是否必选描述取值示例是否支持修改
instance.nameString新创建 ALB 的实例名称。alb

instance.zoneMappings.N.subnetId

String

子网 ID,ALB 实例在此可用区下的私网 IP 地址将从此子网网段中分配。

注意

  • 允许配置多个不同的子网。
  • 多个不同的子网不允许位于同一可用区。

subnet-bp12mw1f8k3jg0***

instance.addressType

String

新创建 ALB 的网络类型。取值:

  • public:(默认值)公网
  • private:私网

public

instance.eipSpec.isp

String

公网 ALB 实例的公网 IP 线路类型。包括:BGP、SingleLine_BGP、Static_BGP、Fusion_BGP、ChinaMobile、ChinaTelecom、ChinaUnicom、ChinaMobile_Value、ChinaUnicom_Value 和 ChinaTelecom_Value。详细参数解释,请参见 EIP 产品文档

注意

除 BGP 外,其他线路类型均为 EIP 产品的邀测功能,如需使用,请 提交工单 或联系客户经理申请。

BGP

instance.eipSpec.bandwidth

Integer

公网 ALB 实例的公网 IP 的带宽峰值。

  • instance.eipSpec.billingType取值为 2 时,取值范围为 1~500,单位为 Mbps。
  • instance.eipSpec.billingType取值为 3 时,取值范围为 1~200,单位为 Mbps。

说明

如果您通过工单提升了 EIP 的带宽上限,则此处的带宽取值范围会同步提升。详情请参见 EIP 使用限制

10

instance.eipSpec.billingType

Integer

公网 ALB 实例的公网 IP 的计费方式。取值:

  • 2:(默认值)表示按量计费-按带宽上限计费。
  • 3,表示按量计费-按实际流量计费。

2

instance.eipSpec.bandwidthPackageIDString共享带宽包 ID。-
instance.ipVersionStringIP 版本。取值固定为 ipv4。ipv4

instance.deleteProtection

String

ALB 实例的删除保护功能,取值:

  • on:表示开启删除保护功能。
  • off:(默认值)表示禁用删除保护功能。

on

listeners.protocol

String

监听器协议。取值:

  • HTTP:(默认值)监听器使用 HTTP 协议。
  • HTTPS:监听器使用 HTTPS 协议。

HTTP

listeners.port

Integer

监听器端口。取值:

  • 取值范围:1~65535
  • 默认值:80

80

listeners.certificateIDString监听器关联的证书 ID,创建 HTTPS 监听器时必选。cert-2wx20lm7uquww7***

listeners.domainExtensions.domain

String

HTTPS 监听器关联的扩展域名。

说明

需要和listeners.domainExtensions.certificateID同时配置。

test.com

listeners.domainExtensions.certificateID

String

HTTPS 监听器扩展域名使用的服务器证书。

说明

需要和listeners.domainExtensions.domain同时配置。

cert-2wx20lo6vuww07***

listeners.enableHTTP2

Boolean

HTTP2.0 特性开关,该参数仅对 HTTPS 监听器有效。取值:

  • true:启用 HTTP2.0 协议特性。
  • false:(默认值)禁用 HTTP2.0 协议特性。

true

listeners.enableQUIC

Boolean

QUIC 特性开关,该参数仅对 HTTPS 监听器有效。取值:

  • true:启用 QUIC 协议特性。
  • false:(默认值)禁用 QUIC 协议特性。

true

说明

当您选择创建 HTTPS 协议的监听器时,需要首先完成 HTTPS 证书配置,详情请参见 配置 HTTPS 证书

查看 ALBInstance 名称和状态

当您在集群中创建 ALBInstance 后,可以使用如下方法确定 ALBInstance 的状态。

  1. 登录 容器服务控制台

  2. 单击左侧导航栏中的 集群

  3. 在集群列表页面,单击目标集群。

  4. 在集群管理页面的左侧导航栏中,选择 工作负载 > 对象浏览器

  5. 在 对象浏览器 页面的 CRD 分类下,单击 albinstance
    alt

  6. 在 albinstance 详情页面,查看创建的 ALBInstance 资源名称。
    alt

  7. 单击 操作 栏中的 编辑 Yaml,查看 ALBInstance 资源详情。其中status字段展示了 ALBInstance 资源的状态信息。
    alt

    status字段中不同的取值含义如下表所示。

    字段类型含义

    phase

    String

    表示 ALBInstance 资源状态:

    • Pending:表示关联的 ALBInstance 还未调谐完成。
    • Running:表示 ALBInstance 对应的配置都已经更新到服务端。
    • Configuring:表示 ALBInstance 处于调谐中。
    • Deleting:表示 ALBInstance 处于删除中。
    instanceIDString表示关联的 ALB 实例 ID。
    ingress*v1.LoadBalancerIngress表示 ALB 的 IP 地址、监听器端口和协议。

创建 ALB Ingress

基于域名转发

ALB Ingress 支持将不同的域名访问,转发到不同的后端。示例alb-ingress.yaml代码如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
spec:
  ingressClassName: alb  # ALBInstance 资源名称
  rules:
    - host: first.example.com  # 需要对外提供访问的域名
      http:
        paths:
        - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
          path: / # 请求匹配的路径
          backend:
            service:
              name: service-demo-a # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号
    - host: second.example.com  # 需要对外提供访问的域名
      http:
        paths:
        - pathType: Prefix # 路径匹配规则。取值:Exact(精确匹配)、Prefix(前缀匹配)
          path: / # 请求匹配的路径
          backend:
            service:
              name: service-demo-b # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号

基于路径转发

ALB Ingress 支持将相同域名、不同路径的访问,转发到不同的后端。示例alb-ingress.yaml代码如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
spec:
  ingressClassName: alb  # ALBInstance 资源名称
  rules:
    - host: example.com  # 需要对外提供访问的域名
      http:
        paths:
        - path: /foo # 请求匹配的路径
          pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
          backend:
            service:
              name: service-demo-a # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号
        - path: /bar # 请求匹配的路径
          pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
          backend:
            service:
              name: service-demo-b # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号

配置未指定 host 规则

ALB Ingress 支持配置未指定 host 规则。示例alb-ingress.yaml代码如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
spec:
  ingressClassName: alb  # ALBInstance 资源名称
  rules:
    - host: first.example.com  # 需要对外提供访问的域名
      http:
        paths:
        - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
          path: / # 请求匹配的路径
          backend:
            service:
              name: service-demo-a # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号
    - host: second.example.com  # 需要对外提供访问的域名
      http:
        paths:
        - pathType: Prefix # 路径匹配规则,默认为 Prefix(前缀匹配)
          path: / # 请求匹配的路径
          backend:
            service:
              name: service-demo-b # 需要对接的服务名称
              port: 
                number: 80 # 需要对接服务的端口号
    - http:
       paths:
       - pathType: Prefix
         path: /
         backend:
           service:
             name: service-demo
             port:
               number: 80

配置默认转发规则的后端服务器

示例alb-ingress.yaml代码如下:

apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: alb-ingress # 路由规则的名称
  namespace: default  # 路由规则所属的命名空间
spec:
  ingressClassName: alb  # ALBInstance 资源名称
  rules:
    - http:
       paths:
       - pathType: Prefix
         path: /
         backend:
           service:
             name: service-demo
             port:
               number: 80

附录

配置 HTTPS 证书

HTTPS 协议下配置路由规则需要提前上传证书到 ALB,并在 VKE 创建 Secret。可参考以下步骤创建自签名 HTTPS 证书。

  1. 通过个人终端为路由规则器端和客户端准备公钥、私钥。

    openssl genrsa -out server.key 1024    # 生成服务器端私钥
    openssl rsa -in server.key -pubout -out server.pem    # 生成服务器端公钥
    
  2. 生成 CA 证书。

    openssl genrsa -out ca.key 1024
    openssl req -new -key ca.key -out ca.csr
    openssl x509 -req -in ca.csr -signkey ca.key -out ca.crt
    
  3. 生成服务器端证书。

    依次执行以下命令,我们将得到 server.crtca.crtserver.key 三个文件。

    #服务器端需要向 CA 机构申请签名证书,在申请签名证书之前依然是创建自己的 CSR 文件
    openssl req -new -key server.key -out server.csr
    #向 CA 机构申请证书,签名过程需要 CA 的证书和私钥参与,最终颁发一个带有 CA 签名的证书
    openssl x509 -req -CA ca.crt -CAkey ca.key -CAcreateserial -in server.csr -out server.crt
    openssl x509 -in server.crt -out server.cer -outform der
    
  4. 上传服务器证书。

    1. 登录 应用型负载均衡控制台,在左侧导航栏单击 证书管理
    2. 在 证书管理 页面,单击 添加证书,配置参数。

      公钥证书 和 私钥证书 按如下说明配置,其余参数说明,请参见 添加证书
      • 证书类型 选择 服务器证书,将上一步(步骤 3)中获取的 server.crt 内容复制到 公钥证书 一栏;将 server.key 内容复制到 私钥证书 一栏。
      • 证书类型 选择 CA证书,将上一步(步骤 3)中获取的 ca.crt 内容复制到 CA公钥证书 一栏。
    3. 添加证书成功后,复制已创建好的证书 ID。
    4. 登录 容器服务控制台,在目标集群管理页面,选择 配置管理 > 保密字典,单击 创建保密字典
    5. 在 创建保密字典 页面,部分参数按如下说明配置,其余参数说明,请参见 创建保密字典
      • 选择创建类型为 密钥,输入键值对信息, 为cert_id 部分输入上一步复制的服务器证书 ID。

        alt
      • 添加 标签,标记证书的属性, 为lb.type 为alb,表示该证书是 ALB 证书。

        alt
    6. 在 HTTPS 协议的路由规则中使用证书。