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