创建ALB Ingress

使用ALB Ingress时,您需要在集群中创建多种资源以配置由ALB Ingress到后端Pod的完整转发路径。您可以参考本文快速部署示例后端应用,并创建ALB Ingress以对外提供服务。

注意事项

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

  • AlbConfig、Namespace、Ingress和Service这些资源的名称不能以aliyun开头。

  • 低版本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服务高级用法

使用说明

在您开始创建ALB Ingress之前,建议先通过ALB Ingress概述,了解它的原理和要求。确保满足以下资源条件:

说明

ACK专有集群中使用ALB Ingress,需要为ALB Ingress Controller授权。相关操作请参见为ACK专有集群授予ALB Ingress Controller访问权限

  • 在安装ALB Ingress组件时,您可以选择不同的ALB云原生网关实例来源,这将影响操作结果:

    • (推荐)选择新建使用已有

      Controller会自动创建名为alb的AlbConfig和相应的IngressClass资源。在AlbConfig中,默认配置一个监听端口为80、协议为HTTP的监听。

    • 选择暂不创建

      在创建ALB Ingress之前,您需要先手动创建AlbConfigIngressClass,因为Controller不会自动创建这些资源。

  • AlbConfig和IngressClass

    • AlbConfig:

      用于管理ALB实例,其参数决定了ALB实例的配置。一个AlbConfig对应一个ALB实例。更多配置请参见通过AlbConfig配置ALB实例

    • IngressClass:

      需要关联一个AlbConfig,从而实现与一个ALB实例的关联。在创建ALB Ingress时可以通过指定该IngressClass来引用相应的AlbConfig配置,从而实现特定的应用路由配置和负载均衡策略。

  • 创建示例应用和Service

    Service:为具有相同功能的Pod提供了一个稳定、统一的入口。在创建ALB Ingress时需要配置路由规则将外部流量转发到对应的Service。

本文示例介绍安装ALB Ingress组件时ALB云原生网关实例将选择新建。然后将部署名为coffeetea的应用及对应Service,并为其创建一个域名为demo.domain.ingress.top的ALB Ingress。在完成DNS域名解析后,您将能够访问该应用。

安装组件

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择运维管理 > 组件管理

  3. 组件管理页面,单击网络页签,在网络组件区域,在ALB Ingress Controller组件卡片的右下角单击安装

  4. 安装组件 ALB Ingress Controller对话框,在ALB 云原生网关实例来源中根据情况选择新建,然后单击确定

    实例来源

    描述

    结果说明

    新建

    • 网络类型:根据需要可选择创建公网私网的ALB实例,计费详情请参见ALB计费规则

    • 专有网络:默认值,与集群中专有网络相同。

    • 虚拟交换机:展示此专有网络下ALB支持的可用区对应的虚拟交换机。需要指定2个不同可用区的交换机,若不指定,则自动挑选2个可用交换机。您也可以通过单击创建虚拟交换机创建新的交换机。

    Controller会自动创建名为alb的AlbConfig和相应的IngressClass资源。在AlbConfig中,默认配置一个监听端口为80、协议为HTTP的监听。关于监听扩展请参见创建HTTPS监听

    使用已有

    您可以从下拉菜单中选择已有的ALB实例进行复用。不支持使用基础版ALB实例。详情请参见复用已有ALB实例

    暂不创建

    暂时不创建ALB实例,仅安装ALB Ingress Controller组件。

    Controller将不会创建相应资源,您需手动创建AlbConfig创建IngressClass

创建示例应用和Service

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择工作负载 > 无状态

  3. 单击使用YAML创建资源

    1. 示例模板:选择自定义

    2. 模板:输入YAML配置文件代码。该配置文件用于部署两个名称分别为coffeetea的Deployment,以及两个名称分别为coffee-svctea-svc的Service。

      展开查看YAML配置

      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: coffee
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: coffee
        template:
          metadata:
            labels:
              app: coffee
          spec:
            containers:
            - name: coffee
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: coffee-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: coffee
        type: NodePort
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: tea
      spec:
        replicas: 2
        selector:
          matchLabels:
            app: tea
        template:
          metadata:
            labels:
              app: tea
          spec:
            containers:
            - name: tea
              image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
              ports:
              - containerPort: 80
      ---
      apiVersion: v1
      kind: Service
      metadata:
        name: tea-svc
      spec:
        ports:
        - port: 80
          targetPort: 80
          protocol: TCP
        selector:
          app: tea
        type: NodePort
  4. 配置完成后单击创建,页面将提示创建成功

  5. 检查Deployment和Service创建成功:

    1. 在左侧导航栏,选择工作负载 > 无状态。可查看到名称为coffee和tea的Deployment已部署。

    2. 在左侧导航栏,选择网络 > 服务。可查看到名称为coffee-svc和tea-svc的Service已部署。

kubectl

  1. 创建并拷贝以下内容到cafe-service.yaml文件中,用于部署两个名称分别为coffeetea的Deployment,以及两个名称分别为coffee-svctea-svc的Service。

    展开查看详细YAML配置

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: coffee
      template:
        metadata:
          labels:
            app: coffee
        spec:
          containers:
          - name: coffee
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: coffee-svc
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: NodePort
    ---
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: tea
    spec:
      replicas: 2
      selector:
        matchLabels:
          app: tea
      template:
        metadata:
          labels:
            app: tea
        spec:
          containers:
          - name: tea
            image: registry.cn-hangzhou.aliyuncs.com/acs-sample/nginxdemos:latest
            ports:
            - containerPort: 80
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: tea-svc
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: tea
      type: NodePort
  2. 执行以下命令,部署两个Deployment和两个Service。

    kubectl apply -f cafe-service.yaml

    预期输出:

    deployment "coffee" created
    service "coffee-svc" created
    deployment "tea" created
    service "tea-svc" created
  3. 执行以下命令,查看应用和服务的状态。

    1. 执行以下命令,查看应用的状态。

      kubectl get deployment

      预期输出:

      NAME                             READY   UP-TO-DATE   AVAILABLE   AGE
      coffee                           1/2     2            1           2m26s
      tea                              1/1     1            1           2m26s
    2. 执行以下命令,查看服务的状态。

      kubectl get svc

      预期输出:

      NAME                          TYPE           CLUSTER-IP       EXTERNAL-IP           PORT(S)                 AGE
      coffee-svc                    NodePort       172.16.XX.XX     <none>                80:32056/TCP            9m38s
      tea-svc                       NodePort       172.16.XX.XX     <none>                80:31696/TCP            9m38s

创建ALB Ingress

控制台

  1. 登录容器服务管理控制台,在左侧导航栏选择集群

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择网络 > 路由

  3. 路由页面,单击创建 Ingress,在创建 Ingress对话框配置路由。

    配置项

    说明

    示例值

    网关类型

    可按需选择ALB IngressMSE IngressNginx Ingress三种网关类型。

    关于三种网关的差异,请参见Nginx Ingress、ALB Ingress和MSE Ingress对比

    ALB Ingress

    名称

    自定义路由名称。

    cafe-ingress

    Ingress Class

    选择关联AlbConfig的资源类。

    alb

    规则

    单击+ 添加规则可新增多个路由规则。

    • 域名:自定义域名。

      说明
      • 生产环境:指定自定义域名,需要进行配置域名解析后,通过指定域名进行访问。

      • 测试环境:不指定,为空,通过ALB Ingress自动生成的端点DNS名称进行访问。

    • 路径映射:配置如下配置项。

      • 路径:指定服务访问的URL路径。

      • 匹配规则

        • 前缀匹配(Prefix):匹配请求URL路径的前缀部分。

        • 完整匹配(Exact):完全匹配请求URL路径。

        • 默认(ImplementationSpecific):由Ingress控制器实现的具体逻辑决定。

        更多详情请参见基于URL路径转发请求

      • 服务名称:选择目标服务,即K8s内的Service。

      • 端口:选择服务需要暴露的端口。

    • Ingress支持同一个域名下配置多条路径。单击+ 添加路径新增路径。

    • 域名:demo.domain.ingress.top

    • 路径映射

      • 路径:/tea

      • 匹配规则:前缀匹配(Prefix)

      • 服务名称:tea-svc

      • 端口:80

    • 路径映射

      • 路径:/coffee

      • 匹配规则:前缀匹配(Prefix)

      • 服务名称:coffee-svc

      • 端口:80

    其他配置保持默认,参数详情请参见配置扩展

  4. 配置完成,在创建Ingress页面的左下角,单击确定。

  5. 检查Ingress创建成功并复制端点:

    1. 在左侧导航栏,选择网络 > 路由。可查看到名称为cafe-ingress的Ingress已部署。

    2. cafe-ingress端点列,复制其对应的ALB DNS端点名称。

kubectl

  1. 创建并拷贝以下内容到cafe-ingress.yaml文件中,用于创建Ingress。

    YAML配置文件参考

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: cafe-ingress 
    spec:
      ingressClassName: alb
      rules:
       - host: demo.domain.ingress.top
         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

    可调整参数说明如下:

    参数

    是否必填

    说明

    metadata.name

    Ingress的名称。

    说明

    Ingress的名称在集群中必须是唯一的。因此,在创建Ingress时,您需要确保Ingress名称的唯一性,以避免命名冲突。

    spec.ingressClassName

    关联的IngressClass的名称。

    spec.rules.host

    HTTP头部host字段域名信息,需要配置为您的自有域名。

    当您在浏览器中访问您的自有域名时,例如“http://demo.domain.ingress.top”,浏览器会在发送HTTP请求时自动添加一个“Host: demo.domain.ingress.top”的头部字段。这样,服务器就可以根据该头部字段来识别请求的目标主机名。在Kubernetes中,Ingress规则中的host字段会与来自请求的Host头部字段进行匹配。当匹配成功时,Ingress规则就会将请求路由到相应的后端服务进行处理。

    说明
    • 此处如果配置了自有域名,需要确保该自有域名完成备案,否则可能访问时无法解析。具体操作,请参见ICP备案流程

    • 此处如果未配置,那么该Ingress规则将匹配所有到达Ingress Controller的请求。

    spec.rules.http.paths.path

    转发路径URL。

    spec.rules.http.paths.pathType

    URL匹配规则。详情可参考基于URL路径转发请求

    spec.rules.http.paths.backend.service.name

    填写您此前创建的Service名称。

    spec.rules.http.paths.backend.service.port.number

    填写您此前创建的Service的服务端口号。

    这个端口号的设置非常重要,因为它决定了在路由到后端服务时使用的端口。确保端口号正确设置,以确保请求可以正确路由到后端服务并被处理。

  2. 执行以下命令,配置coffeetea服务对外暴露的域名和path路径。

    kubectl apply -f cafe-ingress.yaml

    预期输出:

    ingress.networking.k8s.io/cafe-ingress created
  3. (可选)执行以下命令获取ALB实例DNS地址。

    kubectl get ingress

    预期输出:

    NAME           CLASS    HOSTS                         ADDRESS                                               PORTS   AGE
    cafe-ingress   alb      demo.domain.ingress.top       alb-m551oo2zn63yov****.cn-hangzhou.alb.aliyuncs.com   80      50s

(可选)配置域名解析

说明

在创建 Ingress 时:

  • 如果未指定域名(即spec.rules.host为空),则通过ALB DNS端点进行访问。

  • 如果指定了自有域名(即spec.rules.host有值),您需要完成以下步骤,后续通过指定的自有域名访问服务。

  1. 登录域名解析控制台

  2. 权威域名解析页面单击添加域名

  3. 添加域名对话框中输入您的域名,然后单击确认

    重要

    您的主机域名需已完成TXT记录验证。

  4. 在目标域名的操作列单击解析设置

  5. 解析设置页面单击添加记录

  6. 添加记录面板配置以下信息完成CNAME解析配置,然后单击确认

    配置项

    说明

    记录类型

    在下拉列表中选择CNAME

    主机记录

    您的域名的前缀,例如www

    解析请求来源

    选择默认。

    记录值

    输入域名对应的CNAME地址,即您复制的ALB DNS端点。

    TTL

    全称Time To Live,表示DNS记录在DNS服务器上的缓存时间,本文使用默认值。

测试流量转发

自有域名

在浏览器中输入“测试域名+URL路径”,测试流量转发是否正确。

测试域名以demo.domain.ingress.top为例

  1. 在浏览器中输入demo.domain.ingress.top/coffee,将返回coffee-svc对应的后端服务界面。 image

  2. 在浏览器中输入demo.domain.ingress.top/tea,将返回tea-svc对应的后端服务界面。image

未指定域名

在浏览器中输入“ALB DNS端点名称+URL路径”,测试流量转发是否正确。

ALB DNS端点名称以alb-msjXXXXXXccq9ti.cn-hangzhou.alb.aliyuncsslb.com为例

  1. 在浏览器中输入alb-msjXXXXXXccq9ti.cn-hangzhou.alb.aliyuncsslb.com/coffee,将返回coffee-svc对应的后端服务界面。 image

  2. 在浏览器中输入alb-msjXXXXXXccq9ti.cn-hangzhou.alb.aliyuncsslb.com/tea,将返回tea-svc对应的后端服务界面。image

(可选)配置扩展

配置项

参数说明

相关文档

TLS配置

开启TLS配置开关,配置安全的路由服务。

  • 域名:自定义域名。

  • 保密字典:根据需要选择对应的保密字典。

    如果您需要创建Secret,请执行如下操作。

    1. 保密字典右侧,单击创建

    2. 创建 Secret对话框,自定义保密字典的名称CertKey,然后单击确定

    3. 保密字典的下拉框,选择已创建的Secret。

单击+ 新增TLS配置,可配置多条TLS。

更多配置

展开查看详细说明

  • 灰度发布:开启灰度发布开关。灰度规则可按照请求头、Cookie 、权重三个维度进行设置。

    说明

    请求头、Cookie 、权重可以只设置一种,若同时设置生效规则按请求头、Cookie、权重顺序匹配。

    • 按请求头:基于Request Header的流量切分,设置后会添加注解alb.ingress.kubernetes.io/canary-by-headeralb.ingress.kubernetes.io/canary-by-header-value

    • 按Cookie:基于Cookie的流量切分,设置后会添加注解alb.ingress.kubernetes.io/canary-by-cookie

    • 按权重:设置请求到指定服务的百分比(值为0~100的整数),设置后会添加注解alb.ingress.kubernetes.io/canary-weight

  • 协议:指定后端服务的协议,设置后会添加注解alb.ingress.kubernetes.io/backend-protocol

    支持HTTP、HTTPS、gRPC三种服务协议。

  • 重写路径:将客户端请求中的路径重写后发送到后端服务,设置后会添加注解alb.ingress.kubernetes.io/rewrite-target

自定义转发规则

展开查看详细说明

开启自定义转发规则,可精细化管理入站流量。

说明

转发规则的条件条目上限为10个。

  • 转发条件下拉框中选择:

    • 域名

      匹配请求域名,如果设置了多个域名,则域名之间是或的关系。设置后会添加注释alb.ingress.kubernetes.io/conditions.host-example

    • 路径

      匹配请求路径,如果设置了多个路径,则路径之间是或的关系。设置后会添加注释alb.ingress.kubernetes.io/conditions.path-example

    • HTTP标头

      以键值对形式匹配请求的头部信息。例如,键是headername值是headervalue1。如果设置了多个Header值,则Header之间是或的关系。设置后会添加注释alb.ingress.kubernetes.io/conditions.http-header-example

  • 转发动作下拉框中选择:

    • 转发至

      转发到后端多服务器组。在服务名称中,请选择目标服务。在端口中,选择目标端口号。然后自定义配置权重值。

      说明

    • 返回固定响应

      设置通过ALB给客户端返回固定响应内容,可以设置响应状态码,正文内容和正文类型。按需求配置响应状态码响应正文类型(可选)、响应正文(可选)

      响应正文类型:

      • text/plain:表示无格式的内容类型。

      • text/css:表示XML格式的内容。

      • text/html:表示HTML格式的内容。

      • application/javascript:表示JavaScript格式的内容。

      • application/json:表示JSON格式内容类型。

自定义ALB Ingress的转发规则

常见问题

如果遇到问题,您可以对ALB Ingress异常问题进行排查,以下是常见问题。

  • AlbConfig资源报错listener is not exist in alb, port: xxx?

    默认的AlbConfig只配置了端口80的监听,需要创建其他监听请参见创建监听

  • 配置AlbConfig的HTTP和HTTPS监听后,如何在Ingress资源中同时监听HTTP和HTTPS协议的监听?

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: https-ingress
      annotations:
        alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80},{"HTTPS": 443}]' # 使用多个监听时需要添加annotation使ALB Ingress正常工作。
    spec:
      #...