上一篇简单说了一下使用 kubeadm 安装 k8s。今天说一下 k8s 的一个神奇的功能:HPA (Horizontal Pod Autoscaler)。

HPA 依赖 metrics-server 获取 pod 的指标。所以我们要先安装 metrics-server 插件。

1. metrics-server 安装

1.1 下载 yaml 文件和 image

# 在 k8s master 节点执行
mkdir metrics-server
cd metrics-server
wget https://github.com/kubernetes-sigs/metrics-server/releases/download/v0.3.7/components.yaml docker pull ninejy/metrics-server:v0.3.7
docker tag ninejy/metrics-server:v0.3.7 k8s.gcr.io/metrics-server/metrics-server:v0.3.7

1.2 安装

# 修改 components.yaml 文件,在 args 下面添加以下两行内容,不校验证书,不然会报 x509 错误
- --kubelet-preferred-address-types=InternalIP,Hostname,InternalDNS,ExternalDNS,ExternalIP
- --kubelet-insecure-tls kubectl apply -f components.yaml
kubectl get pod -n kube-system
# 列出的 pod 中有 metrics-server-xxxxxxx,并且是 Running状态,就说明 metrics-server 安装好了

1.3 问题

  此时执行命令 `kubectl top nodes` 应该不会有结果。查看metrics-server pod 的日志,会有找不到主机 k8s-master01,k8s-node01的错误。这是因为主机名、IP的映射关系是我们在 hosts 文件里写的。需要在 coredns 的配置中加上这两个主机名、IP的对应关系记录。

kubectl edit configmap coredns -n kube-system
# 添加以下内容,然后 按键盘 Esc 输入 :wq 保存退出
hosts {
192.168.0.3 k8s-master01
192.168.0.6 k8s-node01
fallthrough
}

之后再执行 `kubectl top nodes` 就应该会有类似下图内容了

这样 metrics-server 就算安装好了。

2. 测试 HPA

2.1 deploymet/service/hpa yaml 文件

# cat hpa-cpu.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-hpa-cpu
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
spec:
containers:
- name: myapp
image: ninejy/hpacpu:latest
ports:
- containerPort: 8080
resources:
limits:
cpu: 50m
memory: 10Mi
requests:
cpu: 50m
memory: 10Mi
---
apiVersion: v1
kind: Service
metadata:
name: myapp
namespace: default
spec:
type: ClusterIP
selector:
app: myapp
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: autoscaling/v1
kind: HorizontalPodAutoscaler
metadata:
name: deployment-hpa-cpu
namespace: default
spec:
maxReplicas: 5
minReplicas: 1
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: deployment-hpa-cpu
targetCPUUtilizationPercentage: 80

这里我们限制每个 pod 最多使用一核 cpu 的 50/1000,当 pod 使用 cpu 的百分比大于最大限制的 80% 就会触发 pod 扩容,最多扩展到 5 个 pod.

2.2 创建 deploymet/service/hpa

kubectl apply -f hpa-cpu.yaml

2.3 测试 HPA

# 开三个 k8s-master01 窗口,分别执行下面三条命令

watch kubectl get pods

watch kubectl top pods

ip=$(kubectl get svc | grep myapp | awk '{print $3}')
for i in `seq 1 100000`; do curl $ip?a=$i; done

切换窗口查看,过一会就会有 pod 数量增加,说明 HPA 生效了。停掉 curl 的那条命令,过一会,pod 数量又会恢复到 1 个了。

以上就是 k8s HPA 的基本使用。HPA 也可以使用内存和其他自定义的指标,也可以组合使用。根据这些指标的值和设定的阈值进行 pod 的数量的增减。

更多内容可以参考 k8s 官网:

https://kubernetes.io/zh/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/

k8s 自动伸缩 pod(HPA)的更多相关文章

  1. Kubernetes Pod水平自动伸缩(HPA)

    HPA简介 HAP,全称 Horizontal Pod Autoscaler, 可以基于 CPU 利用率自动扩缩 ReplicationController.Deployment 和 ReplicaS ...

  2. k8s Pod的自动水平伸缩(HPA)

    我们知道,当访问量或资源需求过高时,使用:kubectl scale命令可以实现对pod的快速伸缩功能 但是我们平时工作中我们并不能提前预知访问量有多少,资源需求多少. 这就很麻烦了,总不能为了需求总 ...

  3. 基于Kubernetes的hpa实现pod实例数量的自动伸缩

    Pod 是在 Kubernetes 体系中,承载用户业务负载的一种资源.Pod 们运行的好坏,是用户们最为关心的事情.在业务流量高峰时,手动快速扩展 Pod 的实例数量,算是玩转 Kubernetes ...

  4. kubernetes之Pod水平自动伸缩(HPA)

    https://k8smeetup.github.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/ Horizon ...

  5. K8S(17)二进制的1.15版本部署hpa自动伸缩

    K8S(17)二进制部署的K8S(1.15)部署hpa功能 目录 K8S(17)二进制部署的K8S(1.15)部署hpa功能 零.参考文件: 一.生成metrics-proxy证书 二.修改apise ...

  6. Horizontal Pod Autoscaler(Pod水平自动伸缩)

    Horizontal Pod Autoscaler 根据观察到的CPU利用率(或在支持自定义指标的情况下,根据其他一些应用程序提供的指标)自动伸缩 replication controller, de ...

  7. kubernetes云平台管理实战:HPA水平自动伸缩(十一)

    一.自动伸缩 1.启动 [root@k8s-master ~]# kubectl autoscale deployment nginx-deployment --max=8 --min=2 --cpu ...

  8. 基于Prometheus,Alermanager实现Kubernetes自动伸缩

    到目前为止Kubernetes对基于cpu使用率的水平pod自动伸缩支持比较良好,但根据自定义metrics的HPA支持并不完善,并且使用起来也不方便. 下面介绍一个基于Prometheus和Aler ...

  9. k8s弹性伸缩概念以及测试用例

    k8s弹性伸缩概念以及测试用例 本文原文出处:https://juejin.im/post/5c82367ff265da2d85330d4f 弹性伸缩式k8s中的一大亮点功能,当负载大的时候,你可以对 ...

随机推荐

  1. localStorage 用法

    localStorage使用总结   一.什么是localStorage.sessionStorage 在HTML5中,新加入了一个localStorage特性,这个特性主要是用来作为本地存储来使用的 ...

  2. D. New Year Santa Network 解析(思維、DFS、組合、樹狀DP)

    Codeforce 500 D. New Year Santa Network 解析(思維.DFS.組合.樹狀DP) 今天我們來看看CF500D 題目連結 題目 給你一棵有邊權的樹,求現在隨機取\(3 ...

  3. python pickle 模块的使用详解

    用于序列化的两个模块 json:用于字符串和Python数据类型间进行转换 pickle: 用于python特有的类型和python的数据类型间进行转换 json提供四个功能:dumps,dump,l ...

  4. Java的Arrays.sort()方法到底用的什么排序算法

    暂时网上看过很多JDK8中Arrays.sort的底层原理,有些说是插入排序,有些说是归并排序,也有说大于域值用计数排序法,否则就使用插入排序...其实不全对.让我们分析个究竟: 1 // Use Q ...

  5. linux查找大文件及详细问题

    查询大文件du -h --max-depth=1 查询指定目录下面的文件大小du -h --max-depth=1 /path 使用find命令查找大于200M文件 find / -type f -s ...

  6. IDEA(社区版)连接MySQL

    版本说明: MySQL 版本:8.0.20 IDEA   版本:2020.1.1(Community Edition) IDEA中安装插件: 首先在IDEA中下载DB Browser插件,安装好插件重 ...

  7. 百度地图省市php获取

    $api = 'http://api.map.baidu.com/shangquan/forward/?qt=sub_area_list&ext=1&level=3&areac ...

  8. leetcode115:search -insert-position

    题目描述 给出一个有序的数组和一个目标值,如果数组中存在该目标值,则返回该目标值的下标.如果数组中不存在该目标值,则返回如果将该目标值插入这个数组应该插入的位置的下标 假设数组中没有重复项. 下面给出 ...

  9. .NET必知的EventCounters性能指标监视器

    在.NET我们对于性能指标监控,其实常见的有两个方法,一个是CLI工具dotnet-counters而另一个是代码级别的EventListener. 使用dotnet-counters dotnet- ...

  10. 谈谈synchronized

    为什么要用synchronized关键字: synchronized是java的一种内部锁,是一种排他锁,通常也被称为悲观锁,它能够保障原子性,可见性,有序性. 当多个线程去调用同一个方法的时候,如果 ...