概述
从 2019 年底开始,EKS 已经支持 Fargate 功能,Fargate 是无服务器的计算单元,支持 Pod 的运行,EKS 集群的数据平面可以完全由 Fargate 承载,免除了维护 EC2 实例的弹性扩展、打补丁、和管理等方面的运维难题,而且 Kubernetes pod 运行在单独隔离的环境中,增强了安全性,下面示例介绍 EKS Fargate 的使用过程。
整体实验的架构图如下:
架构图说明:
- EKS 是 Amazon 托管的 Kubernetes 服务。
- Fargate 中运行 metrics-server,aws-load-balancer-controller,coredns,adot-collector 插件,分别用于收集 pod 指标,管理 Amazon ALB 负载均衡服务,DNS 域名解析服务和日志收集。Nginx pod 用于测试。
- CloudWatch 服务将收集和管理 pod 日志和 pod 指标。
详细步骤说明
1. 配置本机环境
本机需配置创建 EKS Cluster 的权限,比如具有 AdministratorAccess Policy。
2. 创建 Pod execution IAM role
创建用于 Fargate 的 IAM role,具有下载 ECR 镜像和上传日志到 CloudWatch Logs 的权限。
3. 创建 EKS Cluster
下面命令将创建一个 EKS Cluster,包含 3 个 Fargate Profile(default、kube-system和fargate-container-insights),部署在 Kubernetes namespaces(default、kube-system和fargate-container-insights)中的 pod 将运行在 Fargate 上,如果需要支持更多的 namespace,需要新建 Fargate Profile,指定该 namespace。该命令还将创建 1 个 VPC,3 个 public subnet,3 个 private subnet,并且 private subnet 已经配置了通过 NAT Gateway 访问公网。
1)获取 Account ID
2)创建 EKS 集群
3)获取 EKS 集群的 VPC 配置
4)更新本地 kubeconfig(可选)
5)创建 OIDC Provider,支持 Amazon IAM roles for service accounts 功能
操作代码如下:
4. 设置 Pod 的安全组
Fargate/Pod 将默认使用 EKS Cluster 的 Security Group。
下面演示为 Pod 设置额外的安全组。
1)创建 eks-fargate-sg 安全组
2) 获得 EKS Cluster 的 Security Group
3)新建 SecurityGroupPolicy
5. 创建 nginx 测试应用
1)创建 nginx deployment 和 service
2)访问 nginx app
创建 test pod,访问 nginx,后面还将用到 test pod,不要退出。
6. 收集 pod 指标到 CloudWatch
1)创建 namespace 和 serviceaccount
2)安装 aws-otel-collector 插件
下载的 otel-fargate-container-insights.yaml 文件中需将 YOUR-EKS-CLUSTER-NAME 替换为您的 EKS 集群名称 eks-fargate,将 region=us-east-1 修改成您使用的region。
3)在浏览器中,登陆 AWS Console,进入 CloudWatch 中。
选择菜单栏的 Container Insights,可以看到 Container map,如下图:
选择菜单栏的 All metrics,可以看到 pod 的指标,如 CPU 利用率和内存利用率,如下图:
7. 收集 pod logs 到 CloudWatch
1)创建 namespace
2)创建 configmap,只保存 nginx app 的日志
3)重启 nginx
4)在上面创建的 test pod 中,访问 nginx
5)在 CloudWatch 的 Log groups 中,可以看到 access log
8. 配置 Amazon ALB 负载均衡器
通过负载均衡器,互联网用户可以访问 EKS 集群中的 POD。
1)配置 Service Account
2)安装 aws-load-balancer-controller 插件
3)创建 ALB 使用的 Security Group
4)创建 ingress
将创建 Amazon ALB 负载均衡器,需等待几分钟的 ALB 初始化过程。
5)获取 ALB 的地址
6)访问 ALB,获得 nginx 的欢迎页
9. Pod 水平扩展 HPA
Kubernetes Horizontal Pod Autoscaler 可根据 Pod 负载情况,自动扩张 Pod 数量,新产生的 Pod 大概需要 1 分钟左右时间上线。HPA 依赖 Metrics Server 插件。
1)安装 Metrics Server 插件
2)创建 HorizontalPodAutoscaler 对象
下面是创建 HPA 对象的示例,设定了 CPU 利用率的期待指标和收缩策略。
3)查看 HPA 的状态,由于没有请求压力,nginx 副本将收缩为 1 个。
4)在上面创建的 test pod 中,进行压力测试,nginx 副本将扩展为 3 个。
HPA 的输出结果如下:
10. EKS 集群升级
EKS 集群升级后,需要升级线上 EKS Fargate 的版本。
查看 Fargate 版本,是否和 Cluster 版本一致,如果版本不相同,需要重启 Pod,升级 Fargate 版本。
1)获取 Fargate 的版本
2)重启 K8S Deployment,从而升级 Fargate 版本
3)升级时,为保障线上的 Pod 数量,可设置升级策略。
结论
在这篇文章中,介绍了在 EKS 集群中使用 Fargate,包含创建 EKS 集群、监控、日志收集、负载均衡器配置、水平扩展 Pod 和 EKS 集群升级等功能,用户可以参考该文档快速进行集群配置和测试。