HPA + Helm

文章目录

  • [一、Helm 包管理](#一、Helm 包管理)
    • [1.1 Helm 概述](#1.1 Helm 概述)
      • [1.1.1 什么是 Helm](#1.1.1 什么是 Helm)
      • [1.1.2 未使用 Helm 的部署痛点](#1.1.2 未使用 Helm 的部署痛点)
      • [1.1.3 Helm 的核心价值](#1.1.3 Helm 的核心价值)
    • [1.2 Helm 的核心概念](#1.2 Helm 的核心概念)
      • [1.2.1 示例](#1.2.1 示例)
    • [1.3 Helm 2 与 Helm 3 区别](#1.3 Helm 2 与 Helm 3 区别)
      • [1.3.1 结论](#1.3.1 结论)
    • [1.4 Helm 安装与基础使用](#1.4 Helm 安装与基础使用)
      • [1.4.1 安装 Helm](#1.4.1 安装 Helm)
      • [1.4.2 管理仓库](#1.4.2 管理仓库)
      • [1.4.3 部署与管理 Chart](#1.4.3 部署与管理 Chart)
    • [1.5 自定义 Chart 模板](#1.5 自定义 Chart 模板)
      • [1.5.1 拉取 Chart 示例](#1.5.1 拉取 Chart 示例)
      • [1.5.2 Chart 核心组成](#1.5.2 Chart 核心组成)
      • [1.5.3 创建自定义 Chart](#1.5.3 创建自定义 Chart)
      • [1.5.4 修改配置文件](#1.5.4 修改配置文件)
        • [1.5.4.1 Chart.yaml](#1.5.4.1 Chart.yaml)
        • [1.5.4.2 values.yaml(关键配置)](#1.5.4.2 values.yaml(关键配置))
      • [1.5.5 打包与部署](#1.5.5 打包与部署)
      • [1.5.6 升级、回滚与动态参数](#1.5.6 升级、回滚与动态参数)
    • [1.6 部署 Ingress](#1.6 部署 Ingress)
      • [1.6.1 下载配置文件](#1.6.1 下载配置文件)
      • [1.6.2 应用配置](#1.6.2 应用配置)
      • [1.6.3 配置域名映射](#1.6.3 配置域名映射)
    • [1.7 Helm 常用命令总结](#1.7 Helm 常用命令总结)
      • [1.7.1 扩展命令速查表](#1.7.1 扩展命令速查表)
      • [1.7.2 核心总结](#1.7.2 核心总结)
  • [二、HPA 伸缩](#二、HPA 伸缩)
    • [2.1 HPA 前言](#2.1 HPA 前言)
      • [2.1.1 固定 Pod 副本数的问题](#2.1.1 固定 Pod 副本数的问题)
      • [2.1.2 HPA 的核心价值](#2.1.2 HPA 的核心价值)
    • [2.2 HPA 工作原理概述](#2.2 HPA 工作原理概述)
      • [2.2.1 控制周期](#2.2.1 控制周期)
      • [2.2.2 决策机制](#2.2.2 决策机制)
      • [2.2.3 核心依赖](#2.2.3 核心依赖)
    • [2.3 实战一:部署 metrics-server](#2.3 实战一:部署 metrics-server)
      • [2.3.1 metrics-server 作用](#2.3.1 metrics-server 作用)
      • [2.3.2 镜像准备(所有 Node)](#2.3.2 镜像准备(所有 Node))
      • [2.3.3 使用 Helm 安装 metrics-server](#2.3.3 使用 Helm 安装 metrics-server)
      • [2.3.4 修改配置文件(metrics-server.yaml)](#2.3.4 修改配置文件(metrics-server.yaml))
        • [2.3.4.1 关键说明](#2.3.4.1 关键说明)
      • [2.3.5 安装并验证](#2.3.5 安装并验证)
    • [2.4 实战二:部署 HPA 示例应用](#2.4 实战二:部署 HPA 示例应用)
      • [2.4.1 实验说明](#2.4.1 实验说明)
      • [2.4.2 加载镜像(所有 Node)](#2.4.2 加载镜像(所有 Node))
      • [2.4.3 创建 Deployment 与 Service(hpa-pod.yaml)](#2.4.3 创建 Deployment 与 Service(hpa-pod.yaml))
        • [2.4.3.1 关键说明](#2.4.3.1 关键说明)
      • [2.4.4 应用配置](#2.4.4 应用配置)
    • [2.5 实战三:创建 HPA 控制器](#2.5 实战三:创建 HPA 控制器)
      • [2.5.1 创建 HPA](#2.5.1 创建 HPA)
        • [2.5.1.1 参数说明](#2.5.1.1 参数说明)
      • [2.5.2 查看 HPA 状态](#2.5.2 查看 HPA 状态)
        • [2.5.2.1 初始状态](#2.5.2.1 初始状态)
    • [2.6 实战四:压力测试触发扩容(核心实验)](#2.6 实战四:压力测试触发扩容(核心实验))
      • [2.6.1 创建压测 Pod](#2.6.1 创建压测 Pod)
      • [2.6.2 观察 HPA 扩容过程](#2.6.2 观察 HPA 扩容过程)
        • [2.6.2.1 预期结果](#2.6.2.1 预期结果)
      • [2.6.3 加大压力(可选)](#2.6.3 加大压力(可选))
      • [2.6.4 验证 Pod 数量](#2.6.4 验证 Pod 数量)
    • [2.7 HPA 扩缩容行为分析](#2.7 HPA 扩缩容行为分析)
      • [2.7.1 扩容快、缩容慢的原因](#2.7.1 扩容快、缩容慢的原因)
    • [2.8 扩展知识:资源限制](#2.8 扩展知识:资源限制)
      • [2.8.1 Pod 级资源限制](#2.8.1 Pod 级资源限制)
        • [2.8.1.1 说明](#2.8.1.1 说明)
      • [2.8.2 Namespace 级资源配额(ResourceQuota)](#2.8.2 Namespace 级资源配额(ResourceQuota))
      • [2.8.3 默认资源限制(LimitRange)](#2.8.3 默认资源限制(LimitRange))
    • [2.9 实验总结](#2.9 实验总结)

一、Helm 包管理

1.1 Helm 概述

1.1.1 什么是 Helm

Helm 是 Kubernetes(K8s)官方推荐的包管理工具,被称为 Kubernetes 的 "YUM / APT",通过 Chart(软件包)形式定义、安装、升级和管理 Kubernetes 应用。

1.1.2 未使用 Helm 的部署痛点

  • 需手动创建 Deployment、Service、Ingress 等多个 YAML 文件;
  • 不同环境(dev、test、prod)配置管理困难;
  • 无法方便地进行版本管理与回滚。

1.1.3 Helm 的核心价值

将复杂部署抽象为可配置模板,让部署更自动化、标准化、版本化。

1.2 Helm 的核心概念

概念 说明
Chart Helm 的软件包,包含 Kubernetes 资源定义的 YAML 模板(类似 RPM/DEB 包)
Repository Chart 仓库,保存并索引多个 Chart,供用户下载与安装
Release 已安装在集群中的某个 Chart 实例,每次安装都会生成一个新的 release

1.2.1 示例

一个 MySQL Chart 可多次安装,分别作为 mysql-prod 和 mysql-dev 等不同 Release,互不干扰。

1.3 Helm 2 与 Helm 3 区别

Helm 2 Helm 3
C/S 架构:客户端(helm)+ 服务端(Tiller) 无 Tiller,只有客户端
Tiller 拥有集群级权限,安全隐患大 直接读取 kubeconfig,遵循用户权限
Release 存储在 Tiller 中 Release 存储在 Kubernetes Secrets 中

1.3.1 结论

Helm 3 更加安全、简洁,已完全取代 Helm 2。

1.4 Helm 安装与基础使用

1.4.1 安装 Helm

  1. 下载安装包:wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz
  2. 解压:tar -zxvf helm-v3.6.0-linux-amd64.tar.gz
  3. 移动二进制文件:mv linux-amd64/helm /usr/local/bin/helm
  4. 验证版本:helm version
  5. 命令补全:source <(helm completion bash)

1.4.2 管理仓库

  1. 添加常用仓库:
    • helm repo add bitnami https://charts.bitnami.com/bitnami
    • helm repo add stable http://mirror.azure.cn/kubernetes/charts
    • helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts
    • helm repo add incubator https://charts.helm.sh/incubator
  2. 更新仓库:helm repo update
  3. 列出仓库:helm repo list
  4. 搜索仓库:helm search repo bitnami
  5. 移除仓库:helm repo remove incubator

1.4.3 部署与管理 Chart

  1. 安装并命名 release:helm install my-redis bitnami/redis
  2. 自动命名安装:helm install bitnami/redis --generate-name
  3. 查看已安装 release:helm ls
  4. 查看状态:helm status my-redis
  5. 卸载:helm uninstall my-redis

1.5 自定义 Chart 模板

1.5.1 拉取 Chart 示例

  1. 创建目录并进入:mkdir /opt/helm && cd /opt/helm
  2. 拉取 Chart:helm pull stable/mysql
  3. 解压:tar xf mysql-1.6.9.tgz
  4. 查看目录结构:tree mysql

1.5.2 Chart 核心组成

  • Chart.yaml:元数据(名称、版本)
  • templates/:Kubernetes YAML 模板
  • values.yaml:模板中变量的默认值

1.5.3 创建自定义 Chart

  1. 创建 Chart:helm create nginx
  2. 查看目录结构:tree nginx
  3. 模板变量定义(Go Template 语法):image: "{``{ .Values.image.repository }}:{``{ .Values.image.tag }}"(变量来自 values.yaml)

1.5.4 修改配置文件

1.5.4.1 Chart.yaml
yaml 复制代码
apiVersion: v2
name: nginx
version: 0.1.0
appVersion: 1.16.0
1.5.4.2 values.yaml(关键配置)
yaml 复制代码
replicaCount: 1
image:
  repository: nginx
  tag: "latest"
service:
  type: ClusterIP
  port: 80
ingress:
  enabled: true
  hosts:
    host: www.kgc.com
    paths:
      path: /
      pathType: Prefix

1.5.5 打包与部署

  1. 检查配置正确性:helm lint nginx
  2. 打包:helm package nginx(生成 nginx-0.1.0.tgz)
  3. 测试部署:helm install nginx ./nginx --dry-run --debug
  4. 正式部署:helm install nginx ./nginx -n default

1.5.6 升级、回滚与动态参数

  1. 修改 values.yaml 后升级:helm upgrade nginx nginx
  2. 查看历史版本:helm history nginx
  3. 回滚:helm rollback nginx 1
  4. 动态覆盖变量:helm upgrade nginx nginx --set image.tag="1.15"

1.6 部署 Ingress

1.6.1 下载配置文件

  1. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yaml
  2. wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml

1.6.2 应用配置

  1. kubectl apply -f mandatory.yaml
  2. kubectl apply -f service-nodeport.yaml

1.6.3 配置域名映射

  1. 修改 /etc/hosts:192.168.10.21 node02 www.kgc.com
  2. 访问测试:curl http://www.kgc.com:30665

1.7 Helm 常用命令总结

操作 Helm 命令
添加仓库 helm repo add
安装应用 helm install
查看状态 helm status
升级版本 helm upgrade
回滚版本 helm rollback
删除应用 helm uninstall
打包 Chart helm package
推送仓库 helm push

1.7.1 扩展命令速查表

命令 说明
completion 命令补全
create 创建一个给定名称的 chart
dependency 管理 chart 的依赖关系
env 显示 Helm 环境信息
get 获取给定 release 的扩展信息
help 命令帮助
history 获取 release 历史
lint 对 chart 进行语法检查
list / ls 列出 releases
plugin 安装、列出、卸载 Helm 插件
pull 从 repo 中下载 chart 并(可选)解压到本地目录
repo 添加、列出、移除、更新、索引 Helm 的 repo
search 查询 charts 中的关键字
show 显示 chart 的信息
template 本地渲染模板
test 测试运行 release
verify 验证给定路径的 chart 是否已签名且有效
version 显示 Helm 的版本信息

1.7.2 核心总结

Helm 让 Kubernetes 的应用部署像使用包管理器一样简单,实现"一键安装、升级、回滚、复用",是 K8s 环境运维自动化的核心工具。

二、HPA 伸缩

2.1 HPA 前言

2.1.1 固定 Pod 副本数的问题

  • 高峰期:资源不足导致服务不可用
  • 低峰期:资源浪费

2.1.2 HPA 的核心价值

HPA(Horizontal Pod Autoscaler)基于资源使用率(如 CPU)的 Pod 水平自动伸缩机制,实现:

  • 提高系统弹性
  • 提升资源利用率
  • 降低人工干预成本

2.2 HPA 工作原理概述

2.2.1 控制周期

  • 由 kube-controller-manager 组件负责
  • 通过参数 horizontal-pod-autoscaler-sync-period 控制,默认每 30 秒检测一次 Pod 资源使用情况

2.2.2 决策机制

  1. 采集目标 Pod 的 CPU 使用率
  2. 计算当前平均使用率 / requests.cpu
  3. 与设定阈值(如 50%)比较
  4. 决定是否扩容或缩容

2.2.3 核心依赖

HPA 依赖 metrics-server,通过 Resource Metrics API 提供 CPU/内存等指标,部署 HPA 前需先部署 metrics-server。

2.3 实战一:部署 metrics-server

2.3.1 metrics-server 作用

Kubernetes 集群的资源使用聚合器,服务于 kubectl top、HPA、Scheduler(调度器)。

2.3.2 镜像准备(所有 Node)

  1. 进入目录:cd /opt
  2. 加载镜像:docker load -i metrics-server.tar

2.3.3 使用 Helm 安装 metrics-server

  1. 准备 Helm 仓库:
    • helm repo remove stable
    • helm repo add stable https://charts.helm.sh/stable(或国内镜像 helm repo add stable http://mirror.azure.cn/kubernetes/charts
    • helm repo update
  2. 下载 Chart:mkdir /opt/metrics && cd /opt/metrics && helm pull stable/metrics-server

2.3.4 修改配置文件(metrics-server.yaml)

yaml 复制代码
args:
  - --logtostderr
  - --kubelet-insecure-tls
  - --kubelet-preferred-address-types=InternalIP
image:
  repository: k8s.gcr.io/metrics-server-amd64
  tag: v0.3.2
2.3.4.1 关键说明
  • --kubelet-insecure-tls:解决证书问题
  • InternalIP:避免 DNS 或 ExternalIP 不可达

2.3.5 安装并验证

  1. 安装:helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yaml
  2. 查看 Pod 状态:kubectl get pods -n kube-system | grep metrics-server
  3. 验证数据采集:
    • kubectl top node
    • kubectl top pods --all-namespaces(能看到 CPU/内存数据即正常)

2.4 实战二:部署 HPA 示例应用

2.4.1 实验说明

使用 Google 官方 hpa-example 镜像(基于 PHP,内置 CPU 密集型计算,适合验证 HPA 扩缩容)。

2.4.2 加载镜像(所有 Node)

  1. 进入目录:cd /opt
  2. 加载镜像:docker load -i hpa-example.tar
  3. 验证镜像:docker images | grep hpa-example

2.4.3 创建 Deployment 与 Service(hpa-pod.yaml)

yaml 复制代码
apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-apache
  labels:
    run: php-apache
spec:
  replicas: 1
  selector:
    matchLabels:
      run: php-apache
  template:
    metadata:
      labels:
        run: php-apache
    spec:
      containers:
      - name: php-apache
        image: gcr.io/google_containers/hpa-example
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 80
        resources:
          requests:
            cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
  name: php-apache
spec:
  selector:
    run: php-apache
  ports:
  - port: 80
    targetPort: 80
2.4.3.1 关键说明

必须设置 resources.requests.cpu,HPA 的 CPU 百分比基于该值计算。

2.4.4 应用配置

  1. kubectl apply -f hpa-pod.yaml
  2. 查看 Pod:kubectl get pods

2.5 实战三:创建 HPA 控制器

2.5.1 创建 HPA

bash 复制代码
kubectl autoscale deployment php-apache \
--cpu-percent=50 \
--min=1 \
--max=10
2.5.1.1 参数说明
参数 含义
cpu-percent 目标 CPU 使用率(基于 requests)
min 最小 Pod 数
max 最大 Pod 数

2.5.2 查看 HPA 状态

  1. kubectl get hpa
  2. kubectl top pods
2.5.2.1 初始状态

CPU 使用率低,副本数保持 1。

2.6 实战四:压力测试触发扩容(核心实验)

2.6.1 创建压测 Pod

bash 复制代码
kubectl run -it load-generator --image=busybox /bin/sh
while true; do
wget -q -O- http://php-apache.default.svc.cluster.local
done

2.6.2 观察 HPA 扩容过程

kubectl get hpa -w

2.6.2.1 预期结果

CPU 使用率快速升高,副本数从 1→4→7→10,CPU 使用率随副本增加下降。

2.6.3 加大压力(可选)

kubectl run -it load-generator1 --image=busybox /bin/sh(重复压测命令)

2.6.4 验证 Pod 数量

kubectl get pods(php-apache Pod 数量达到最大值 10)

2.7 HPA 扩缩容行为分析

2.7.1 扩容快、缩容慢的原因

Kubernetes 保护机制:

  • 避免短暂流量下降导致频繁缩容
  • 防止网络抖动引发服务雪崩
  • 业务稳定性优先于资源回收速度

2.8 扩展知识:资源限制

2.8.1 Pod 级资源限制

yaml 复制代码
resources:
  requests:
    cpu: 250m
    memory: 250Mi
  limits:
    cpu: "2"
    memory: 1Gi
2.8.1.1 说明
  • requests:调度依据
  • limits:cgroup 强制限制,超出内存 limit 会触发 OOM Kill

2.8.2 Namespace 级资源配额(ResourceQuota)

yaml 复制代码
kind: ResourceQuota
spec:
  hard:
    pods: "20"
    requests.cpu: "2"
    limits.memory: 2Gi

2.8.3 默认资源限制(LimitRange)

yaml 复制代码
kind: LimitRange
spec:
  limits:
  - default:
      cpu: 500m
      memory: 512Mi
    defaultRequest:
      cpu: 100m
      memory: 256Mi
    type: Container

2.9 实验总结

通过实验完成:

  • metrics-server 的部署与验证
  • HPA 的创建与工作机制验证
  • 压力测试触发自动扩缩容
  • 对 Kubernetes 资源控制体系的深入理解
相关推荐
孤岛悬城10 小时前
64 K8s安全机制
kubernetes·云计算·k8s
徐先生 @_@|||12 小时前
大数据处理框架(Hadoop VS PySpark)
大数据·hadoop·分布式·spark·k8s·yarn
汪碧康2 天前
一文掌握k8s的升级更新策略
云原生·容器·kubernetes·k8s·亲和性·xkube
汪碧康2 天前
一文掌握k8s的健康检查探针
云原生·容器·kubernetes·k8s·xkube·k8s管理平台
汪碧康3 天前
一文掌握k8s容器的资源限制
docker·云原生·容器·golang·kubernetes·k8s·xkube
会飞的土拨鼠呀4 天前
kubectl 常用命令
k8s
岁岁种桃花儿6 天前
【K8s实战】从Ingress到Pod:微服务完整部署架构全解析
k8s
fanruitian8 天前
使用harbor搭建私有仓库
k8s·harbor