创建并使用ALB Ingress对外暴露服务

更新时间:2025-10-21 03:21:18

ACK集群中的服务默认与外部网络隔离。ALB Ingress通过使用具备域名路由、安全防护和高可用能力的应用型负载均衡 ALB作为外部流量入口,以满足将集群内部服务暴露给用户访问的需求。

工作原理

  1. 资源关联

    AlbConfig资源对象定义了ALB实例的具体配置(如功能版本、监听等),与ALB实例为一对一的关联关系。Ingress中定义的路径映射和关联的Service,将自动转化为ALB实例的路由规则和服务器组配置。

  2. 动态同步

    ALB Ingress Controller通过API Server动态地获取IngressAlbConfig资源的变化,然后动态更新ALB实例。

  3. 流量转发

    Nginx Ingress Controller不同,ALB Ingress Controller是托管组件,作为ALB实例的控制面,不直接处理用户请求流量,用户流量的转发由ALB实例来处理,并最终转发到Service所代理的后端Pod上。

image

Service类型限制

当使用flannel网络插件时,ALB Ingress后端Service仅支持NodePortLoadBalancer类型。

安装ALB Ingress Controller组件

创建集群时安装
为已有集群安装
  1. 登录容器服务管理控制台,单击创建集群

  2. 组件配置阶段的Ingress配置区域,选择安装ALB Ingress

  3. 以新建ALB实例为例,然后按照页面提示创建集群。

    实例来源

    说明

    新建

    自动创建ALB实例、AlbConfigIngressClass。

    • ALB实例:在集群VPC内自动创建一个标准版、按量付费的公网/私网ALB实例,并配置HTTP:80监听。

    • AlbConfigIngressClass:在集群中自动创建与ALB实例关联的AlbConfigIngressClass资源对象。

    使用已有

    仅当集群网络配置为使用已有专有网络时可选

    使用一个已有的ALB实例,并自动创建AlbConfigIngressClass。该ALB实例的功能版本需为标准版或WAF增强版,网络类型需为与集群同VPC的公网/私网类型,且未被其他集群关联。

    暂不创建

    仅安装ALB Ingress Controller组件,后续需手动创建AlbConfigIngressClass,适用于需要自定义ALB实例配置的场景。

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

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

  3. 通过搜索栏或者网络页签找到组件,在ALB Ingress Controller组件卡片的右下角,单击安装

  4. 以新建ALB实例为例,然后单击确认

    实例来源

    说明

    新建

    自动创建ALB实例、AlbConfigIngressClass。

    • ALB实例:在集群VPC内自动创建一个标准版、按量付费的公网/私网ALB实例,并配置HTTP:80监听。

    • AlbConfigIngressClass:在集群中自动创建与ALB实例关联的AlbConfigIngressClass资源对象。

    使用已有

    使用一个已有的ALB实例,并自动创建AlbConfigIngressClass。该ALB实例的功能版本需为标准版或WAF增强版,网络类型需为与集群同VPC的公网/私网类型,且未被其他集群关联。

    暂不创建

    仅安装ALB Ingress Controller组件,后续需手动创建AlbConfigIngressClass,适用于需要自定义ALB实例配置的场景。

创建示例应用

示例应用将部署一个名称为coffee的无状态工作负载(Deployment)以及对应的coffee-svc服务(Service)。

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

  2. 单击使用YAML创建资源示例模板选择自定义。然后将以下内容复制到模板区域,单击创建

    示例应用YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
      namespace: default
    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
      namespace: default
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: ClusterIP
  3. 在弹窗提示中单击查看,确认Pod状态为Running。 

  1. 获取集群KubeConfig并通过kubectl工具连接集群

  2. 使用以下内容创建coffee-deployment-service.yaml文件。

    示例应用YAML

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: coffee
      namespace: default
    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
      namespace: default
    spec:
      ports:
      - port: 80
        targetPort: 80
        protocol: TCP
      selector:
        app: coffee
      type: ClusterIP
  3. 创建示例应用的DeploymentService。

    kubectl apply -f coffee-deployment-service.yaml
  4. 确认Pod状态为Running

     kubectl get pod -l app=coffee

    预期输出:

    NAME                      READY   STATUS    RESTARTS   AGE
    coffee-84bd6*****-*****   1/1     Running   0          4m22s
    coffee-84bd6*****-*****   1/1     Running   0          4m22s

创建ALB Ingress

通过配置ALB Ingress的域名和路径映射,实现访问ingress-demo.com/coffee域名即可路由至集群内部coffee-svc服务的功能。

ACK专有集群中使用ALB Ingress,需要授予ALB Ingress Controller访问权限
控制台
kubectl
  1. 在左侧导航栏,选择网络 > 路由。选择default命名空间,单击创建 Ingress

  2. 添加以下Ingress配置,单击确定

    • 名称coffee-ingress

    • 域名ingress-demo.com

    • 路径映射路径/coffee匹配规则前缀匹配(Prefix)服务名称coffee-svc端口80

      匹配规则(pathType)

      说明

      前缀匹配(Prefix)

      匹配请求URL路径的前缀部分。例如,可匹配/coffee/1/coffee/buy/1路径,但不能匹配/cof/coffeebuy/1

      完整匹配(Exact)

      完全匹配请求URL路径。仅/coffee路径可匹配。

      默认(ImplementationSpecific)

      Ingress Controller实现的具体逻辑决定。在ALB Ingress Controller中为完整匹配(Exact)。

  3. 获取端点地址。

    ALB Ingress生效过程耗时约10秒,可稍后单击刷新按钮获取端点信息。若长时间未更新端点信息,可单击路由名称,进入事件页签,进行异常问题排查

    image

  4. 测试访问域名和端点地址,若HTTP状态码为200即表示ALB Ingress已创建成功。

    curl -H "Host:ingress-demo.com" http://<端点地址>/coffee -s -o /dev/null -w "%{http_code}\n"
  1. 创建ALB Ingress。将以下YAML内容保存为coffee-ingress.yaml文件,然后执行kubectl apply -f coffee-ingress.yaml命令。

    apiVersion: networking.k8s.io/v1
    kind: Ingress
    metadata:
      name: coffee-ingress
      namespace: default
    spec:
      ingressClassName: alb
      rules:
      - host: ingress-demo.com
        http:
          paths:
          - path: /coffee
            backend:
              service: 
                name: coffee-svc
                port:
                  number: 80
            pathType: Prefix

    匹配规则(pathType)

    说明

    前缀匹配(Prefix)

    匹配请求URL路径的前缀部分。例如,可匹配/coffee/1/coffee/buy/1路径,但不能匹配/cof/coffeebuy/1

    完整匹配(Exact)

    完全匹配请求URL路径。仅/coffee路径可匹配。

    默认(ImplementationSpecific)

    Ingress Controller实现的具体逻辑决定。在ALB Ingress Controller中为完整匹配(Exact)。

  2. 查看Ingress并获取ADDRESS字段中的端点地址。

    kubectl get ingress coffee-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}'

    预期输出:

    alb-******************.cn-wulanchabu.alb.aliyuncsslb.com
  3. 测试访问域名和端点地址,若HTTP状态码为200即表示ALB Ingress已创建成功。

    curl -H "Host:ingress-demo.com" http://<端点地址>/coffee -s -o /dev/null -w "%{http_code}\n"

计费说明

  • ALB Ingress Controller组件:该组件为ACK托管组件,不涉及用户侧的资源使用和计费。

  • ALB实例:每个AlbConfig资源对象会创建一个对应的ALB实例,ALB实例的计费规则为按量付费

应用于生产环境

  • 配置域名解析:将业务域名通过CNAME记录解析至ALB实例提供的公网访问地址,以解耦域名与ALB实例访问地址,确保服务入口的高可用与灵活配置。

  • 配置HTTPS安全加密:在数字证书管理服务中统一管理证书,并在Ingress资源的tls字段中声明式地引用该证书,从而实现服务流量的HTTPS安全加密。

配额与限制

常见问题

为什么访问Ingress域名返回了503、502、404HTTP错误码

问题原因

  • 503(Service Temporarily Unavailable)错误

    • 路由规则未匹配:请求路径与Ingress实际配置的路由规则不符。

    • 后端无存活Pod:Service关联的Pod全部未就绪或不存在,导致Endpoints对象为空。

  • 502(Bad Gateway)错误

    HTTPHTTPS监听接收到客户端连接请求后,ALB由于无法正常将请求转发至Pod或无法从Pod收到响应,则会向客户端发送HTTP 502 Bad Gateway状态码。

  • 404(Not Found)错误

    通常原因为已匹配Ingress中定义的路由规则,但与Pod中应用实际提供服务的URL不匹配。

更多HTTP错误码说明,请参见ALB状态码说明

解决方案

  1. 检查Ingress状态:执行kubectl describe ingress <ingress-name> -n <namespace>命令,查看Events部分是否有错误信息。如出现类似listener is not exist in alb的事件,请在AlbConfig创建Ingress资源所需的监听

    ...
    Events:
      Type     Reason                  Age     From     Message
      ----     ------                  ----    ----     -------
      Warning  FailedBuildModel        ****    ingress  listener is not exist in alb, port: 443, protocol: HTTPS
      Warning  FailedBuildModel        ****    ingress  listener not found for (443/HTTPS), with ingresses 1
    ...
  2. 检查后端Endpoints:执行kubectl get endpoints <service-name> -n <namespace>命令,确认ENDPOINTS字段下有至少一个健康的Pod IP和端口。若为空,则排查Serviceselector是否与Podlabels匹配,以及Pod是否处于Running状态。

  3. 检查Pod状态与日志:先执行kubectl get pod -l <app=your-app> -n <namespace>命令,查看Pod运行状态。获取Pod名称之后执行kubectl logs <pod-name> -n <namespace>命令,查看应用日志是否有启动失败或处理请求的错误信息。

  4. 网络连通性测试:在Pod内或节点上尝试curl后端ServiceClusterIPPod IP,验证集群内部服务是否可达。

配置Ingress TLS后,为什么HTTPS还是无法访问?

问题原因

  • ALB实例未监听443端口:只配置了IngressTLS安全加密,但没有创建对应的HTTPS:443监听。

  • 证书配置错误:Secret类型不是kubernetes.io/tlsIngressTLS,或者data中的tls.crttls.key内容不正确或不匹配。

  • 证书更新不生效:在阿里云证书中心更新了证书,但未更新AlbConfig中指定的证书ID,或未触发自动发现证书调谐,导致ALB实例仍引用旧证书。

解决方案

  1. 检查监听端口:执行kubectl describe albconfig <alb-name> -n <namespace>命令,检查是否缺少spec.listeners.port: 443spec.listeners.protocol: HTTPS配置。

  2. 检查Ingress配置:检查Ingress的配置中是否缺少注解alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}],该注解将Ingress关联到HTTPHTTPS监听上。

  3. 检查Secret配置:检查Ingress的配置中spec.tlssecretName字段,确认引用了正确的Secret。执行kubectl get secret <secret-name> -n <namespace> -o yaml命令,确认Secret类型和数据完整性。

如何为Ingress配置域名解析?

  1. 注册域名,并完成ICP备案

  2. 添加CNAME解析记录

    以添加一个记录类型为CNAME、主机记录为@(表示直接解析主域名,如ingress-demo.com)、记录值为Ingress端点地址的解析记录为例
  3. 在浏览器中访问http://ingress-demo.com/coffee,验证域名解析生效。

    image

    请替换为实际注册域名进行验证。如发现解析不生效,请参考解析不生效问题快速排查

如何为Ingress配置HTTPS安全加密?

  1. 购买正式证书个人测试证书,并完成申请证书,确认待使用的证书处于已签发状态。

  2. 下载SSL证书

    以下载ingress-demo.com域名、服务器类型为其他PEM格式证书文件为例。
  3. 创建Secret存储证书文件。

    1. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择配置管理 > 保密字典

    2. 保密字典页面,选择default命名空间,单击左侧创建添加以下配置,单击确定

      • 名称ingress-tls

      • 类型TLS证书

      • 证书:已下载并解压的证书文件(.pem)中的完整内容

      • 密钥:已下载并解压的证书私钥文件(.key)中的完整内容

      image

  4. 更新AlbConfig,为ALB实例新增HTTPS:443监听。

    1. 在左侧导航栏,选择工作负载 > 自定义资源。在资源对象浏览器页签中,搜索AlbConfig,然后单击搜索结果。

    2. AlbConfig资源对象列表中,找到目标资源alb,单击其右侧操作列下的YAML编辑

    3. 新增spec.listeners.port: 443spec.listeners.protocol: HTTPS字段,然后单击确定

      image

  5. 更新Ingress,添加TLS配置并关联HTTPS:443监听。

    1. 在左侧导航栏,选择网络 > 路由。在目标路由右侧操作栏中,单击更新

    2. 添加以下配置,单击确定

      • TLS配置:开启

      • 域名ingress-demo.com

      • 保密字典ingress-tls

      • 注解alb.ingress.kubernetes.io/listen-ports: [{"HTTP": 80}, {"HTTPS": 443}]

  6. 在浏览器中访问https://ingress-demo.com/coffee,验证HTTPS加密访问。

    image

    请替换为实际注册域名进行验证。

更多HTTPS证书的配置方式,请参见配置HTTPS证书以实现加密通信

相关文档

ALB Ingress服务高级用法

自定义ALB Ingress的转发规则

通过ALB Ingress实现灰度发布

  • 本页导读 (1)
  • 工作原理
  • Service类型限制
  • 安装ALB Ingress Controller组件
  • 创建示例应用
  • 创建ALB Ingress
  • 计费说明
  • 应用于生产环境
  • 配额与限制
  • 常见问题
  • 相关文档
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问