与ALB/NLB集成

通过ALB暴露应用

EKS Auto Mode 可以自动创建和配置 ALB,例如当创建 Ingress Kubernetes 对象时,EKS Auto Mode 会创建一个负载均衡器,并将流量路由到集群工作负载。

为ALB设置IngressClass

由于Ingress可以由不同的控制器实现,每个Ingress应该指定一个类,引用一个IngressClass资源,其中包含额外的配置

IngressClass资源包含一个可选的parameters字段。这可以用来引用此类的额外特定实现配置。

我们将创建一个IngressClassParams,它允许我们为ALB定义AWS特定配置,如要使用的证书、用于ALB ENI的子网,或ingress group 配置,将多个ingress对象组合到单个ALB中。

IngressClassParams对象的支持配置在EKS Auto Mode文档中列出

  1. 创建 IngressClassParams 资源,指定 AWS 特定的配置值,例如用于 SSL/TLS 和 VPC 子网的证书。

  2. 创建 IngressClass 资源

  3. 创建将 HTTP 路径和端口与集群工作负载关联的 Ingress 资源。

创建IngressClass和IngressClassParams:

cat << EOF >ingress.yaml
apiVersion: eks.amazonaws.com/v1
kind: IngressClassParams
metadata:
  name: eks-auto-alb
spec:
  scheme: internet-facing

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: eks-auto-alb
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: eks.amazonaws.com/alb
  parameters:
    apiGroup: eks.amazonaws.com
    kind: IngressClassParams
    name: eks-auto-alb
EOF

kubectl apply -f ingress.yaml

这应该产生以下输出:

ingressclassparams.eks.amazonaws.com/eks-auto-alb created
ingressclass.networking.k8s.io/eks-auto-alb created

➤ 验证资源已创建:

kubectl get ingressclass,ingressclassparams

输出应该类似于下面这样:

image-20250228174303061

注意所使用的控制器,以及定义的SCHEME(在我们的例子中是internet-facing)。

部署UI Ingress

我们现在将更新UI组件,通过创建Ingress对象来配置ALB:

cat << EOF >ui-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: ui-ingress
  annotations:
    alb.ingress.kubernetes.io/healthcheck-path: /actuator/health/liveness
    alb.ingress.kubernetes.io/healthcheck-interval-seconds: '15'
    alb.ingress.kubernetes.io/healthcheck-timeout-seconds: '5'
    alb.ingress.kubernetes.io/healthy-threshold-count: '2'
    alb.ingress.kubernetes.io/unhealthy-threshold-count: '2'
    alb.ingress.kubernetes.io/success-codes: '200-399'
spec:
  ingressClassName: eks-auto-alb
  rules:
  - http:
      paths:
      - path: /
        pathType: Prefix
        backend:
          service:
            name: ui
            port:
              number: 80
EOF

kubectl apply -f ui-ingress.yaml

查看ingress,发现它创建出来一个ALB:

kubectl get ingress

image-20250228174434141

使用ALB访问UI应用

请注意,ALB创建和目标注册可能需要几分钟时间。

到控制台上查看ALB创建进度:

image-20250228171305427

等创建完成后,我们可以使用URL在新的浏览器窗口中访问应用:

image-20250228171650893

使用NLB暴露Catalog服务

EKS Auto Mode默认为所有 LoadBalancer 类型的Service创建一个NLB , 无需额外安装controller。只需要指定使用loadBalancerClass: eks.amazonaws.com/nlb

在前面的步骤中,我们使用了EKS Auto Mode来配置ALB。现在将体验如何使用EKS Auto Mode通过Kubernetes Service对象创建NLB。

➤ 执行以下命令

kubectl apply -f - << EOF
apiVersion: v1
kind: Service
metadata:
  name: catalog-nlb
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-type: "external"
    service.beta.kubernetes.io/aws-load-balancer-nlb-target-type: "ip"
    service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"
spec:
  type: LoadBalancer
  ports:
    - port: 80
      targetPort: http
      protocol: TCP
  selector:
    app.kubernetes.io/name: catalog
EOF

等待NLB创建完成并获取其URL:

image-20250228175029108

测试负载均衡器访问

等nlb创建完成,可以在页面上访问,但会报404:

image-20250228175106562

带上具体路径后会返回结果:

catalogue?tags=&order=&page=1&size=3

image-20250228175745378

让我们测试对应用程序的访问并观察负载均衡的运行情况。

➤ 首先,验证所有catalog pod都在运行:

kubectl get pods -l app.kubernetes.io/name=catalog,app.kubernetes.io/component=service

我们应该看到所有catalog组件的pod都处于Running状态。

image-20250228175143190

现在,让我们使用两个终端窗口来观察负载均衡行为。 在第一个终端中,查看所有catalog pod的日志:

kubectl logs -f -l app.kubernetes.io/name=catalog,app.kubernetes.io/component=service --prefix=true

➤ 在第二个终端中,通过ALB生成一些流量:

# Get the ALB URL
export ALB_URL=$(kubectl get ingress ui-ingress -o jsonpath='{.status.loadBalancer.ingress[0].hostname}')
echo "The application is available at: http://${ALB_URL}"

# Generate traffic to see load balancing across pods
CURL_CMD=$(which curl)
for i in {1..15}; do
  echo "Sending request $i..."
  $CURL_CMD -s "http://${ALB_URL}/catalog?request=$i" > /dev/null
  sleep 2
done

我们应该在第一个终端中看到详细的日志,显示请求被分配到所有三个catalog pod。每行日志显示:

  • 哪个pod处理了请求(在前缀中)
  • HTTP方法和路径
  • 响应状态码
  • 请求处理时间
  • 客户端IP地址

显示跨pod分配的日志输出示例:

image-20250228175525281

注意高亮显示的行显示不同的pod后缀(bzq6577c2ttkdqm)处理请求,这证明了负载均衡分配。

跨多个服务共享ALB - 多Ingress模式

有时我们需要确保多个ingress对象不会创建多个ALB,而是使用同一个ALB并具有多个路由规则。EKS Auto Mode通过IngressClassParams对象支持ingress group(参见文档 中的参考)。

我们将创建一个新的IngressClass对象和支持此类分组的新IngressClassParams。我们将创建2个ingress对象:一个用于ui组件,一个用于catalog服务。通过此配置,由于我们在IngressClassParams上配置了分组,将创建一个指向这2个服务的单个ALB。

  1. 创建一个带有group.name配置的新IngressClassParams和IngressClass:
cat << EOF >ingress-class-group.yaml
apiVersion: eks.amazonaws.com/v1
kind: IngressClassParams
metadata:
  name: eks-auto-alb-group-retail
spec:
  scheme: internet-facing
  group:
    name: retail

---
apiVersion: networking.k8s.io/v1
kind: IngressClass
metadata:
  name: eks-auto-alb-group-retail
  annotations:
    ingressclass.kubernetes.io/is-default-class: "true"
spec:
  controller: eks.amazonaws.com/alb
  parameters:
    apiGroup: eks.amazonaws.com
    kind: IngressClassParams
    name: eks-auto-alb-group-retail
EOF

kubectl apply -f ingress-class-group.yaml
  1. ui组件创建一个ingress对象(注意使用新创建的IngressClass eks-auto-alb-group-retail):
kubectl apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: retail-store-shared-group-ui
  annotations:
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/healthcheck-path: /actuator/health/liveness
spec:
  ingressClassName: eks-auto-alb-group-retail
  rules:
    - http:
        paths:
          - path: /
            pathType: Prefix
            backend:
              service:
                name: ui
                port:
                  number: 80
EOF
  1. catalog组件创建第二个ingress对象:
kubectl apply -f - << EOF
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: retail-store-shared-group-catalog
  annotations:
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/healthcheck-path: /health
spec:
  ingressClassName: eks-auto-alb-group-retail
  rules:
  - http:
      paths:
      - path: /catalogue
        pathType: Prefix
        backend:
          service:
            name: catalog
            port:
              number: 80
EOF
  1. 验证ingress已创建:
kubectl get ingress

注意catalogui的两个ingress的输出ADDRESS具有相同的DNS。这是因为我们在上面使用的IngressClassParams组配置。

image-20250228180209917

等待几分钟,alb创建完成。可以到控制台上进行确认:

image-20250228180350273

使用DNS访问两个服务。

我们应该期望从/路径获得HTML输出(来自ui组件):

image-20250228180756728

并在访问/catalogue路径时获得项目列表,这来自catalog组件:

image-20250228180821268