文章目录
- [一、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
- 下载安装包:
wget https://get.helm.sh/helm-v3.6.0-linux-amd64.tar.gz - 解压:
tar -zxvf helm-v3.6.0-linux-amd64.tar.gz - 移动二进制文件:
mv linux-amd64/helm /usr/local/bin/helm - 验证版本:
helm version - 命令补全:
source <(helm completion bash)
1.4.2 管理仓库
- 添加常用仓库:
helm repo add bitnami https://charts.bitnami.com/bitnamihelm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartshelm repo add incubator https://charts.helm.sh/incubator
- 更新仓库:
helm repo update - 列出仓库:
helm repo list - 搜索仓库:
helm search repo bitnami - 移除仓库:
helm repo remove incubator
1.4.3 部署与管理 Chart
- 安装并命名 release:
helm install my-redis bitnami/redis - 自动命名安装:
helm install bitnami/redis --generate-name - 查看已安装 release:
helm ls - 查看状态:
helm status my-redis - 卸载:
helm uninstall my-redis
1.5 自定义 Chart 模板
1.5.1 拉取 Chart 示例
- 创建目录并进入:
mkdir /opt/helm && cd /opt/helm - 拉取 Chart:
helm pull stable/mysql - 解压:
tar xf mysql-1.6.9.tgz - 查看目录结构:
tree mysql
1.5.2 Chart 核心组成
- Chart.yaml:元数据(名称、版本)
- templates/:Kubernetes YAML 模板
- values.yaml:模板中变量的默认值
1.5.3 创建自定义 Chart
- 创建 Chart:
helm create nginx - 查看目录结构:
tree nginx - 模板变量定义(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 打包与部署
- 检查配置正确性:
helm lint nginx - 打包:
helm package nginx(生成 nginx-0.1.0.tgz) - 测试部署:
helm install nginx ./nginx --dry-run --debug - 正式部署:
helm install nginx ./nginx -n default
1.5.6 升级、回滚与动态参数
- 修改 values.yaml 后升级:
helm upgrade nginx nginx - 查看历史版本:
helm history nginx - 回滚:
helm rollback nginx 1 - 动态覆盖变量:
helm upgrade nginx nginx --set image.tag="1.15"
1.6 部署 Ingress
1.6.1 下载配置文件
wget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/mandatory.yamlwget https://gitee.com/mirrors/ingress-nginx/raw/nginx-0.30.0/deploy/static/provider/baremetal/service-nodeport.yaml
1.6.2 应用配置
kubectl apply -f mandatory.yamlkubectl apply -f service-nodeport.yaml
1.6.3 配置域名映射
- 修改 /etc/hosts:
192.168.10.21 node02 www.kgc.com - 访问测试:
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 决策机制
- 采集目标 Pod 的 CPU 使用率
- 计算当前平均使用率 / requests.cpu
- 与设定阈值(如 50%)比较
- 决定是否扩容或缩容
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)
- 进入目录:
cd /opt - 加载镜像:
docker load -i metrics-server.tar
2.3.3 使用 Helm 安装 metrics-server
- 准备 Helm 仓库:
helm repo remove stablehelm repo add stable https://charts.helm.sh/stable(或国内镜像helm repo add stable http://mirror.azure.cn/kubernetes/charts)helm repo update
- 下载 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 安装并验证
- 安装:
helm install metrics-server stable/metrics-server -n kube-system -f metrics-server.yaml - 查看 Pod 状态:
kubectl get pods -n kube-system | grep metrics-server - 验证数据采集:
kubectl top nodekubectl top pods --all-namespaces(能看到 CPU/内存数据即正常)
2.4 实战二:部署 HPA 示例应用
2.4.1 实验说明
使用 Google 官方 hpa-example 镜像(基于 PHP,内置 CPU 密集型计算,适合验证 HPA 扩缩容)。
2.4.2 加载镜像(所有 Node)
- 进入目录:
cd /opt - 加载镜像:
docker load -i hpa-example.tar - 验证镜像:
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 应用配置
kubectl apply -f hpa-pod.yaml- 查看 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 状态
kubectl get hpakubectl 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 资源控制体系的深入理解