目录
一、Kubernetes Pod水平自动伸缩 HPA(常用)
1.2 metircs-server部署(k8s内用来监控资源)
二、Kubernetes Pod垂直自动伸缩 VPA(不常用,知道即可)
一、Kubernetes Pod水平自动伸缩 HPA(常用)
1.1 HPA简介
HPA,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController、Deployment 和 ReplicaSet 中的 Pod 数量。 除了 CPU 利用率,也可以基于其他应程序提供的自定义度量指标来执行自动横向扩缩。
实际生产中,广泛使用这四类指标:
1、Resource metrics - CPU核内存利用率指标
2、Pod metrics - 例如网络利用率和流量
3、Object metrics - 特定对象的指标,比如Ingress, 可以按每秒使用请求数来扩展容器
4、Custom metrics - 自定义监控,比如通过定义服务响应时间,当响应时间达到一定指标时自动扩容
1.2 metircs-server部署(k8s内用来监控资源)
github上搜索即可找到
或者:
[root@k8s-master01 ~]# wget https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/high-availability-1.21+.yaml
kubelet 证书需要由集群证书颁发机构签名(或者通过向 Metrics Server 传递参数 --kubelet-insecure-tls 来禁用证书验证)。
[root@k8s-master01 ~]# vim high-availability-1.21+.yaml
......
143 containers:
144 - args:
145 - --cert-dir=/tmp
146 - --secure-port=4443
147 - --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
148 - --kubelet-use-node-status-port
149 - --metric-resolution=15s
150 - --kubelet-insecure-tls 添加此行内容
151 image: registry.k8s.io/metrics-server/metrics-server:v0.6.4
[root@k8s-master01 ~]# kubectl apply -f high-availability-1.21+.yaml
[root@k8s-master01 ~]# kubectl get pods -n kube-system
NAME READY STATUS RESTARTS AGE
......
metrics-server-6bc5bbd65c-c8llz 1/1 Running 0 7m45s
metrics-server-6bc5bbd65c-pz6mc 1/1 Running 0 7m45s
[root@k8s-master01 ~]# kubectl top nodes
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
k8s-master01 203m 2% 1902Mi 24%
k8s-master02 156m 1% 1690Mi 21%
k8s-master03 222m 2% 2477Mi 31%
k8s-worker01 100m 1% 1466Mi 18%
k8s-worker02 99m 1% 1413Mi 18%
1.3 HPA演示示例
1.3.1 部署一个服务
[root@k8s-master01 hpa]# vim 01-nginx.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: nginx
name: nginx
namespace: default
spec:
replicas: 2
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
resources:
requests:
cpu: 200m
memory: 100Mi
---
apiVersion: v1
kind: Service
metadata:
name: nginx
namespace: default
spec:
type: NodePort
ports:
- port: 80
targetPort: 80
selector:
app: nginx
[root@k8s-master01 hpa]# kubectl apply -f 01-nginx.yaml
deployment.apps/nginx created
service/nginx created
1.3.2 创建HPA对象
这是一个 HorizontalPodAutoscaler (HPA) 对象的配置,它将控制 Deployment "nginx" 的副本数量。当 CPU 使用率超过 50% 时,HPA 将自动增加 Pod 的副本数量,最高不超过 10 个。
[root@k8s-master01 hpa]# vim 02-nginx-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: nginx-hpa
namespace: default
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
minReplicas: 1
maxReplicas: 10
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
解释:
apiVersion: autoscaling/v2
- `apiVersion` 表示所使用的 API 版本。在这个例子中,我们使用的是 `autoscaling/v2beta2` 版本,这是 Kubernetes 的 HorizontalPodAutoscaler 资源对象的版本。
kind: HorizontalPodAutoscaler
- `kind` 定义了这个资源对象的类型。在这里,它是 `HorizontalPodAutoscaler`。
metadata:
name: nginx
namespace: hpa
- `metadata` 包含与资源对象相关的元数据。在这个例子中,`name` 是资源对象的名字(这里是 "nginx"),而 `namespace` 指定了此资源所在的命名空间(这里是 "hpa")。
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: nginx
- `spec` 描述了要配置的具体细节。在这个部分,`scaleTargetRef` 指向我们要自动伸缩的目标资源。
- `apiVersion`: 目标资源的 API 版本,这里是 `apps/v1`。
- `kind`: 目标资源的类型,这里是 `Deployment`。
- `name`: 目标资源的名字,这里是 "nginx"。
minReplicas: 1
maxReplicas: 10
- `minReplicas` 和 `maxReplicas` 定义了 Pod 的最小和最大副本数。在此例中,HPA 将确保至少有一个副本在运行,并且最多不会超过 10 个副本。
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 50
- `metrics` 部分定义了用于触发自动伸缩操作的指标。在这个例子中,我们只有一个指标。
- `- type: Resource`: 这里指定度量类型为资源度量。
- `resource`: 定义了资源度量的详细信息。
- `name: cpu`: 我们正在度量 CPU 使用率。
- `target`: 设置目标值以触发自动伸缩。
- `type: Utilization`: 目标类型是利用率。
- `averageUtilization: 50`: 当平均 CPU 利用率达到或超过 50% 时,将触发自动伸缩操作。
[root@k8s-master01 hpa]# kubectl apply -f 02-nginx-hpa.yaml
1.3.3 执行压测
[root@k8s-master01 hpa]# yum -y install httpd-tools
[root@k8s-master01 hpa]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 6h47m
nginx NodePort 10.100.32.126 <none> 80:30770/TCP 20m
[root@k8s-master01 hpa]# ab -c 1000 -n 1000000000 http://192.168.10.10:30770/
This is ApacheBench, Version 2.3 <$Revision: 1430300 $>
注意10.10是主机ip,然后加nodeport端口
[root@k8s-master01 ~]# kubectl get pods
NAME READY STATUS RESTARTS AGE
nginx-f9f76bb6f-8fhr5 1/1 Running 0 76s
nginx-f9f76bb6f-dzv7k 1/1 Running 0 91s
nginx-f9f76bb6f-gr55m 1/1 Running 0 91s
nginx-f9f76bb6f-mnhdv 1/1 Running 0 106s
nginx-f9f76bb6f-nm49b 1/1 Running 0 76s
nginx-f9f76bb6f-pmpwr 1/1 Running 0 106s
nginx-f9f76bb6f-qp8hd 1/1 Running 0 91s
nginx-f9f76bb6f-qwjpt 1/1 Running 0 106s
nginx-f9f76bb6f-wj5xj 1/1 Running 0 91s
nginx-f9f76bb6f-zpsdd 1/1 Running 0 26m
可以看到,当压力上来的时候,HPA生效,将副本调至10个。
二、Kubernetes Pod垂直自动伸缩 VPA(不常用,知道即可)
VPA,全称 Vertical Pod Autoscaler,即垂直 Pod 自动纵向扩缩容,它根据容器资源使用率自动设置 CPU 和 内存 的requests,从而允许在节点上进行适当的调度,以便为每个 Pod 提供适当的资源。 它既可以缩小过度请求资源的容器,也可以根据其使用情况随时提升资源不足的容量。有些时候无法通过增加 Pod 数来扩容,比如数据库。这时候可以通过 VPA 增加 Pod 使用资源的大小,比如调整 Pod 的 CPU 和内存,进而调整Pod资源使用。
使用VPA的优缺点:
优点
Pod 资源用其所需,所以集群节点使用效率高;
Pod 会被安排到具有适当可用资源的节点上;
不必运行基准测试任务来确定 CPU 和内存请求的合适值;
VPA 可以随时调整 CPU 和内存请求,无需人为操作,因此可以减少维护时间;
缺点
不能与HPA(Horizontal Pod Autoscaler )一起使用;
而且它的纵向升级,实际上是生成一个新配置的Pod,然后把旧的干掉,所以不常用。