k8s 自动伸缩 pod(HPA)

By | 2021年3月15日

    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 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/

 

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注