Kubernetes - HPA自动伸缩、resources资源限制

HPA-example 自动伸缩(测试版)

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

HPA-example:资源测试时使用

HPA-example 镜像搜索:hpa-example

HPA-example 镜像安装:docker pull registry.cn-hangzhou.aliyuncs.com/hpa-example/hpa-example:v1

所有节点安装 HPA,也可以打包然后传到各个节点,master+Nodes


一、测试 HPA 基于 CPU 的自动伸缩

1、运行 hpa-example,并设置 CPU 最大资源限制200m

该剧本是用来测试使用的,创建 deployment 副本,并指定 resources.limits.cpu and resources.requests.cpu

[root@k8s-master ~]# docker pull webdevops/php-apache		所有节点pull

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  replicas: 1
  selector:
   matchLabels:
    app: php-apache
  template:
    metadata:
      labels:
        app: php-apache
    spec:
      containers:
        - name: php-apache
          image: registry.cn-hangzhou.aliyuncs.com/hpa-example/hpa-example:v1
          ports:
           - containerPort: 80
          resources:
             limits:
               cpu: 200m	#CPU利用率赫兹最大200M
             requests: 
               cpu: 200m


2、创建HPA控制器

根据 HPA 控制器来控制 deployment-php-apche 副本 的CPU阈值

kubectl autoscale 命令文档http://docs.kubernetes.org.cn/486.html

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
#horizontalpodautoscaler.autoscaling/php-apache autoscaled

kubectl autoscale:水平自动伸缩
deployment:指定deployment,并创建已经定义好资源的自动伸缩器
php-apache:设置伸缩的Pod服务
--cpu-percent=50  CPU的利用率赫兹超过50M 则创建新的 Pod 副本
--min:一次最小创建1一个
--max:最多创建到10个封顶

出现以下效果,即为 HPA 开启成功

[


3、增加 CPU 负载,查看负载节点数目
kubectl run -i --tty load-generator --image=busybox /bin/sh

/ # while true; do wget -q -O- http://10.244.2.18 ;done
OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK!OK

kubectl get hpa -w 实时监控 HPA 的 CPU阈值情况

在这里插入图片描述

kubectl get pod 因为超过了 HPA 控制器设置的 50%CPU阈值,所以增加一个新的php-apache服务

在这里插入图片描述


二、测试 HPA 基于内存(memory)的自动伸缩

测试HPA autoscaling/v2beta1版本-基于内存的自动扩缩容

1.创建一个nginx的pod

cat nginx.yaml

apiVersion:apps/v1
kind: Deployment
metadata:
  name:nginx-hpa
spec:
  selector:
    matchLabels:
      app: nginx
  replicas: 1
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.9.1
        ports:
        - containerPort: 80
          name: http
          protocol: TCP
        resources:
          requests:
            cpu: 0.01
            memory: 25Mi
          limits:
            cpu: 0.05
            memory: 60Mi

kubectl create -f nginx.yaml


2.验证nginx是否运行

kubectl get pods
显示如下,说明nginx的pod正常运行:

NAME                       READY  STATUS    RESTARTS   AGE
nginx-hpa-bb598885d-j4kcp 1/1     Running   0         17m

**注意:**nginx的pod里需要有如下字段,否则hpa会采集不到内存指标

resources:
	requests:
  		cpu: 0.01
  		memory: 25Mi
	limits:
   		cpu: 0.05
  		memory: 60Mi


3.创建一个 HPA 控制器
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
  name: nginx-hpa
spec:
	maxReplicas: 10
	minReplicas: 1
	scaleTargetRef:
  		apiVersion: apps/v1
  		kind: Deployment
  		name: nginx-hpa
	metrics:
  		- type: Resource
  		resource:
  			name: memory
 		 	targetAverageUtilization: 60

kubectl get hpa
显示如下:

NAME 		 REFERENCE 			  TARGETS  MINPODS MAXPODS  REPLICAS   AGE
nginx-hpa  Deployment/nginx-hpa   5%/60%    1        10         1      20s


4.压测nginx的内存,hpa会对pod自动扩缩容

登录到上面通过pod创建的nginx,并生成一个文件,增加内存
kubectl exec -it nginx-hpa-bb598885d-j4kcp – /bin/sh

压测:
dd if=/dev/zero of=/tmp/a

打开新的终端:
kubectl get hpa

NAME       REFERENCE              TARGETS    MINPODS  MAXPODS   REPLICAS   AGE
nginx-hpa  Deployment/nginx-hpa   200%/60%  1         10        3          12m

上面的targets列可看到200%/60%,200%表示当前cpu使用率,60%表示所有pod的cpu使用率维持在60%,现在cpu使用率达到200%,所以pod增加到4个
kubectl get deployment

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-hpa    4/4     4            4           25m

kubectl get pods

NAME                          READY   STATUS    RESTARTS   AGE
nginx-hpa-bb598885d-j4kcp     1/1     Running   0          25m
nginx-hpa-bb598885d-rj5hk     1/1     Running   0          63s
nginx-hpa-bb598885d-twv9c     1/1     Running   0          18s
nginx-hpa-bb598885d-v9ft5     1/1     Running   0          63s


5.取消对nginx内存的压测,hpa会对pod自动缩容

kubectl exec -it nginx-hpa-bb598885d-j4kcp – /bin/sh

删除/tmp/a这个文件:rm -rf /tmp/a

kubectl get hpa
显示如下,可看到内存使用率已经降到5%:

NAME        REFERENCE              TARGETS   MINPODS   MAXPODS   REPLICAS   AGE
nginx-hpa   Deployment/nginx-hpa   5%/60%    1         10        1          26m

kubectl get deployment

显示如下,deployment的pod又恢复到1个了:

NAME         READY   UP-TO-DATE   AVAILABLE   AGE
nginx-hpa    1/1     1            1           38m


Pod 资源限制 resources.limits | resources.requests

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

资源名称描述
limits.cpunamespace下所有pod的CPU限制总和
limits.memory内存限制总和
requests.cpuCPU请求总和
requests.memory内存限制总和
requests.storagePVC请求的存储值的总和
persistentvolumeclaimsPVC的数量
requests.ephemeral-storage本地临时存储请求总和
limits.ephemeral-storage本地临时存储限制总和

默认情况下,Pod 运行没有 CPU 和内存的限额,这意味着系统中的任何 Pod 将能够像执行 Pod 所在的节点一样,会消耗足够多的 CPU 和 内存。

一般针对某些应用的 Pod 资源进行资源限制,这个资源限制是通过 resourcesrequestslimits 实现。

例:运行某 Pod。
刚开始运行的资源需求是 cpu: 250m, memory: 250Mi ;
如果资源需求达到峰值则可以超出,cpu: “4” , memory: 2Gi

spec:
  containers: 
    image: ...
    name: ...
    ports: ...
    resource: 
       limits: 
          cpu: "4"
          memory: 2Gi
       requests: 
          cpu: 250m
          memory: 250Mi

requests 要分配的资源,limits 为最高请求的资源值,requests为需求值。limits是可以(必须)超出需求值的。

limits 的值不能低于 requests,同理 requests不能高于 limits。


资源限制 - ResourceQuota

ResourceQuota 是针对 namespace 做的资源限制

ResourceQuota是什么

当多个namespace共用同一个集群的时候可能会有某一个namespace使用的资源配额超过其公平配额,导致其他namespace的资源被占用。
这个时候我们可以为每个namespace创建一个ResourceQuota,

  1. 用户在namespace中创建资源时,quota 配额系统跟踪使用情况,以确保不超过ResourceQuota的限制值。
  2. 如果创建或更新资源违反配额约束,则HTTP状态代码将导致请求失败403 FORBIDDEN。
  3. 资源配额的更改不会影响到已经创建的pod。
  4. apiserver的启动参数通常kubernetes默认启用了ResourceQuota.在apiserver的启动参数–enable-admission-plugins=中如果有ResourceQuota便为启动。


Ⅰ、namespace 资源配额

首先创建一个namespace

创建: kubectl create namespace spark-cluster

查看:kubectl get ns

创建一个ResourceQuota

apiVersion: v1
kind: ResourceQuota
metadata: 
  name: compute-resources
  namespace: spark-cluster		#名称控制
spec: 
  hard: 
    pods: "20"					#能够创建的 Pod 数量
    requests.cpu: "20"			#使用 CPU 的需求量
    requests.memory: 100Gi		#使用 memory 的需求两
    limits.cpu: "40"			#最大 CPU 的使用量
    limits.memory: 200Gi		#最大 memory 的使用量

kubectl create -f spark.yaml

查看 resourcequotakubectl get resourcequota -n spark-cluster

查看详细的 resourcequotakubectl describe resourcequotas -n spark-cluster

在这里插入图片描述

Ⅱ、namespace 对象数量配置

apiVersion: v1
kind: ResourceQuota
metadata: 
  name: compute-resources
  namespace: spark-cluster		#名称控制
spec: 
  hard: 
    configmaps: "10"				#configmap 数量配额
    persistentvolumeclaims: "4"		#pvc 数量配额
    replicationcontrollers: "20"	#rc 数量配额
    secrets: "10"					#secrets 数量配额
    services: "10"					#svc 数量配额
    services.loadbalancers: "2"		#基于云服务负载的最多创建 2 个


Ⅲ、LimitRange 配置Pod默认 cpu、memory

LimitRange是在podcontainer级别的资源限制

如果 pod 不设置 limitrange,则采用当前名称空间下的最大资源运行;如果不设置 namespacequota,则采用当前节点最大资源运行 pod 。如果指定了 Limitrange 则根据配置的资源来运行。

apiVersion: v1
kind: LimitRange
metadata:
  name: mylimits
spec:
  limits:
  - max:
      cpu: "4"
      memory: 2Gi
    min:
      cpu: 200m
      memory: 6Mi
    maxLimitRequestRatio:
      cpu: 3
      memory: 2
    type: Pod			#对Pod中所有容器资源总和进行限制
    
  - default:
      cpu: 300m
      memory: 200Mi
    defaultRequest:
      cpu: 200m
      memory: 100Mi
    max:
      cpu: "2"
      memory: 1Gi
    min:
      cpu: 100m
      memory: 3Mi
    maxLimitRequestRatio:
      cpu: 5
      memory: 4
    type: Container		#对Pod中所有容器资源进行限制

default:limit的值

defaultRequest:request的值

对 LimitRange 对象参数介绍

Container 参数:

  • max: Pod 中所有容器的 Requests 值下限。
  • min: Pod 中所有容器的 Limits 值上限。
  • default: Pod 中容器未指定 Limits 时,将此值设置为默认值。
  • defaultRequest: Pod 中容器未指定 Requests 是,将此值设置为默认值。
  • maxLimitRequestRatio: Pod 中的容器设置 Limits 与 Requests 的比例的值不能超过 maxLimitRequestRatio 参数设置的值,即 Limits/Requests ≤ maxLimitRequestRatio

Pod 参数:

  • max: Pod 中所有容器资源总和值上限。
  • min:* Po 中所有容器资源总和值下限。
  • maxLimitRequestRatio: Pod 中全部容器设置 Limits 总和与 Requests 总和的比例的值不能超过maxLimitRequestRatio 参数设置的值:
    • (All Container Limits)/(All Container Requests) ≤ maxLimitRequestRatio。
      容器未指定 Limits 时,将此值设置为默认值。
  • defaultRequest: Pod 中容器未指定 Requests 是,将此值设置为默认值。
  • maxLimitRequestRatio: Pod 中的容器设置 Limits 与 Requests 的比例的值不能超过 maxLimitRequestRatio 参数设置的值,即 Limits/Requests ≤ maxLimitRequestRatio
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值