EKS Auto Mode 可以自动创建和配置 ALB,例如当创建 Ingress
Kubernetes 对象时,EKS Auto Mode 会创建一个负载均衡器,并将流量路由到集群工作负载。
由于Ingress可以由不同的控制器实现,每个Ingress应该指定一个类,引用一个IngressClass资源,其中包含额外的配置
IngressClass资源包含一个可选的parameters字段。这可以用来引用此类的额外特定实现配置。
我们将创建一个IngressClassParams
,它允许我们为ALB定义AWS特定配置,如要使用的证书、用于ALB ENI的子网,或ingress group
配置,将多个ingress对象组合到单个ALB中。
IngressClassParams
对象的支持配置在EKS Auto Mode文档中列出
。
创建 IngressClassParams 资源,指定 AWS 特定的配置值,例如用于 SSL/TLS 和 VPC 子网的证书。
创建 IngressClass 资源
创建将 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
输出应该类似于下面这样:
注意所使用的控制器,以及定义的SCHEME
(在我们的例子中是internet-facing
)。
我们现在将更新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
请注意,ALB创建和目标注册可能需要几分钟时间。
到控制台上查看ALB创建进度:
等创建完成后,我们可以使用URL在新的浏览器窗口中访问应用:
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:
等nlb创建完成,可以在页面上访问,但会报404:
带上具体路径后会返回结果:
catalogue?tags=&order=&page=1&size=3
让我们测试对应用程序的访问并观察负载均衡的运行情况。
➤ 首先,验证所有catalog
pod都在运行:
kubectl get pods -l app.kubernetes.io/name=catalog,app.kubernetes.io/component=service
我们应该看到所有catalog
组件的pod都处于Running
状态。
现在,让我们使用两个终端窗口来观察负载均衡行为。 在第一个终端中,查看所有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分配的日志输出示例:
注意高亮显示的行显示不同的pod后缀(bzq65
,77c2t
,tkdqm
)处理请求,这证明了负载均衡分配。
有时我们需要确保多个ingress对象不会创建多个ALB,而是使用同一个ALB并具有多个路由规则。EKS Auto Mode通过IngressClassParams对象支持ingress group(参见文档 中的参考)。
我们将创建一个新的IngressClass
对象和支持此类分组的新IngressClassParams
。我们将创建2个ingress对象:一个用于ui
组件,一个用于catalog
服务。通过此配置,由于我们在IngressClassParams上配置了分组,将创建一个指向这2个服务的单个ALB。
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
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
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
kubectl get ingress
注意catalog
和ui
的两个ingress的输出ADDRESS
具有相同的DNS。这是因为我们在上面使用的IngressClassParams组配置。
等待几分钟,alb创建完成。可以到控制台上进行确认:
使用DNS访问两个服务。
我们应该期望从/
路径获得HTML输出(来自ui
组件):
并在访问/catalogue
路径时获得项目列表,这来自catalog
组件: