k8s学习(30):HPA-自动伸缩

Horizontal Pod Autoscaling(HPA)

Horizontal Pod Autoscaling可以根据CPU利用率自动伸缩一个Replication Controller、Deployment或Replica Set中的Pod数量

创建一个deployment

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@k8s-master k8s-install]# kubectl run php-apache --image=gcr.io/google_containers/hpa-example --image-pull-policy='IfNotPresent'  --requests=cpu=200m --expose --port=80
kubectl run --generator=deployment/apps.v1 is DEPRECATED and will be removed in a future version. Use kubectl run --generator=run-pod/v1 or kubectl create instead.
service/php-apache created
deployment.apps/php-apache created

# 查看pod
[root@k8s-master k8s-install]# kubectl get pods
NAME READY STATUS RESTARTS AGE
php-apache-799f99c985-zqn77 1/1 Running 0 4s

## 查看资源使用情况
[root@k8s-master k8s-install]# kubectl top pod php-apache-799f99c985-zqn77
NAME CPU(cores) MEMORY(bytes)
php-apache-799f99c985-zqn77 0m 8Mi

创建HPA控制器

1
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
1
2
3
4
# 查看
[root@k8s-master ~]# kubectl get hpa
NAME REFERENCE TARGETS MINPODS MAXPODS REPLICAS AGE
php-apache Deployment/php-apache 183%/50% 1 10 4 29m

增加负载,查看负载节点数目

1
2
$ kubectl run -i --tty load-generator --image=busybox --image-pull-policy='IfNotPresent'   /bin/sh
$ while true; do wget -q -O- http://php-apache.default.svc.cluster.local;done
1
2
3
4
5
6
7
8
9
10
11
# 查看pod负载
[root@k8s-master ~]# kubectl top pod php-apache-799f99c985-zqn77
NAME CPU(cores) MEMORY(bytes)
php-apache-799f99c985-zqn77 298m 8Mi
[root@k8s-master ~]# kubectl get pod
NAME READY STATUS RESTARTS AGE
load-generator-76f9c7b5f8-nx5mz 1/1 Running 0 24m
php-apache-799f99c985-nxhzp 1/1 Running 0 79s
php-apache-799f99c985-r9zlp 1/1 Running 0 49s
php-apache-799f99c985-zqn77 1/1 Running 0 30m
[root@k8s-master ~]#

资源限制-Pod

Kubernetes对资源的限制实际上是通过cgroup来控制的,cgroup是容器的一组来控制内核如何运行进程的相关属性集合。针对内存、CPU和各种设备都有对应的cgroup

默认情况下,pod运行没有CPU和内存的限额。这意味着系统中的任何Pod将能够执行该Pod所在的节点一样,消耗足够多的CPU和内存。一般会针对某些应用的pod资源进行资源限制,这个资源限制是通过resources的requests和limits来实现

1
2
3
4
5
6
7
8
9
10
11
spec:
containers:
- image: xxx
name: auth
resources:
limits:
cpu: "4"
memory: 2Gi
requests:
cpu: 250m
memory: 250Mi

requests要分配的资源,limits为最高请求的资源值,可以简单理解为初始值和最大值

资源限制-名称空间

1 计算资源配额

1
2
3
4
5
6
7
8
9
10
11
12
apiVersion: v1
kind: ResourceQuota
metadata:
name: compute-resources
namespace: spark-cluster
spec:
hard:
pods: "20"
requests.cpu: "20"
requests.memory: 100Gi
limits.cpu: "40"
limits.memory: 200Gi

2 配置对象数量配额限制

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVesion: v1
kindL ResourceQuota
metadata:
name: object-counts
namespace:spark-cluster
spec:
hard:
configmaps: "10"
persistentvolumeclaims: "4"
replicationcontrollers: "20"
secrets: "10"
services: "10"
services.loadbalancers: "2"

3 配置CPU和内存limitRange

1
2
3
4
5
6
7
8
9
10
11
12
13
apiVersion: v1
kind: LimitRange
metadata:
name: mem-limit-range
spec:
limits:
- default:
memory: 50Gi
cpu: 5
defaultRequest:
memory: 1Gi
cpu: 1
type: Container
  • defualt即limit的值
  • defaultRequest即request的值