为运行高流量微服务构建预配置的 Amazon EKS 集群
高流量平台是现代数字生态系统的发展动力,包括熙熙攘攘的在线市场、媒体流服务以及实时数据分析应用程序。这类平台常常遭遇不可预见的用户活动高峰,比如音乐会宣布之后票务销售的激增或热门剧集首播时流媒体服务的观看热潮。这些情况都需要一种能够动态扩缩并从故障中快速恢复的架构。微服务是满足这些要求的关键,但真正的难点在于微服务的高效编排。Amazon EKS 作为一项服务方案,其卓越之处在于简化的服务部署与扩展能力,能让每项服务独立应对流量突增,而无需牵连其他服务。借助亚马逊云科技基础设施的强大支持,Amazon EKS 可确保性能和可靠性。
本教程介绍如何使用 eksctl“quickstart”模板创建基于托管节点组的 Amazon EKS 集群。这一适用于特定使用场景的模板可创建并设置一个预配置的集群,该集群已准备好运行动态前端(例如交互式 Web 控制面板)和数据密集型后端(例如分析引擎或推荐系统)。
前提条件
开始本教程学习之前,您需要:
概述
本教程是使用 Amazon EKS 管理高流量微服务平台系列的第一部分,专门介绍如何使用集群运行数据密集型工作负载的微服务应用程序所需的组件来预配置集群。用下面的 eksctl 集群模板,您可以使用托管节点组构建一个强大、可扩展且安全的 Amazon EKS 集群。此模板不仅支持应用程序工作负载,还通过额外的安全层来强化集群,完全符合生产环境的最佳实践。此模板配置以下组件:
- 自动扩缩:托管节点组使用 m5.large 实例类型,进而平衡资源。节点组可以动态扩缩,最小节点数量为 2,最大节点数量为 5。卷大小设置为“100”,以确保有足够的容量,并且所需的子网标签允许 Kubernetes Cluster Autoscaler (CA) 动态扩缩集群。
- 身份认证:需要用来让服务账户的 IAM 角色 (IRSA) 映射实现 Kubernetes Pod 和 Amazon 服务之间的通信。其中包括用于发布应用程序的 Amazon 负载均衡器控制器 (LBC)、用于持久数据存储的 Amazon EFS CSI 驱动程序、用于自动管理 DNS 记录的 Kubernetes External DNS 和用于简化 SSL/TLS 证书管理的 Cert Manager。除此之外,还有 OpenID Connect (OIDC) 端点 来实现无缝且安全的通信。
- 附加组件:以下附加组件的最新版本,包括用于启用 Amazon VPC 容器网络接口的“vpc-cni”、用于促进 DNS 解析的“coredns”、用于维护每个 Amazon EC2 节点上的网络规则的“kube-proxy”以及 EBS CSI 驱动程序附加组件。
- 公有/私有网络:托管节点组利用私有网络和 NAT 网关通过限制互联网直接访问来增强安全性。Amazon 负载均衡器控制器 (LBC) 管理所有传入 Web 流量并将其安全地分配到私有子网。
- 监控:将 Amazon CloudWatch IAM 策略添加至服务账户的 IAM 角色 (IRSA),以便 CloudWatch Container Insights 等可选组件收集并汇总指标和日志。
请注意,即使您仍在刚开始的 12 个月亚马逊云科技免费套餐的期限内,托管节点组和其他 Amazon 服务的某些 Amazon EC2 实例也有可能不在免费套餐的范围内,并且可能会根据您的使用情况产生费用。
步骤 1:配置集群
在这一步中,您将配置 Amazon EKS 集群来满足高流量微服务应用程序的特定需求。通过创建 cluster-config.yaml 件,您将定义 IAM 角色、可扩展资源、私有网络和监控的设置。这些配置对于确保集群的可靠性、可扩展性且安全性至关重要,并针对动态可扩展性和数据持久性的优化了性能。
创建集群配置
1. 创建 cluster-config.yaml 文件,并将以下内容粘贴到其中。请务必将 region 值替换为您要使用的服务地域。
apiVersion: eksctl.io/v1alpha5
kind: ClusterConfig
metadata:
name: managednodes-quickstart
region: us-east-2
version: "1.27"
tags:
# Add more cloud tags if needed for billing
environment: managednodes-quickstarts
# The IAM section is for managing IAM roles and service accounts for your cluster.
iam:
withOIDC: true
serviceAccounts:
- metadata:
# Service account used by Container Insights. (See https://docs.thinkwithwp.com/AmazonCloudWatch/latest/monitoring/Container-Insights-prerequisites.html)
name: cloudwatch-agent
namespace: amazon-cloudwatch
labels: {aws-usage: "container-insights"}
attachPolicyARNs:
- "arn:aws:iam::aws:policy/CloudWatchAgentServerPolicy"
- metadata:
# Service account used by the AWS Load Balancer Controller.
name: aws-load-balancer-controller
namespace: kube-system
wellKnownPolicies:
awsLoadBalancerController: true
- metadata:
# Service account used by Amazon EFS CSI driver. (See https://docs.thinkwithwp.com/eks/latest/userguide/efs-csi.html)
name: efs-csi-controller-sa
namespace: kube-system
wellKnownPolicies:
efsCSIController: true
- metadata:
# Service account used by External DNS. (See https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.5/guide/integrations/external_dns/)
name: external-dns
namespace: kube-system
wellKnownPolicies:
externalDNS: true
- metadata:
# Service account used by Certificate Manager. (See https://cert-manager.io/docs/installation/)
name: cert-manager
namespace: cert-manager
wellKnownPolicies:
certManager: true
- metadata:
# Service account used by Cluster Auto-scaler. (See https://github.com/kubernetes/autoscaler/blob/master/cluster-autoscaler/cloudprovider/aws/CA_with_AWS_IAM_OIDC.md)
name: cluster-autoscaler
namespace: kube-system
labels: {aws-usage: "autoscaling-worker-nodes"}
wellKnownPolicies:
autoScaler: true
managedNodeGroups:
- name: managed-ng
instanceType: m5.large
minSize: 2
desiredCapacity: 3
maxSize: 5
# launch nodegroup in private subnets
privateNetworking: true
volumeSize: 100
volumeType: gp3
# Encrypt Worker Nodes Amazon EBS Volumes by default
volumeEncrypted: true
labels:
node-class: "production-workload"
role: "worker"
tags:
nodegroup-role: worker
env: prod
# EC2 tags required for cluster-autoscaler auto-discovery - these tags are automatically applied to a managed nodegroup autoscaling group
k8s.io/cluster-autoscaler/enabled: "true"
k8s.io/cluster-autoscaler/managednodes-quickstart: "owned"
addons:
- name: vpc-cni # no version is specified so it deploys the default version
attachPolicyARNs:
- arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
- name: coredns
version: latest # auto discovers the latest available
- name: kube-proxy
version: latest
- name: aws-ebs-csi-driver
wellKnownPolicies: # add IAM and service account
ebsCSIController: true
cloudWatch:
clusterLogging:
enableTypes: ["*"]
# Sets the number of days to retain the logs for (see [CloudWatch docs](https://docs.thinkwithwp.com/AmazonCloudWatchLogs/latest/APIReference/API_PutRetentionPolicy.html#API_PutRetentionPolicy_RequestSyntax)).
# By default, log data is stored in CloudWatch Logs indefinitely.
logRetentionInDays: 60
步骤 2:创建集群
现在,我们已做好创建 Amazon EKS 集群的准备。整个集群创建过程需要几分钟才能完成。如果您想监测集群创建状态,可以登录 Amazon CloudFormation 控制台。
1. 运行以下命令,使用 cluster-config.yaml 创建 EKS 集群:
eksctl create cluster -f cluster-config.yaml
创建完成后,输出结果应该如下所示:
2023-08-26 08:59:54 [✔] EKS cluster "managednodes-quickstart" in "us-east-2" region is ready
创建集群的命令运行完成后,运行以下命令检查是否所有的节点都处于 Ready 状态:
kubectl get nodes
输出结果应该如下所示:
NAME STATUS ROLES AGE VERSION
ip-192-168-119-7.us-east-2.compute.internal Ready <none> 27m v1.27.4-eks-8ccc7ba
ip-192-168-141-57.us-east-2.compute.internal Ready <none> 19m v1.27.4-eks-8ccc7ba
ip-192-168-177-109.us-east-2.compute.internal Ready <none> 19m v1.27.4-eks-8ccc7ba
步骤 3:验证集群节点和 Pod 运行状况
使用以下命令验证是否已成功安装 Amazon EBS CSI 驱动程序:
kubectl get deployment ebs-csi-controller -n kube-system
输出结果应如下所示:
NAME READY UP-TO-DATE AVAILABLE AGE
ebs-csi-controller 2/2 2 2 15m
使用以下命令验证在集群中创建的所有服务帐户:
kubectl get sa -A | egrep "cert-manager|efs|aws-load|external|cloudwatch-agent|cluster-autoscaler"
输出结果应该如下所示:
amazon-cloudwatch cloudwatch-agent 0 43m
cert-manager cert-manager 0 43m
cert-manager default 0 43m
kube-system aws-load-balancer-controller 0 42m
kube-system cluster-autoscaler 0 43m
kube-system efs-csi-controller-sa 0 43m
kube-system external-dns 0 43m
恭喜您!您已经成功搭建了 Amazon EKS 集群的基础设施,为部署高流量微服务工作负载建立了基础。这步设置为您提供了开始部署应用程序所需的基础工作,但请记住,要达到完全优化且适合生产环境的状态,还需要进行额外的配置。
(可选)部署示例应用程序
现在,我们已准备好启动一个示例应用程序,并通过应用程序负载均衡器 (ALB) 让示例应用程序可通过互联网访问。若需详细的操作步骤,请查看在 EKS IPv4 集群上使用 Amazon 负载均衡器控制器 (LBC) 对应用程序进行发布和分组中的教程。该教程将指导您完成 Amazon LBC 所需的入口注解,这是控制对 EKS 集群服务的外部访问的基本机制。您还会了解到 Ingress Grouping(入口分组),这是一项复杂的功能,可将多个入口资源合并到一个 ALB 中,从而提高效率并加强 ALB 管理。
清理资源
为避免持续产生费用,建议您删除在学习本教程的过程中创建的资源。运行以下命令删除 EKS 集群:
eksctl delete cluster -f ./cluster-config.yaml
删除成功后,输出结果应该如下所示:
2023-08-26 17:26:44 [✔] all cluster resources were deleted
总结
在本教程中,您不仅成功设置了针对部署微服务应用程序而优化的 Amazon EKS 集群,还为 Amazon 和 Kubernetes 之间的无缝集成建立了基础。通过配置必要的服务账户的 IAM 角色 (IRSA)、节点组和其他基本组件,您已经建立了基础设施,可确保与运行高流量微服务所需的 Amazon 服务及驱动程序之间的流畅通信。要充分利用您的新设置,请记住 ExternalDNS、Cluster Autoscaler、Container Insights 和 Amazon 负载均衡器控制器仍然需要安装。通过这些最后的安装,您将拥有一个强大、完全可操作的环境,为部署您的微服务应用程序做好准备,同时还能利用 Amazon EKS 和 Kubernetes 的独特优势。