在现代云原生环境中,应用的流量往往具有不可预测性。为了应对这种变化,Kubernetes 提供了多种自动伸缩机制来动态调整应用实例的数量和每个实例分配的资源。本文将深入探讨两种主要的自动伸缩工具:水平 Pod 自动伸缩器 (HPA) 和垂直 Pod 伸缩器 (VPA),并提供实际的应用示例。
水平 Pod 自动伸缩器 (HPA)
水平 Pod 自动伸缩器(Horizontal Pod Autoscaler, HPA)是 Kubernetes 中一个用于根据 CPU 使用率或自定义指标自动调整副本数量的控制器。它允许您定义最小和最大副本数,以及目标 CPU 利用率。
配置 HPA
假设我们有一个部署了 Nginx 的 Deployment,其 YAML 文件如下所示:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.7.9
ports:
- containerPort: 80
为了设置 HPA,我们需要创建一个 HPA 对象:
apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx-deployment
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
上述配置中,minReplicas
定义了最小副本数,maxReplicas
定义了最大副本数,而 averageUtilization
表示目标 CPU 利用率(百分比)。
应用 HPA
我们可以使用 kubectl
命令行工具来应用这些配置:
kubectl apply -f deployment.yaml
kubectl apply -f hpa.yaml
查看 HPA 状态:
kubectl get hpa
垂直 Pod 伸缩器 (VPA)
垂直 Pod 伸缩器(Vertical Pod Autoscaler, VPA)是一种推荐机制,用于自动调整 Pod 内的容器资源请求和限制。与 HPA 不同的是,VPA 更关注于单个 Pod 的资源分配,而不是 Pod 的数量。
安装 VPA
首先需要安装 VPA,在 Kubernetes 集群上执行以下命令:
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/rbac RoleBasedAccessControl.yml
kubectl apply -f https://raw.githubusercontent.com/kubernetes/autoscaler/master/vertical-pod-autoscaler/deploy/cluster-wide.yaml
配置 VPA
VPA 可以通过在 Pod 规格中添加注解来控制:
apiVersion: v1
kind: Pod
metadata:
name: nginx-vpa
annotations:
autoscaling.k8s.io/cpu-min: "100m"
autoscaling.k8s.io/cpu-max: "1"
autoscaling.k8s.io/memory-min: "64Mi"
autoscaling.k8s.io/memory-max: "256Mi"
spec:
containers:
- name: nginx
image: nginx:1.7.9
resources:
requests:
cpu: "100m"
memory: "64Mi"
limits:
cpu: "1"
memory: "256Mi"
应用 VPA
应用 Pod 的 YAML 文件:
kubectl apply -f pod.yaml
查看 VPA 推荐:
kubectl get pods -o json | jq '.items[].metadata.annotations'
结论
通过结合使用 HPA 和 VPA,可以实现更高效的资源利用。HPA 根据应用负载动态调整 Pod 数量,而 VPA 则确保每个 Pod 都能获得合适的资源分配。这两种工具的组合使用可以帮助您构建弹性、高效且成本效益高的 Kubernetes 部署。