Repository Reading Site
Helm 与 Harbor — 包管理与私有镜像仓库
一个应用可能需要 Deployment + Service + ConfigMap + Secret + Ingress + HPA + PDB... 十几个 YAML 文件。手动 `kubectl apply` 管理这些文件: Helm 把一组相关的 K8s 资源打包为 **Chart**,一条命令安装/升级/回滚。 | 概念 | 说明 | 类比 | |-
Helm 与 Harbor — 包管理与私有镜像仓库
Helm — K8s 的"包管理器"
为什么需要 Helm?
一个应用可能需要 Deployment + Service + ConfigMap + Secret + Ingress + HPA + PDB... 十几个 YAML 文件。手动 kubectl apply 管理这些文件:
- 版本管理困难
- 环境差异(dev/prod)靠手动改
- 升级/回滚要一个个文件处理
Helm 把一组相关的 K8s 资源打包为 Chart,一条命令安装/升级/回滚。
核心概念
| 概念 | 说明 | 类比 |
|---|---|---|
| Chart | 一组模板化的 K8s YAML | npm 包 / apt 包 |
| Release | Chart 的一次安装实例 | 运行中的应用 |
| Repository | Chart 仓库 | npm registry |
| values.yaml | 配置参数 | 环境变量 / .env |
我们用 Helm 装了什么
helm repo list # 查看已添加的仓库
helm list -A # 查看所有 Release
| Release | Chart | Namespace | 说明 |
|---|---|---|---|
| nfs-provisioner | nfs-subdir-external-provisioner | kube-system | NFS 动态存储 |
| monitoring | kube-prometheus-stack | monitoring | Prometheus + Grafana |
| loki | loki-stack | monitoring | 日志收集 |
| ingress-nginx | ingress-nginx | ingress-nginx | Ingress 控制器 |
| harbor | harbor | harbor | 镜像仓库 |
| gitea | gitea | gitea | 自托管 Git |
Helm 常用操作
# 搜索 Chart
helm search repo prometheus
# 查看 Chart 的可配置项
helm show values prometheus-community/kube-prometheus-stack | head -50
# 安装(自定义配置)
helm install monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.service.type=NodePort
# 升级(修改配置)
helm upgrade monitoring prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set grafana.service.nodePort=30300
# 回滚
helm rollback monitoring 1 # 回到 revision 1
# 卸载
helm uninstall monitoring -n monitoring
# 模板渲染(不安装,只看生成的 YAML)
helm template monitoring prometheus-community/kube-prometheus-stack \
--set grafana.service.type=NodePort > rendered.yaml
面试题
Q: Helm 3 和 Helm 2 的区别?
- Helm 2 有一个集群内组件 Tiller(用 ClusterAdmin 权限运行),是安全隐患
- Helm 3 去掉了 Tiller,直接用 kubeconfig 的权限操作
- Release 信息存在 Secret 中(不再需要 Tiller)
Q: Helm 和 Kustomize 怎么选?
- Helm:适合复杂应用(多组件、需要条件逻辑、需要打包分发)
- Kustomize:适合简单的环境差异(base + overlays)
- 可以结合使用:Helm 渲染 → Kustomize 做环境覆盖
Harbor — 企业级镜像仓库
为什么需要私有镜像仓库?
- 安全 — 不把镜像放在公网,避免供应链攻击
- 速度 — 从内网拉取镜像比 Docker Hub 快得多
- 合规 — 镜像扫描(Trivy)、签名验证、准入策略
- 可控 — 不依赖外部服务的可用性
Harbor 架构
用户/CI → Harbor Nginx (入口)
│
┌────┴────┐
│ Harbor │ ← Web UI + API
│ Core │
└────┬────┘
│
┌─────────┼──────────┐
│ │ │
Registry Database Redis Trivy
(存镜像) (元数据) (缓存/队列) (漏洞扫描)
安装
helm install harbor harbor/harbor \
--namespace harbor \
--set expose.type=nodePort \
--set expose.nodePort.ports.http.nodePort=30180 \
--set expose.tls.enabled=false \
--set externalURL=http://107.148.176.193:30180 \
--set persistence.persistentVolumeClaim.registry.storageClass=nfs-dynamic \
--set persistence.persistentVolumeClaim.registry.size=20Gi \
--set harborAdminPassword=Harbor12345
访问信息
| 项目 | 值 |
|---|---|
| URL | http://107.148.176.193:30180 |
| 用户名 | admin |
| 密码 | Harbor12345 |
使用 Harbor 推送/拉取镜像
# 1. 配置 containerd 信任 HTTP 仓库(每个节点)
# 在 /etc/containerd/certs.d/107.148.176.193:30180/hosts.toml 中配置
# 2. 登录
docker login 107.148.176.193:30180
# 3. 给镜像打 tag
docker tag nginx:1.25 107.148.176.193:30180/library/nginx:1.25
# 4. 推送
docker push 107.148.176.193:30180/library/nginx:1.25
# 5. 在 K8s 中使用
# image: 107.148.176.193:30180/library/nginx:1.25
Harbor 的核心功能
| 功能 | 说明 |
|---|---|
| 镜像管理 | 推送、拉取、删除、Tag 管理 |
| 漏洞扫描 | Trivy 自动扫描镜像中的 CVE |
| 复制策略 | 从 Docker Hub 同步镜像到 Harbor |
| RBAC | 项目级别的用户权限管理 |
| 审计日志 | 谁推了什么镜像、谁拉了什么 |
| Garbage Collection | 清理未引用的 layer,释放存储 |
面试题
Q: 生产环境的镜像管理流程是什么?
开发 push 代码 → CI 构建镜像 → 推送到 Harbor (dev 项目)
│
Trivy 自动扫描
│
漏洞检查通过?
│
← 推广到 prod 项目
│
ArgoCD 检测到新镜像
│
自动/手动部署到 prod