k8s 自动伸缩 pod(HPA)

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

 

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

 

    1. metrics-server 安装

    1.1 下载 yaml 文件和 image

1
2
3
4
5
6
7
# 在 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 安装

1
2
3
4
5
6
7
# 修改 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的对应关系记录。

1
2
3
4
5
6
7
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 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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

1
kubectl apply -f hpa-cpu.yaml

 

    2.3 测试 HPA

1
2
3
4
5
6
7
8
# 开三个 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/

 

posted @   运维工作栈  阅读(4181)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗
点击右上角即可分享
微信分享提示