k8s 自动伸缩 pod(HPA)

    上一篇简单说了一下使用 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 安装好了

k8s 自动伸缩 pod(HPA)

 

    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
}

k8s 自动伸缩 pod(HPA)

 

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

k8s 自动伸缩 pod(HPA)

 

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

 

上一篇:kubernetes 自定义指标HPA


下一篇:Kubernetes高级进阶之pod的自动扩容/缩容