VPA全称Vertical Pod Autoscaler,即垂直 Pod 自动扩缩容,它根据容器资源使用率自动设置 CPU 和 Memory 的requests,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。
VPA介绍
VPA工作流程:
VPA 由三部分组成:
Recommender:用于根据监控指标结合内置机制给出资源建议值,自动扩展所需的初始任务是获取指标并确定工作负载的当前使用情况。根据资源的当前和过去指标,推荐器将为每个容器确定一组“推荐”的CPU和内存值。
Updater:用于实时更新 pod resource requests,当检测到应将哪些”正确“请求委托给推荐程序时,更新程序控制器会将每个部署的当前请求和建议请求与委托的垂直容器自动缩放器对象进行比较。如果部署的相应VPA对象的更新模式设置为“自动”或“重新创建”,则更新程序控制器将有助于创建包含新建议请求的新Pod。
Admission Controller: 用于在 pod 创建时修改 resource requests,如果您已经弄清了什么是准入控制器及其用途,则VPA还包括一个变异的准入钩子。如果VPA对象的模式设置为“自动”,“重新创建”或“初始”,则该Webhook将在将Pod接纳到集群时注入由Recommender生成的当前请求值。
VPA 有四种更新模式:
Auto:将使用指定的更新机制在pod启动时和pod处于活动状态时分配请求值。
Recreate:将在容器启动时分配请求值,如果当前推荐值与当前请求值相差很大,则将驱逐该容器并创建一个新的容器。
Initial:仅在pod创建时分配资源请求,以后再也不会更改它们。
Off:不会自动更改容器的资源要求。将计算建议,并可以在VPA对象中对其进行检查。
VPA部署
部署metrics-server
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml
kubectl get deployment metrics-server -n kube-system
部署vpa
匹配的版本
| VPA version | Kubernetes version |
|---|---|
| 0.14 | 1.25+ |
| 0.13 | 1.25+ |
| 0.12 | 1.25+ |
| 0.11 | 1.22 - 1.24 |
| 0.10 | 1.22+ |
| 0.9 | 1.16+ |
| 0.8 | 1.13+ |
| 0.4 to 0.7 | 1.11+ |
| 0.3.X and lower | 1.7+ |
安装vpa
git clone https://github.com/kubernetes/autoscaler.git
cd autoscaler/vertical-pod-autoscaler/
./hack/vpa-up.sh
kubectl get pods -n kube-system
部署应用
task-scheduling-api.yaml
apiVersion: "autoscaling.k8s.io/v1"
kind: VerticalPodAutoscaler
metadata:
name: "task-scheduling-api"
spec:
targetRef:
apiVersion: "apps/v1"
kind: Deployment
name: "task-scheduling-api"
resourcePolicy:
containerPolicies:
- containerName: '*'
minAllowed:
cpu: '0.1'
memory: 1024M
maxAllowed:
cpu: '2'
memory: 5120M
controlledResources: ["cpu", "memory"]
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: "task-scheduling-api"
namespace: data-platform
labels:
app.kubernetes.io/name: "task-scheduling-api"
app: "task-scheduling-api"
spec:
replicas: 1
selector:
matchLabels:
app.kubernetes.io/name: "task-scheduling-api"
app: "task-scheduling-api"
template:
metadata:
labels:
app.kubernetes.io/name: "task-scheduling-api"
app: "task-scheduling-api"
spec:
containers:
- name: task-scheduling-api
image: "***.dkr.ecr.us-east-2.amazonaws.com/task-scheduling-api:0.0.43"
imagePullPolicy: Always
ports:
- name: http
containerPort: 80
protocol: TCP
resources:
requests:
cpu: '0.1'
memory: 1024M
readinessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 30
timeoutSeconds: 10
imagePullSecrets:
- name: docker-registry
查看 kubectl -n data-platform describe vpa
kubectl -n data-platform describe vpa xiexiong@bogon
Name: task-scheduling-api
Namespace: data-platform
Labels: app.kubernetes.io/managed-by=Helm
helm.toolkit.fluxcd.io/name=data-platform
helm.toolkit.fluxcd.io/namespace=data-platform
Annotations: meta.helm.sh/release-name: data-platform
meta.helm.sh/release-namespace: data-platform
API Version: autoscaling.k8s.io/v1
Kind: VerticalPodAutoscaler
Metadata:
Creation Timestamp: 2023-06-27T08:44:30Z
Generation: 9
Managed Fields:
API Version: autoscaling.k8s.io/v1
Fields Type: FieldsV1
fieldsV1:
f:metadata:
f:annotations:
.:
f:meta.helm.sh/release-name:
f:meta.helm.sh/release-namespace:
f:labels:
.:
f:app.kubernetes.io/managed-by:
f:helm.toolkit.fluxcd.io/name:
f:helm.toolkit.fluxcd.io/namespace:
f:spec:
.:
f:resourcePolicy:
.:
f:containerPolicies:
f:targetRef:
Manager: helm-controller
Operation: Update
Time: 2023-06-27T08:44:30Z
API Version: autoscaling.k8s.io/v1
Fields Type: FieldsV1
fieldsV1:
f:status:
.:
f:conditions:
f:recommendation:
.:
f:containerRecommendations:
Manager: recommender
Operation: Update
Time: 2023-06-27T08:45:16Z
Resource Version: 236431579
UID: 60aeff7f-d87a-4eac-b08f-d3b625808a6d
Spec:
Resource Policy:
Container Policies:
Container Name: *
Controlled Resources:
cpu
memory
Max Allowed:
Cpu: 2
Memory: 5120M
Min Allowed:
Cpu: 0.1
Memory: 1024M
Target Ref:
API Version: apps/v1
Kind: Deployment
Name: task-scheduling-api
Status:
Conditions:
Last Transition Time: 2023-06-27T08:45:16Z
Status: True
Type: RecommendationProvided
Recommendation:
Container Recommendations:
Container Name: task-scheduling-api
Lower Bound:
Cpu: 100m
Memory: 1024M
Target:
Cpu: 100m
Memory: 1024M
Uncapped Target:
Cpu: 49m
Memory: 813749082
Upper Bound:
Cpu: 1884m
Memory: 5120M
Events: <none>