本系列教程适用于想要部署、运行和管理在 Google Kubernetes Engine (GKE) Enterprise 版本上运行的现代应用环境的 IT 管理员和运维人员。在学习本系列教程的过程中,您将学习如何使用 Cymbal Bank 示例微服务应用配置监控和提醒、扩缩工作负载以及模拟故障。
概览和目标
通常,像 Cymbal Bank 这样的使用方应用在不同时间段内的用户数不尽相同。理想情况下,您的网站能够应对流量激增,访问速度不会下降或出现其他问题,但组织无需为没有实际使用的 Cloud 资源付费。Google Cloud 为此提供的解决方案是自动扩缩。
在本教程中,您将学习如何配置 GKE 集群中的集群和工作负载,以便使用内置 Kubernetes 指标和 Cloud Monitoring 和 Cloud Trace 中的自定义指标进行扩缩。您将学习如何完成以下任务:
- 在 Cloud Monitoring 中为 Trace 启用自定义指标。
- 借助自定义指标,您可以使用 Kubernetes 集群无法获知的其他监控数据或外部输入(例如网络流量或 HTTP 响应代码)来进行扩缩。
- 配置 Pod 横向自动扩缩器,这是一种 GKE 功能,可根据指定的指标自动增加或减少工作负载的 Pod 数量。
- 模拟应用负载,并查看集群自动扩缩器和 Pod 横向自动扩缩器的响应。
设置自定义指标收集
您可以将 Pod 横向自动扩缩器配置为使用基本的内置 Kubernetes CPU 和内存指标,也可以使用 Cloud Monitoring 中的自定义指标,例如每秒 HTTP 请求数或 SELECT 语句的数量。自定义指标无需更改应用即可起作用,并可让集群更深入地了解应用的整体性能和需求。在本教程中,您将学习如何同时使用内置指标和自定义指标。
如需允许 Pod 横向自动扩缩器从 Monitoring 读取自定义指标,您必须在集群中安装自定义指标 - Stackdriver 适配器。
将自定义指标 Stackdriver 适配器部署到集群:
kubectl apply -f https://raw.githubusercontent.com/GoogleCloudPlatform/k8s-stackdriver/master/custom-metrics-stackdriver-adapter/deploy/production/adapter.yaml如需允许 Stackdriver 适配器从集群获取自定义指标,您可以使用 Workload Identity Federation for GKE。此方法使用具有读取监控指标权限的 IAM 服务账号。
向 IAM 服务账号授予
roles/monitoring.viewer角色:gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:scalable-apps@PROJECT_ID.iam.gserviceaccount.com" \ --role roles/monitoring.viewer将 Stackdriver 适配器配置为使用 Workload Identity Federation for GKE,以及具有读取监控指标权限的 IAM 服务账号:
gcloud iam service-accounts add-iam-policy-binding scalable-apps@PROJECT_ID.iam.gserviceaccount.com \ --role roles/iam.workloadIdentityUser \ --member "serviceAccount:PROJECT_ID.svc.id.goog[custom-metrics/custom-metrics-stackdriver-adapter]"Kubernetes 包括自己的服务账号系统,用于在集群内进行访问。如需让您的应用向 Google Kubernetes Engine 集群之外的服务和资源(例如 Monitoring)进行身份验证,您可以使用 Workload Identity Federation for GKE。此方法会将 Kubernetes 服务账号配置为使用 GKE 的 IAM 服务账号。
为适配器使用的 Kubernetes 服务账号添加注释:
kubectl annotate serviceaccount custom-metrics-stackdriver-adapter \ --namespace=custom-metrics \ iam.gke.io/gcp-service-account=scalable-apps@PROJECT_ID.iam.gserviceaccount.com重启 Stackdriver 适配器 Deployment 以应用更改:
kubectl rollout restart deployment custom-metrics-stackdriver-adapter \ --namespace=custom-metrics
配置 Pod 横向自动扩缩器
GKE Autopilot 可以通过几种不同的方式进行扩缩。在本教程中,您将了解如何使用以下方法扩缩集群:
- Pod 横向自动扩缩器:扩缩工作负载的 Pod 数量。
- 集群自动扩缩器:扩缩集群中可用的节点资源。
这两种方法可以配合使用,因此随着应用的 Pod 数量发生变化,支持这些 Pod 的节点资源也会变化。
其他实现可用于扩缩在 Pod 横向自动扩缩器的基础上构建的 Pod,您还可以使用 Pod 纵向自动扩缩器来调整 Pod 的 CPU 和内存请求(而不是 Pod 的数量)。
在本教程中,您将使用内置指标为 userservice Deployment 配置 Pod 横向自动扩缩器,使用自定义指标为 frontend Deployment 配置 Pod 横向自动扩缩器。
对于您自己的应用,请与您的应用开发者和平台工程师合作,了解他们的需求并配置 Pod 横向自动扩缩器规则。
扩缩 userservice Deployment
当 Cymbal Bank 示例应用的用户数量增加时,userservice Service 会消耗更多 CPU 资源。您可以使用 HorizontalPodAutoscaler 对象来控制应用响应负载的方式。在 HorizontalPodAutoscaler 的 YAML 清单中,您可以定义 Pod 横向自动扩缩器要扩缩的 Deployment、要监控的指标以及要运行的副本数下限和上限。
查看
userserviceDeployment 的HorizontalPodAutoscaler示例清单:此清单执行以下操作:
- 将纵向扩容期间的副本数上限设置为
50。 - 将纵向缩容期间的副本数下限设置为
5。 - 使用内置的 Kubernetes 指标做出扩缩决策。在此示例中,指标为 CPU 利用率,目标利用率为 60%,这可以避免过度利用和利用不充分的情况。
- 将纵向扩容期间的副本数上限设置为
将清单应用于集群:
kubectl apply -f extras/postgres-hpa/hpa/userservice.yaml
扩缩 frontend Deployment
在上一部分中,您根据内置的 CPU 利用率 Kubernetes 指标在 userservice Deployment 上配置了 Pod 横向自动扩缩器。对于 frontend Deployment,您可能希望改为根据传入 HTTP 请求的数量进行扩缩。此方法使用 Stackdriver 适配器从 Monitoring 读取 HTTP(S) 负载均衡器 Ingress 对象的自定义指标。
查看
frontendDeployment 的HorizontalPodAutoscaler清单:此清单使用以下字段:
spec.scaleTargetRef:要扩缩的 Kubernetes 资源。spec.minReplicas:副本数下限,在本示例中为5。spec.maxReplicas:副本数上限,在本示例中为25。spec.metrics.*:要使用的指标。在本示例中,这是每秒的 HTTP 请求数,它是您部署的适配器提供的 Monitoring 中的自定义指标。spec.metrics.external.metric.selector.matchLabels:扩缩时要过滤的特定资源标签。
从
frontendIngress 负载均衡器中查找转发规则的名称:export FW_RULE=$(kubectl get ingress frontend -o=jsonpath='{.metadata.annotations.ingress\.kubernetes\.io/forwarding-rule}') echo $FW_RULE输出类似于以下内容:
k8s2-fr-j76hrtv4-default-frontend-wvvf7381将您的转发规则添加到清单中:
sed -i "s/FORWARDING_RULE_NAME/$FW_RULE/g" "extras/postgres-hpa/hpa/frontend.yaml"此命令将
FORWARDING_RULE_NAME替换为已保存的转发规则。将清单应用于集群:
kubectl apply -f extras/postgres-hpa/hpa/frontend.yaml
模拟负载
在本部分中,您将使用负载生成器模拟流量高峰,并观察副本数和节点数如何纵向扩容以适应随时间增加的负载。然后,您可以停止生成流量并观察副本数和节点数如何相应地缩减。
在开始之前,请检查 Pod 横向自动扩缩器的状态并查看使用中的副本数。
获取
HorizontalPodAutoscaler资源的状态:kubectl get hpa输出类似于以下内容,其中显示有 1 个
frontend副本和 5 个userservice副本:NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE frontend Deployment/frontend <unknown>/5 (avg) 5 25 1 34s userservice Deployment/userservice 0%/60% 5 50 5 4m56sCymbal Bank 示例应用包含一个
loadgeneratorService。此 Service 会持续向前端发送模拟用户的请求,定期创建新账号并模拟新账号之间的交易。在本地公开
loadgenerator网页界面。您可以使用此界面模拟 Cymbal Bank 示例应用的负载:kubectl port-forward svc/loadgenerator 8080如果您看到错误消息,请在 Pod 运行时重试。
在计算机上的浏览器中,打开负载生成器网页界面:
- 如果您使用的是本地 shell,请打开浏览器并转到 http://127.0.0.1:8080。
- 如果您使用的是 Cloud Shell,请点击 网页预览,然后点击在端口 8080 上预览。
在负载生成器网页界面中,如果失败次数值显示
100%,请完成以下步骤以更新测试设置:- 点击失败率计数器旁边的停止按钮。
- 在状态下,点击新测试选项。
- 将主机值更新为 Cymbal Bank 入站流量的 IP 地址。
- 点击开始大量生成请求。
在负载生成器网页界面中,点击图表标签页以观察一段时间内的性能。查看请求数和资源利用率。
打开一个新的终端窗口,并观察
frontend和userservicePod 的副本数量:kubectl get hpa -w副本数量会随着负载的增加而增加。 由于集群识别出已配置的指标达到定义的阈值,并使用 Pod 横向自动扩缩器对 Pod 数量进行纵向扩容,因此纵向扩容操作可能需要大约 10 分钟时间。
以下示例输出显示随着负载生成器的运行,副本数量已增加:
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS frontend Deployment/frontend 5200m/5 (avg) 5 25 13 userservice Deployment/userservice 71%/60% 5 50 17打开另一个终端窗口,并检查集群中的节点数:
gcloud container clusters list \ --filter='name=scalable-apps' \ --format='table(name, currentMasterVersion, currentNodeVersion, currentNodeCount)' \ --location="CONTROL_PLANE_LOCATION"将
CONTROL_PLANE_LOCATION替换为集群控制平面的 Compute Engine 位置。为区域级集群提供区域,或为可用区级集群提供可用区。节点数也在初始数量的基础上增加,以容纳新副本。节点数的增加由 GKE Autopilot 提供支持。您无需为此节点扩缩进行任何配置。
打开负载生成器界面,然后点击停止以结束测试。
再次检查副本数和节点数,并观察数量随着负载的减少而减少。纵向缩容可能需要一些时间,因为 Kubernetes
HorizontalPodAutoscaler资源中副本的默认稳定时长为 5 分钟。
在实际环境中,环境中的节点和 Pod 的数量都将按照与此模拟负载相同的方式自动增加和减少。Cymbal Bank 示例应用旨在适应此类扩缩需求。请与您的应用运营人员和站点可靠性工程 (SRE) 或应用开发者联系,了解他们的工作负载是否可以从这些扩缩功能中受益。