使用 ALB Ingress 对外暴露混合云节点服务

更新时间:
复制 MD 格式

容器服务 Kubernetes 版 ACK 集群中的混合云节点,可通过应用型负载均衡 ALB Ingress 将本地 IDC 混合云节点上的容器服务对外暴露。本文介绍部署后端 Service 所需的网络前提、配置方式和流量策略,实现访问流量直达混合云节点上的业务 Pod。

背景信息

ACK 的混合云节点池可将本地 IDC 的服务器作为节点接入集群,集群中的 Pod 既可以部署在云上 ECS 节点,也可以部署在 IDC 内的混合云节点。混合云节点与中心云 VPC 属于不同的网络域,两者之间通过专线实现三层内网互通。

ALB 实例部署在 VPC 内的交换机上,默认以后端服务器组挂载 VPC 内的 ECS 等云上资源。混合云节点上的 Pod IP 不在 VPC 网段内,无法通过默认的 Instance 类型服务器组直接转发。为 ALB Ingress 的后端 Service 添加 alb.ingress.kubernetes.io/server-group-type: Ip 注解后,ALB Ingress 会将 Pod IP 直接注册到 ALB 的 IP 类型服务器组,配合专线路由即可让七层流量直达混合云节点上的业务 Pod,同时复用 ALB Ingress 的域名路由、HTTPS 证书、灰度发布和访问控制等能力。

混合云节点上的服务通过 ALB Ingress 对外暴露的流量路径如下图所示。

image

与为每个服务单独创建负载均衡类型的 Service 相比,ALB Ingress 用一个 ALB 实例承载多个服务的七层路由,入口更统一、运维成本更低。如果业务使用四层协议,或需要复用已有的 CLB、NLB 实例,可参见使用负载均衡类型的Service暴露应用,了解云端应用和 IDC 内应用分别如何通过负载均衡类型的 Service 暴露服务。

本文只说明混合云节点场景下部署后端 Service 需要额外关注的网络前提、注解配置和流量策略。ALB 实例、监听和转发规则的创建方式,请参见创建并使用ALB Ingress对外暴露服务。

网络前提

使用 ALB Ingress 对外暴露混合云节点上的服务前,请确保云上资源能够访问本地混合云节点 Pod。如果尚未打通网络,先参考使用 Terway Hybrid 网络插件完成网络打通,并确认以下条件:

  • 中心云 VPC 与本地 IDC 已通过专线实现三层内网互通,VPC 路由表、专线网关和 IDC 侧交换机均已配置双向路由。IDC 侧的网元配置请参见混合云节点池场景的网元配置。

  • 云上资源已能访问本地 Pod:混合云节点使用 Terway Hybrid 网络插件,并按其说明完成云上访问本地 Pod 的配置。Underlay 模式下需要通过 BGP 将容器网段路由宣告到 IDC 交换机,Overlay 模式下需安装ack-hybrid-nodes-gateway组件。

  • ALB 实例所在的 VPC 与混合云节点 Pod 网段之间路由可达,确保 IP 类型服务器组中的 Pod IP 能够被 ALB 正常探测和转发。

后端 Service 配置说明

配置前,确认以下约束:

重要
  • 服务器组类型一经创建无法更改。

  • 先创建后端 Service,再创建 Ingress。Ingress 指向的 Service 尚未创建时,ALB Ingress 控制器无法读取 Service annotations,可能提前按默认逻辑创建 Instance 类型服务器组,导致 IP 类型服务器组挂载失败。

创建 ALB Ingress 的后端 Service 时,必须添加以下 Annotation:

Annotation

说明

alb.ingress.kubernetes.io/server-group-type: Ip

以 Pod IP 方式将后端 Pod 直接注册到 ALB 服务器组,流量直达 Pod。

网络插件对后端 Service 的类型存在限制:集群使用 Flannel 网络插件时,ALB Ingress 后端 Service 仅支持 NodePort 和 LoadBalancer 类型,且创建后不支持直接修改 Service 类型。本文示例使用 ClusterIP 类型,Flannel 网络集群需在创建时改用 NodePort 或 LoadBalancer 类型。

该 Annotation 的完整字段说明和其他 ALB Ingress 注解,请参见ALB Ingress配置词典。

使用限制

以下限制来自ALB Ingress FAQ:

  • 在 Flannel 网络模式下,若修改 Service 类型(如在 ClusterIP 与 NodePort 之间切换),后端挂载节点类型会在 IP 和 ECS 之间切换,无法加入原有服务器组,因此不支持直接修改 Service 类型。

  • 如需调整服务器组类型,新建 Service,并在 annotations 中指定 alb.ingress.kubernetes.io/server-group-type: Ip,避免影响存量服务器组挂载节点。

  • 设置 alb.ingress.kubernetes.io/server-group-type: Ip 后不要随意删除该注解,否则 Service 与服务器组类型不一致会导致调谐失败,后端节点无法正常加入服务器组。

流量策略

Service 的外部流量策略 externalTrafficPolicy 仅对 LoadBalancer 和 NodePort 类型的 Service 生效,用于控制来自外部的请求是转发到集群内任意节点上的 Pod(Cluster),还是只转发到接收请求的节点上的 Pod(Local)。

ALB Ingress 使用 IP 类型服务器组时,ALB 直接以 Pod IP 为后端转发七层请求,不经过节点的 kube-proxy 端口转发,因此这条链路不需要设置外部流量策略。若业务 Pod 需要获取客户端真实 IP,可通过 ALB 的 X-Forwarded-For 相关配置实现,具体字段参见ALB Ingress配置词典。

说明

如果因网络插件限制,后端 Service 只能使用 NodePort 或 LoadBalancer 类型(例如 Flannel 网络插件),请求会先到达节点再转发到 Pod。此时建议将 externalTrafficPolicy 设置为 Cluster:设置为 Local 时,只有接收请求的节点上存在对应 Pod 才会转发,混合云节点与云上节点混合部署时容易因节点上没有对应 Pod 而访问失败。

Local 和 Cluster 两种模式的详细差异,以及负载均衡类型 Service 场景下的流量策略配置,请参见外部流量策略。

示例

以下 YAML 创建名为 coffee 的 Deployment 和后端 Service coffee-svc。Deployment 通过 toleration 容忍 nodepool-type=hybridcloud:NoSchedule 污点,调度到混合云节点;Service 通过注解将服务器组类型指定为 Ip。创建 coffee-svc 后,再创建以该 Service 为后端的 ALB Ingress,完成服务的对外暴露。

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
      # 添加 toleration 使其可部署至混合云节点
      tolerations:
        - effect: NoSchedule
          key: nodepool-type
          operator: Equal
          value: hybridcloud
---
apiVersion: v1
kind: Service
metadata:
  name: coffee-svc
  namespace: default
  annotations:
    # 使用 Ip 模式直接将后端 Pod 注册到 ALB 服务器组
    alb.ingress.kubernetes.io/server-group-type: Ip
spec:
  ports:
  - port: 80
    targetPort: 80
    protocol: TCP
  selector:
    app: coffee
  type: ClusterIP  # 当使用 Flannel 网络插件时,ALB Ingress 后端 Service 仅支持 NodePort 和 LoadBalancer 类型

确认后端 Pod 已调度到混合云节点,再创建以下 Ingress,将请求转发到后端 Service coffee-svc:

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

Ingress 创建后,ALB Ingress 控制器会将 coffee-svc 后端 Pod 的 IP 注册到 ALB 的 IP 类型服务器组。ALB 实例、IngressClass 和域名解析等前置配置,以及访问验证的具体操作,请参见创建并使用ALB Ingress对外暴露服务。