攻克EKS Ingress痛点:从配置到运维的全流程实战指南
引言:你还在为EKS流量管理抓狂吗?
当Kubernetes集群部署到AWS EKS(Amazon Elastic Kubernetes Service,亚马逊弹性 Kubernetes 服务)后,如何高效暴露服务成为DevOps工程师的第一道难关。传统NodePort暴露方式存在安全隐患,LoadBalancer成本过高且缺乏路径路由能力,而Ingress作为 Kubernetes 原生的HTTP/HTTPS路由解决方案,却因AWS复杂的网络配置成为许多团队的"噩梦":ALB控制器安装失败、OIDC认证配置错误、Ingress资源创建后负载均衡器无响应... 本文将通过3大核心模块+2个实战案例+5个排障指南,帮你彻底掌握EKS Ingress从部署到运维的全流程,最终实现像管理本地服务一样轻松管理云端流量。
读完本文你将获得:
- 从零搭建EKS Ingress基础设施的分步实施清单
- 解决90%常见故障的诊断流程图
- 生产环境验证的最佳实践表格
- 2048游戏应用完整部署的可复用YAML配置
一、EKS Ingress基础设施全景图
1.1 核心组件架构
EKS Ingress流量路径涉及多个AWS服务协同工作,理解以下组件交互是配置成功的基础:
关键组件说明:
- AWS Load Balancer Controller:取代传统kube-proxy,实现Ingress资源与AWS ALB的动态绑定
- IAM OIDC Provider:建立Kubernetes ServiceAccount与AWS IAM角色的信任关系
- Fargate Profile:为Ingress控制器和应用Pod提供无服务器计算资源
- Security Groups:控制ALB与Pod之间的网络流量
1.2 环境准备清单
在开始配置前,请确保已满足以下先决条件(建议通过AWS CLI验证):
| 工具/组件 | 版本要求 | 验证命令 | 预期结果 |
|---|---|---|---|
| AWS CLI | ≥2.11.0 | aws --version | aws-cli/2.15.0 Python/3.11.4... |
| kubectl | ≥1.24 | kubectl version --client | Client Version: v1.26.0 |
| eksctl | ≥0.140.0 | eksctl version | 0.143.0 |
| IAM权限 | AdministratorAccess | aws iam get-user | 返回当前IAM用户信息 |
| VPC配置 | 至少2个私有子网 | aws ec2 describe-subnets --filters "Name=vpc-id,Values=<vpc-id>" | 显示SubnetIds列表 |
⚠️ 注意:所有命令需在Bash环境执行,Windows用户建议使用WSL2。国内用户需确保AWS CLI已配置正确的区域终端节点。
二、从零部署ALB控制器:避坑指南
2.1 五步安装流程
步骤1:创建IAM OIDC提供商
OIDC提供商是EKS集群与AWS IAM服务通信的桥梁,执行以下命令完成配置:
export cluster_name=demo-cluster
export region=us-east-1
# 获取集群OIDC issuer ID
oidc_id=$(aws eks describe-cluster --name $cluster_name --region $region \
--query "cluster.identity.oidc.issuer" --output text | cut -d '/' -f 5)
# 检查是否已存在OIDC提供商
if ! aws iam list-open-id-connect-providers | grep -q $oidc_id; then
echo "创建OIDC提供商..."
eksctl utils associate-iam-oidc-provider --cluster $cluster_name \
--region $region --approve
fi
步骤2:部署ALB控制器IAM策略
ALB控制器需要特定权限才能管理AWS资源,通过以下命令部署官方策略:
# 下载策略文档
curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json
# 创建IAM策略
aws iam create-policy \
--policy-name AWSLoadBalancerControllerIAMPolicy \
--policy-document file://iam_policy.json \
--region $region
# 记录策略ARN(后续步骤需要)
export policy_arn=$(aws iam list-policies --query "Policies[?PolicyName=='AWSLoadBalancerControllerIAMPolicy'].Arn" --output text)
步骤3:创建服务账户
使用eksctl创建绑定上述策略的Kubernetes服务账户:
eksctl create iamserviceaccount \
--cluster=$cluster_name \
--region=$region \
--namespace=kube-system \
--name=aws-load-balancer-controller \
--role-name AmazonEKSLoadBalancerControllerRole \
--attach-policy-arn=$policy_arn \
--approve
步骤4:安装Helm Chart
通过Helm部署ALB控制器(确保已添加EKS Charts仓库):
# 添加仓库
helm repo add eks https://aws.github.io/eks-charts
helm repo update
# 安装控制器
helm install aws-load-balancer-controller eks/aws-load-balancer-controller \
-n kube-system \
--set clusterName=$cluster_name \
--set serviceAccount.create=false \
--set serviceAccount.name=aws-load-balancer-controller \
--set region=$region \
--set vpcId=<your-vpc-id> # 替换为实际VPC ID
步骤5:验证部署状态
# 检查控制器Pod状态
kubectl get pods -n kube-system -l app.kubernetes.io/name=aws-load-balancer-controller
# 预期输出:
NAME READY STATUS RESTARTS AGE
aws-load-balancer-controller-7f9b8c7d6c-5x4zv 1/1 Running 0 10m
aws-load-balancer-controller-7f9b8c7d6c-9t2kw 1/1 Running 0 10m
2.2 常见部署故障诊断
| 故障现象 | 可能原因 | 解决方案 | 验证命令 |
|---|---|---|---|
| Pod处于Pending状态 | 缺少Fargate Profile | 创建包含kube-system命名空间的Fargate配置 | eksctl create fargateprofile --cluster $cluster_name --name alb-controller --namespace kube-system |
| 控制器日志报权限错误 | IAM策略缺失DescribeListenerAttributes权限 | 参考2.1步骤2更新策略文档,添加该权限 | aws iam get-policy-version --policy-arn $policy_arn --version-id $(aws iam get-policy --policy-arn $policy_arn --query 'Policy.DefaultVersionId' --output text) |
| ALB未创建 | 子网标签不正确 | 为私有子网添加标签:kubernetes.io/cluster/$cluster_name=shared | aws ec2 add-tags --resources <subnet-id> --tags Key=kubernetes.io/cluster/$cluster_name,Value=shared |
三、实战:部署2048游戏应用与Ingress配置
3.1 完整部署流程
步骤1:创建Fargate Profile
为应用创建独立的Fargate配置,确保资源隔离:
eksctl create fargateprofile \
--cluster $cluster_name \
--region $region \
--name alb-sample-app \
--namespace game-2048
步骤2:部署应用资源
创建包含Deployment、Service和Ingress的YAML文件(保存为2048_full.yaml):
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-2048
namespace: game-2048
spec:
replicas: 2
selector:
matchLabels:
app.kubernetes.io/name: app-2048
template:
metadata:
labels:
app.kubernetes.io/name: app-2048
spec:
containers:
- image: public.ecr.aws/l6m2t8p7/docker-2048:latest
imagePullPolicy: Always
name: app-2048
ports:
- containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
name: service-2048
namespace: game-2048
spec:
ports:
- port: 80
targetPort: 80
selector:
app.kubernetes.io/name: app-2048
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-2048
namespace: game-2048
annotations:
kubernetes.io/ingress.class: alb
alb.ingress.kubernetes.io/scheme: internet-facing
alb.ingress.kubernetes.io/target-type: ip
alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}]'
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-2048
port:
number: 80
应用配置:
kubectl apply -f 2048_full.yaml
步骤3:验证Ingress状态
# 获取Ingress资源
kubectl get ingress -n game-2048
# 预期输出:
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-2048 alb * k8s-game2048-ingress2-xxxxxx.us-east-1.elb.amazonaws.com 80 5m
# 访问应用(使用ADDRESS列的ALB DNS名称)
curl http://k8s-game2048-ingress2-xxxxxx.us-east-1.elb.amazonaws.com
3.2 Ingress注解最佳实践
| 注解键 | 常用值 | 作用 | 适用场景 |
|---|---|---|---|
| alb.ingress.kubernetes.io/scheme | internet-facing/private | 控制ALB是否可从公网访问 | 生产环境使用private,测试环境使用internet-facing |
| alb.ingress.kubernetes.io/listen-ports | '[{"HTTP": 80}, {"HTTPS": 443}]' | 配置监听端口 | 需要HTTPS时添加443端口 |
| alb.ingress.kubernetes.io/certificate-arn | arn:aws:acm:region:account:certificate/id | 绑定ACM证书 | 启用HTTPS加密 |
| alb.ingress.kubernetes.io/ssl-redirect | '443' | HTTP自动跳转HTTPS | 强制所有流量使用HTTPS |
| alb.ingress.kubernetes.io/target-type | ip/instance | 指定目标类型 | Fargate环境必须使用ip |
四、生产环境优化与运维建议
4.1 性能优化配置
# Ingress性能优化示例
metadata:
annotations:
alb.ingress.kubernetes.io/idle-timeout: '60' # 连接超时时间,默认60秒
alb.ingress.kubernetes.io/load-balancer-attributes: idle_timeout.timeout_seconds=60,access_logs.s3.enabled=true
alb.ingress.kubernetes.io/target-group-attributes: stickiness.enabled=true,stickiness.lb_cookie.duration_seconds=3600
4.2 监控与日志
通过CloudWatch监控ALB性能:
# 查看ALB访问日志
aws logs get-log-events --log-group-name /aws/elasticloadbalancing/<alb-name> --log-stream-name <stream-name>
# 设置CloudWatch告警(5xx错误率超过1%时触发)
aws cloudwatch put-metric-alarm \
--alarm-name alb-5xx-errors \
--metric-name HTTPCode_Target_5XX_Count \
--namespace AWS/ApplicationELB \
--statistic Sum \
--period 60 \
--threshold 10 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=LoadBalancer,Value=<alb-arn> \
--evaluation-periods 5
4.3 蓝绿部署配置
利用Ingress权重路由实现零停机部署:
# 蓝绿部署Ingress示例
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: app-blue-green
annotations:
alb.ingress.kubernetes.io/routing-policy: weighted
alb.ingress.kubernetes.io/weighted-target-groups: |
[
{"service":"service-blue","weight":90,"port":80},
{"service":"service-green","weight":10,"port":80}
]
spec:
rules:
- http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: service-blue
port:
number: 80
五、总结与后续学习路径
本文详细介绍了EKS Ingress从基础设施搭建到生产部署的全流程,包括ALB控制器安装、IAM权限配置、应用部署与流量管理。掌握这些技能后,你可以进一步深入:
-
高级主题:
- 使用AWS WAF防护Ingress流量
- 实现基于JWT的身份验证
- 多集群Ingress统一管理
-
推荐学习资源:
- AWS官方文档:EKS Ingress指南
- 项目源码中的day-22目录示例
- 面试题集:interview-questions/eks.md
📌 行动项:立即部署本文示例的2048应用,尝试修改Ingress注解观察ALB行为变化。遇到问题可查阅项目中day-22目录下的故障排除指南。收藏本文,关注后续"EKS安全加固实战"系列文章!
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



