本页面介绍了如何使用 Pod 纵向自动扩缩在 Google Kubernetes Engine (GKE) 集群中分析和调整容器的 CPU 请求和内存请求。
您可以通过 Google Cloud 控制台手动扩缩容器资源,使用 VerticalPodAutoscaler
对象分析资源,或使用 Pod 纵向自动扩缩配置自动扩缩。
准备工作
在开始之前,请确保您已执行以下任务:
- 启用 Google Kubernetes Engine API。 启用 Google Kubernetes Engine API
- 如果您要使用 Google Cloud CLI 执行此任务,请安装并初始化 gcloud CLI。 如果您之前安装了 gcloud CLI,请运行
gcloud components update
以获取最新版本。
分析资源请求
Pod 纵向自动扩缩器会自动分析容器并提供建议的资源请求。您可以使用 Google Cloud 控制台、Cloud Monitoring 或 Google Cloud CLI 查看这些资源请求。
控制台
要在 Google Cloud 控制台中查看建议的资源请求,您必须部署已存在至少 24 小时的现有工作负载。 某些建议可能不适用于某些工作负载或与某些工作负载不相关,例如过去 24 小时内创建的工作负载、独立 Pod 以及使用 Java 编写的应用。
进入 Google Cloud 控制台中的工作负载页面。
在工作负载列表中,点击要扩缩的工作负载的名称。
点击 list 操作 > 扩缩 > 修改资源请求。
“分析资源利用率数据”部分显示 Pod 纵向自动扩缩器控制器分析的历史使用情况数据,用于在“调整资源请求和限制”部分中创建建议的资源请求。
Cloud Monitoring
如需在 Cloud Monitoring 中查看建议的资源请求,您必须已部署现有工作负载。
转到 Google Cloud 控制台中的 Metrics Explorer 页面。
点击配置。
展开选择指标菜单。
在资源菜单中,选择 Kubernetes 扩缩 (Kubernetes Scale)。
在指标类别 (Metric category) 菜单中,选择自动扩缩器。
在指标菜单中,选择 Recommended per replicate request bytes(每个复制请求建议的字节数)和 Recommended per replica request core(每个副本请求建议的核心)。
点击应用。
gcloud CLI
如需查看建议的资源请求,您必须创建 VerticalPodAutoscaler
对象和 Deployment。
对于 Standard 集群,请为集群启用 Pod 纵向自动扩缩。对于 Autopilot 集群,Pod 纵向自动扩缩默认处于启用状态。
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
将
CLUSTER_NAME
替换为您的集群名称。将以下清单保存为
my-rec-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx
此清单描述了一个没有 CPU 或内存请求的
Deployment
。containers.name
值为my-rec-deployment
指定 Deployment 中的所有 Pod 都属于VerticalPodAutoscaler
。将清单应用于集群:
kubectl create -f my-rec-deployment.yaml
将以下清单保存为
my-rec-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-rec-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-rec-deployment updatePolicy: updateMode: "Off"
此清单描述了
VerticalPodAutoscaler
。updateMode
值Off
意味着,在 Pod 创建后,Pod 纵向自动扩缩器控制器会分析容器的 CPU 和内存需求,并在资源的status
字段中记录这些建议。Pod 纵向自动扩缩器不会自动更新正在运行的容器的资源请求。将清单应用于集群:
kubectl create -f my-rec-vpa.yaml
一段时间后,查看
VerticalPodAutoscaler
:kubectl get vpa my-rec-vpa --output yaml
输出内容类似如下:
... recommendation: containerRecommendations: - containerName: my-rec-container lowerBound: cpu: 25m memory: 262144k target: cpu: 25m memory: 262144k upperBound: cpu: 7931m memory: 8291500k ...
此输出显示针对 CPU 和内存请求的建议。
手动设置 Pod 资源请求
您可以使用 Google Cloud CLI 或 Google Cloud 控制台手动设置 Pod 资源请求。
控制台
转到 Google Cloud 控制台中的工作负载页面。
在工作负载列表中,点击要扩缩的工作负载的名称。
点击 list 操作 > 扩缩 > 修改资源请求。
- 调整资源请求和限制部分显示每个容器的当前 CPU 和内存请求以及建议的 CPU 和内存请求。
点击 Apply Latest Suggestions(应用最新建议)以查看为每个容器建议的请求。
点击保存更改。
点击确认。
gcloud
如需为 Pod 设置资源请求,请在 Deployment 清单中设置 requests.cpu 和 memory.cpu 值。在此示例中,您将使用建议的资源请求手动修改在分析资源请求中创建的 Deployment。
将以下示例清单保存为
my-adjusted-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-rec-deployment spec: replicas: 2 selector: matchLabels: app: my-rec-deployment template: metadata: labels: app: my-rec-deployment spec: containers: - name: my-rec-container image: nginx resources: requests: cpu: 25m memory: 256Mi
此清单描述了一个具有两个 Pod 的 Deployment。每个 Pod 各有一个请求 25 milliCPU 和 256 MiB 内存的容器。
将清单应用于集群:
kubectl apply -f my-adjusted-deployment.yaml
您还可以通过执行以下步骤来手动应用更改:
转到 Google Cloud 控制台中的工作负载页面。
在工作负载列表中,点击要扩缩的工作负载的名称。
点击 list 操作 > 扩缩 > 修改资源请求。
配置容器请求。
点击获取等效 YAML (Get Equivalent YAML)。
点击下载工作负载,或将清单复制并粘贴到名为
resource-adjusted.yaml
的文件中。将清单应用到您的集群:
kubectl create -f resource-adjusted.yaml
自动设置 Pod 资源请求
Pod 纵向自动扩缩会使用 VerticalPodAutoscaler
对象在 updateMode
为 Auto
时自动设置 Pod 上的资源请求。 您可以使用 gcloud CLI 或 Google Cloud 控制台配置 VerticalPodAutoscaler
。
控制台
如需自动设置资源请求,您必须有一个启用了 Pod 纵向自动扩缩功能的集群。Autopilot 集群默认启用 Pod 纵向自动扩缩功能。
启用 Pod 纵向自动扩缩
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
在自动化部分中,点击 Pod 纵向自动扩缩选项对应的 edit 修改。
选中启用 Pod 纵向自动扩缩复选框。
点击保存更改。
配置 Pod 纵向自动扩缩
转到 Google Cloud 控制台中的工作负载页面。
在工作负载列表中,点击要为其配置 Pod 纵向自动扩缩的 Deployment 的名称。
点击 list 操作 > 自动扩缩 > Pod 纵向自动扩缩。
选择自动扩缩模式:
- 自动模式:Pod 纵向自动扩缩会在 Pod 的生命周期内更新 CPU 和内存请求。
- 初始模式:Pod 纵向自动扩缩仅会在创建 Pod 时分配资源请求,之后不再进行更改。
(可选)设置容器政策。通过此选项,您可以确保建议绝不会设置为高于或低于指定的资源请求。
- 点击 expand_more 添加政策。
- 为修改容器模式选择自动。
- 在受控资源中,选择要针对哪些资源自动扩缩容容器。
- 点击添加规则,为容器的资源请求设置一个或多个最小或最大范围:
- 允许的内存下限:容器应始终具有的内存大小下限(以 MiB 为单位)。
- 允许的 CPU 下限:容器应始终具有的 CPU 数量下限(以 mCPU 为单位)。
- 允许的内存上限:容器应始终具有的内存大小上限(以 MiB 为单位)。
- 允许的 CPU 数量上限:容器应始终具有的 CPU 数量上限(以 mCPU 为单位)。
点击完成。
点击保存。
gcloud
如需自动设置资源请求,您必须使用已启用 Pod 纵向自动扩缩功能的集群。Autopilot 集群默认启用了该功能。
对于 Standard 集群,请为集群启用 Pod 纵向自动扩缩:
gcloud container clusters update CLUSTER_NAME --enable-vertical-pod-autoscaling
将
CLUSTER_NAME
替换为您的集群名称。将以下清单保存为
my-auto-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-auto-deployment spec: replicas: 2 selector: matchLabels: app: my-auto-deployment template: metadata: labels: app: my-auto-deployment spec: containers: - name: my-container image: registry.k8s.io/ubuntu-slim:0.1 resources: requests: cpu: 100m memory: 50Mi command: ["/bin/sh"] args: ["-c", "while true; do timeout 0.5s yes >/dev/null; sleep 0.5s; done"]
此清单描述了一个具有两个 Pod 的 Deployment。每个 Pod 各有一个请求 100 milliCPU 和 50 MiB 内存的容器。
将清单应用于集群:
kubectl create -f my-auto-deployment.yaml
列出正在运行的 Pod:
kubectl get pods
输出会显示
my-deployment
中的 Pod 的名称:NAME READY STATUS RESTARTS AGE my-auto-deployment-cbcdd49fb-d6bf9 1/1 Running 0 8s my-auto-deployment-cbcdd49fb-th288 1/1 Running 0 8s
将以下清单保存为
my-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-auto-deployment updatePolicy: updateMode: "Auto"
此清单描述了具有以下属性的
VerticalPodAutoscaler
:targetRef.name
:指定由名为my-deployment
的 Deployment 控制的任何 Pod 都属于此VerticalPodAutoscaler
。updateMode: Auto
:指定 Pod 纵向自动扩缩器控制器可以删除 Pod,调整 CPU 和内存请求,然后启动新的 Pod。
您还可以使用
updateMode: "Initial"
配置 Pod 纵向自动扩缩,使其仅在创建 Pod 时分配资源请求。将清单应用于集群:
kubectl create -f my-vpa.yaml
等待几分钟,然后再次查看正在运行的 Pod:
kubectl get pods
输出显示 Pod 名称已更改:
NAME READY STATUS RESTARTS AGE my-auto-deployment-89dc45f48-5bzqp 1/1 Running 0 8s my-auto-deployment-89dc45f48-scm66 1/1 Running 0 8s
如果 Pod 名称未更改,请再稍等片刻,然后再次查看正在运行的 Pod。
查看 Pod 纵向自动扩缩器的相关信息
要查看 Pod 纵向自动扩缩器的详细信息,请执行以下操作:
获取有关正在运行的其中一个 Pod 的详细信息:
kubectl get pod POD_NAME --output yaml
将
POD_NAME
替换为您在上一步中检索到的其中一个 Pod 的名称。输出类似于以下内容:
apiVersion: v1 kind: Pod metadata: annotations: vpaUpdates: 'Pod resources updated by my-vpa: container 0: cpu capped to node capacity, memory capped to node capacity, cpu request, memory request' ... spec: containers: ... resources: requests: cpu: 510m memory: 262144k ...
此输出显示 Pod 纵向自动扩缩器控制器的内存请求为 262144k,CPU 请求为 510 milliCPU。
获取有关
VerticalPodAutoscaler
的详细信息:kubectl get vpa my-vpa --output yaml
输出类似于以下内容:
... recommendation: containerRecommendations: - containerName: my-container lowerBound: cpu: 536m memory: 262144k target: cpu: 587m memory: 262144k upperBound: cpu: 27854m memory: "545693548"
此输出显示有关 CPU 和内存请求的建议,并包括以下属性:
target
:指定为了使容器以最佳方式运行,它应请求 587 milliCPU 和 262,144 千字节的内存。lowerBound
和upperBound
:Pod 纵向自动扩缩使用这些属性来决定是否删除 Pod 并将其替换为新 Pod。如果 Pod 的请求小于下限或大于上限,则 Pod 纵向自动扩缩器会删除该 Pod 并将其替换为符合目标特性的 Pod。
停用特定容器
您可以使用 gcloud CLI 或 Google Cloud 控制台停用特定容器的 Pod 纵向自动扩缩功能。
控制台
如需停用特定容器的 Pod 纵向自动扩缩功能,您必须有一个启用了 Pod 纵向自动扩缩功能的集群。Autopilot 集群默认启用 Pod 纵向自动扩缩功能。
启用 Pod 纵向自动扩缩
转到 Google Cloud 控制台中的 Google Kubernetes Engine 页面。
在集群列表中,点击您要修改的集群的名称。
在自动化部分中,点击 Pod 纵向自动扩缩选项对应的 edit 修改。
选中启用 Pod 纵向自动扩缩复选框。
点击保存更改。
配置 Pod 纵向自动扩缩
转到 Google Cloud 控制台中的工作负载页面。
在工作负载列表中,点击要为其配置 Pod 纵向自动扩缩的 Deployment 的名称。
点击 list 操作 > 自动扩缩 > Pod 纵向自动扩缩。
选择自动扩缩模式:
- 自动模式:Pod 纵向自动扩缩会在 Pod 的生命周期内更新 CPU 和内存请求。
- 初始模式:Pod 纵向自动扩缩仅会在创建 Pod 时分配资源请求,之后不再进行更改。
点击 expand_more 添加政策。
选择要停用的容器。
对于修改容器模式,请选择关闭。
点击完成。
点击保存。
gcloud
如需停用特定容器的 Pod 纵向自动扩缩,请执行以下步骤:
将以下清单保存为
my-opt-vpa.yaml
:apiVersion: autoscaling.k8s.io/v1 kind: VerticalPodAutoscaler metadata: name: my-opt-vpa spec: targetRef: apiVersion: "apps/v1" kind: Deployment name: my-opt-deployment updatePolicy: updateMode: "Auto" resourcePolicy: containerPolicies: - containerName: my-opt-sidecar mode: "Off"
此清单描述了
VerticalPodAutoscaler
。mode: "Off"
值会关闭针对容器my-opt-sidecar
的建议。将清单应用于集群:
kubectl apply -f my-opt-vpa.yaml
将以下清单保存为
my-opt-deployment.yaml
:apiVersion: apps/v1 kind: Deployment metadata: name: my-opt-deployment spec: replicas: 1 selector: matchLabels: app: my-opt-deployment template: metadata: labels: app: my-opt-deployment spec: containers: - name: my-opt-container image: nginx - name: my-opt-sidecar image: busybox command: ["sh","-c","while true; do echo Doing sidecar stuff!; sleep 60; done"]
将清单应用于集群:
kubectl apply -f my-opt-deployment.yaml
一段时间后,查看 Pod 纵向自动扩缩器:
kubectl get vpa my-opt-vpa --output yaml
以下输出显示推荐的 CPU 和内存请求:
... recommendation: containerRecommendations: - containerName: my-opt-container ...
在此输出中,只有针对一个容器的建议。未针对
my-opt-sidecar
提供建议。Pod 纵向自动扩缩绝不会更新已停用的容器上的资源。 如果您等待几分钟,该 Pod 会重新创建,但只有一个容器包含更新的资源请求。
后续步骤
- 详细了解 Pod 纵向自动扩缩。
- 了解在 GKE 上运行费用经过优化的 Kubernetes 应用的最佳做法。
- 了解如何将 CPU 资源分配给容器和 Pod。
- 了解如何将内存资源分配给容器和 Pod。