如何在Amazon EKS(搭配AWS Fargate)部署Kong?求指南与最佳实践
在AWS EKS Fargate上部署Kong的分步指南与最佳实践
一、前置检查
确认以下资源已就绪:
- 已创建带有Fargate配置文件的EKS集群
kubectl已配置为可访问目标集群- Helm 3已安装在本地环境
二、在EKS集群中安装Kong
推荐使用Helm进行标准化部署,步骤如下:
- 添加Kong官方Helm仓库并更新
helm repo add kong https://charts.konghq.com helm repo update - 创建自定义
values.yaml文件(核心配置将在后续适配Fargate环节补充) - 安装Kong到专属命名空间
helm install kong kong/kong --namespace kong --create-namespace -f values.yaml
三、适配Fargate环境的核心配置
Fargate存在无hostNetwork支持、临时存储限制、强制资源配额等特性,需调整Kong配置适配:
- 禁用Host网络与端口绑定
在values.yaml中添加:proxy: hostNetwork: false hostPort: null - 采用DB-less模式(推荐)
避免依赖数据库,降低Fargate资源开销与架构复杂度:
若需持久化配置,可挂载EFS存储卷(需提前创建EFS存储类):env: database: "off"proxy: persistence: enabled: true storageClass: "efs-sc" accessMode: ReadWriteMany size: 10Gi - 指定资源请求与限制
Fargate要求必须设置CPU/内存配额,建议与限制值保持一致:proxy: resources: requests: cpu: "1000m" memory: "1Gi" limits: cpu: "2000m" memory: "2Gi" admin: resources: requests: cpu: "500m" memory: "512Mi" limits: cpu: "1000m" memory: "1Gi" - 将Ingress Controller改为Deployment
禁用DaemonSet(Fargate不支持),设置多副本保障可用性:ingressController: kind: Deployment replicaCount: 2
四、网络与安全配置
网络配置
- 配置NLB作为入口负载均衡器
需提前在EKS集群中安装AWS Load Balancer Controller,然后在values.yaml中设置:proxy: service: type: LoadBalancer 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" - 确保Kong命名空间纳入Fargate调度
若现有Fargate配置文件未包含kong命名空间,执行以下命令添加:eksctl create fargateprofile --cluster <你的集群名称> --name kong-fargate --namespace kong
安全配置
- 限制Admin API访问
将Admin API设为ClusterIP类型,仅允许集群内部访问:
临时调试可使用admin: service: type: ClusterIPkubectl port-forward:kubectl port-forward svc/kong-kong-admin -n kong 8001:8001 - 配置IAM权限
为Fargate Pod的IAM角色添加必要权限:- 若使用EFS:
AmazonEFSFullAccess(或更细粒度的权限) - 若推送日志到CloudWatch:
CloudWatchLogsFullAccess
- 若使用EFS:
- 启用TLS加密
使用ACM证书创建K8s Secret后,配置Kong启用TLS:proxy: tls: enabled: true secret: "kong-tls-secret" - 配置NetworkPolicy
限制Kong Pod的访问来源,仅允许合法流量:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: kong-proxy-access namespace: kong spec: podSelector: matchLabels: app.kubernetes.io/name: kong app.kubernetes.io/component: proxy ingress: - from: - ipBlock: cidr: <你的微服务CIDR范围> ports: - protocol: TCP port: 8000 - protocol: TCP port: 8443
五、最佳实践与性能优化
性能优化
- 启用水平Pod自动扩缩容(HPA):根据CPU/内存使用率自动调整副本数
proxy: autoscaling: enabled: true minReplicas: 2 maxReplicas: 10 targetCPUUtilizationPercentage: 70 targetMemoryUtilizationPercentage: 75 - 调整Worker进程数:匹配CPU核心数,例如2核CPU设置
worker_processes: "2"env: worker_processes: "2"
架构安全
- 集成AWS WAF与NLB:过滤SQL注入、XSS等恶意流量
- 启用Kong限流插件:防止API被滥用
- 定期更新Kong版本:及时修复安全漏洞
监控与日志
- 配置日志输出到CloudWatch:通过标准输出/错误流收集日志
env: log_level: "info" proxy_access_log: "/dev/stdout" proxy_error_log: "/dev/stderr" - 启用Prometheus插件:收集Kong指标用于监控告警
plugins: enabled: - prometheus
六、部署验证
- 检查Pod状态
确保所有Pod处于kubectl get pods -n kongRunning状态 - 测试Proxy访问
获取NLB地址并发起请求:
应返回Kong默认404页面kubectl get svc kong-kong-proxy -n kong curl http://<NLB地址> - 测试Admin API
通过port-forward访问:
应返回Kong Admin API的JSON响应kubectl port-forward svc/kong-kong-admin -n kong 8001:8001 curl http://localhost:8001
内容的提问来源于stack exchange,提问作者Nasil Kp
相关产品推荐
相关产品推荐

