攻克EKS Ingress痛点:从配置到运维的全流程实战指南

攻克EKS Ingress痛点:从配置到运维的全流程实战指南

【免费下载链接】aws-devops-zero-to-hero AWS zero to hero repo for devops engineers to learn AWS in 30 Days. This repo includes projects, presentations, interview questions and real time examples. 【免费下载链接】aws-devops-zero-to-hero 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-devops-zero-to-hero

引言:你还在为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服务协同工作,理解以下组件交互是配置成功的基础:

mermaid

关键组件说明

  • 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.0aws --versionaws-cli/2.15.0 Python/3.11.4...
kubectl≥1.24kubectl version --clientClient Version: v1.26.0
eksctl≥0.140.0eksctl version0.143.0
IAM权限AdministratorAccessaws 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=sharedaws 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/schemeinternet-facing/private控制ALB是否可从公网访问生产环境使用private,测试环境使用internet-facing
alb.ingress.kubernetes.io/listen-ports'[{"HTTP": 80}, {"HTTPS": 443}]'配置监听端口需要HTTPS时添加443端口
alb.ingress.kubernetes.io/certificate-arnarn:aws:acm:region:account:certificate/id绑定ACM证书启用HTTPS加密
alb.ingress.kubernetes.io/ssl-redirect'443'HTTP自动跳转HTTPS强制所有流量使用HTTPS
alb.ingress.kubernetes.io/target-typeip/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权限配置、应用部署与流量管理。掌握这些技能后,你可以进一步深入:

  1. 高级主题

    • 使用AWS WAF防护Ingress流量
    • 实现基于JWT的身份验证
    • 多集群Ingress统一管理
  2. 推荐学习资源

    • AWS官方文档:EKS Ingress指南
    • 项目源码中的day-22目录示例
    • 面试题集:interview-questions/eks.md

📌 行动项:立即部署本文示例的2048应用,尝试修改Ingress注解观察ALB行为变化。遇到问题可查阅项目中day-22目录下的故障排除指南。收藏本文,关注后续"EKS安全加固实战"系列文章!

【免费下载链接】aws-devops-zero-to-hero AWS zero to hero repo for devops engineers to learn AWS in 30 Days. This repo includes projects, presentations, interview questions and real time examples. 【免费下载链接】aws-devops-zero-to-hero 项目地址: https://gitcode.com/GitHub_Trending/aw/aws-devops-zero-to-hero

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值