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

    技术2022-07-20  81

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

    HPA-example 自动伸缩(测试版)一、测试 HPA 基于 CPU 的自动伸缩1、运行 hpa-example,并设置 CPU 最大资源限制200m2、创建HPA控制器3、增加 CPU 负载,查看负载节点数目 二、测试 HPA 基于内存(memory)的自动伸缩1.创建一个nginx的pod2.验证nginx是否运行3.创建一个 HPA 控制器4.压测nginx的内存,hpa会对pod自动扩缩容5.取消对nginx内存的压测,hpa会对pod自动缩容 Pod 资源限制 resources.limits | resources.requests资源限制 - ResourceQuotaResourceQuota是什么Ⅰ、namespace 资源配额Ⅱ、namespace 对象数量配置Ⅲ、LimitRange 配置Pod默认 cpu、memory对 LimitRange 对象参数介绍

    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 资源进行资源限制,这个资源限制是通过 resources 的 requests和limits 实现。

    例:运行某 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,

    用户在namespace中创建资源时,quota 配额系统跟踪使用情况,以确保不超过ResourceQuota的限制值。如果创建或更新资源违反配额约束,则HTTP状态代码将导致请求失败403 FORBIDDEN。资源配额的更改不会影响到已经创建的pod。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

    查看 resourcequota: kubectl get resourcequota -n spark-cluster

    查看详细的 resourcequota:kubectl 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是在pod和container级别的资源限制

    如果 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。
    Processed: 0.019, SQL: 9