K8s中自动扩缩容-hpa

Kubernetes 为我们提供了这样一个资源对象:Horizontal Pod Autoscaling(Pod水平自动伸缩),简称HPA 。HAP 通过监控分析RC 或 者Deployment 控制的所有Pod 的负载变化情况来确定是否需要调整Pod 的 副本数量,这是HPA 最基本的原理。

Pod 水平自动扩缩器的实现是一个控制回路,由控制器管理器的 -- horizontal-pod-autoscaler-sync-period 参数指定周期(默认值为 15 秒)。

官方文档:Horizontal Pod Autoscaling | Kubernetes

HPA 在kubernetes 集群中被设计成一个controller ,我们可以简单的通 过kubectl autoscale 命令来创建一个HPA 资源对象,HPA Controller 默认15s轮询一次(可通过kube-controller-manager的标志-- horizontal-pod-autoscaler-sync-period 进行设置),查询指定的资源 (RC或者Deployment)中Pod 的资源使用率,并且与创建时设定的值和指 标做对比,从而实现自动伸缩的功能。

从 Kubernetes 1.8 开始,资源使用指标(如容器 CPU 和内存使用率)通 过 Metrics API 在 Kubernetes 中获取。Metrics Server 实现了 Resource Metrics API,Metrics Server 是集群范围资源使用数据的聚合器

Metrics Server 安装

下载地址:https://github.com/kubernetes-sigs/metrics-server

没有安装 Metrics Server 之前,并不能使用 kube top node 命令

kube top node
error: Metrics API not available

使用 Metrics Server 前提条件:

API Server 启用 Aggregator Routing 支持。否则 API Server 不识别请求

查看 API Server 是否具有 --enable-aggregator-routing=true 选项

ps -ef | grep apiserver | grep "aggregator-routing"

如果没有输出的话则需要修改 kube-apiserver.yaml 配置开启 Aggregator Routing

vim /etc/kubernetes/manifests/kube-apiserver.yaml

22 - --enable-aggregator-routing=true   #添加配置

#修改 manifests 配置后 API Server 会自动重启生效,pod重启比较慢

修改 Metrics Server 清单文件

wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.5.0/components.yaml

vim components.yaml
134  - --kubelet-preferred-address-types=InternalIP
137 - --kubelet-insecure-tls #添加作用:声明不安全证书
138 image: k8s/k8s:metrics-server.v0.5.0   #docker导入镜像使用本地,因为镜像下载较慢

kubectl apply -f components.yaml
#所有pod运行后查看
[root@k8s-master top]# kubectl top nodes
NAME         CPU(cores)   CPU%   MEMORY(bytes)#已使用   MEMORY%   
k8s-master   130m         6%     1647Mi                 43%       
k8s-node1    32m          1%     1039Mi                 27%       
k8s-node2    44m          2%     1136Mi                 29%

测试:负载 pod 的镜像构建

#基于 php-apache 镜像的定制 Docker 镜像
mkdir /usr/local/docker
cd /usr/local/docker

vim Dockerfile
FROM php:5-apache
ADD index.php /var/www/html/index.php
RUN chmod a+rx index.php


vim index.php   #循环100W次打印ok
<?php
$x = 0.0001;
for ($i = 0; $i <= 1000000; $i++) {
$x += sqrt($x);
}
echo "OK!";
?>

docker build -t k8s/php .
#验证
vim php.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
spec:
  selector:
    matchLabels:
      run: php-apache
  replicas: 1
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: hpa-example
        ports:
        - containerPort: 80
        resources:
          limits:
            cpu: 500m   #最多使用0.5
          requests:
            cpu: 200m   #请求超过0.2cpu开始扩容
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  ports:
  - port: 80
  selector:
    run: php-apache

创建一个HPA ,可以使用 kubectl autoscale 命令来创建:

kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10

[root@k8s-master hpa]# kubectl get hpa
NAME         REFERENCE               TARGETS                 MINPODS             MAXPODS              REPLICAS             AGE
php-apache   Deployment/php-apache   0%/50% (当前无负载为0)   1(最小扩容1)        10(最大扩容10)        1(当前是1)          39s(创建多久)
                                   
# 删除 hpa
kubectl delete horizontalpodautoscalers.autoscaling php-apache

HPA伸缩过程

1. 收集HPA控制下所有Pod最近的cpu使用情况(CPU utilization)

2. 对比在扩容条件里记录的cpu限额(CPUUtilization)

3. 调整实例数(必须要满足不超过最大/最小实例数)

4. 每隔15s做一次自动扩容的判断

5. 为了保持集群的稳定,每次扩容后冷却3分钟才能再次进行扩容,而缩容则要等5分钟后。