10 KiB
10 KiB
Helm 部署场景 - 镜像拉取方案分析
环境: Helm v4.0.0 日期: 2025-12-24 18:20
🤔 kubectl wrapper 对 Helm 部署是否有用?
答案:❌ 不太有用
原因分析:
# kubectl wrapper 工作原理
kubectl apply -f deployment.yaml
↓
wrapper 拦截命令
↓
执行原始 kubectl apply
↓
检查是否有 ImagePullBackOff
↓
自动修复
# Helm 工作原理
helm install myapp ./chart
↓
Helm 生成 K8s manifests
↓
Helm 直接调用 Kubernetes API(不经过 kubectl)
↓
创建资源
↓
kubectl wrapper 无法拦截 ❌
结论:kubectl wrapper 无法拦截 helm install/upgrade 命令,因为 Helm 直接使用 Kubernetes API,不调用 kubectl 命令。
✅ Helm 部署的推荐方案
基于你主要使用 Helm 的场景,推荐配置:
🎯 推荐配置:Layer 1 + Layer 3
Layer 1: Registry Mirror(已激活)✅
↓ 90% Docker Hub 镜像自动缓存
↓
Layer 3: 后台监控(推荐安装)
↓ 每 30 秒检查所有 Pod
↓ 自动修复 ImagePullBackOff
↓
Helm 部署成功 ✅
为什么这个组合最适合 Helm?
-
Layer 1 (Registry Mirror) - 已激活
- ✅ 自动缓存所有 Docker Hub 镜像
- ✅ 对 Helm 部署完全透明
- ✅ 无需任何代码或配置修改
- ✅ 覆盖 90% 镜像拉取场景
-
Layer 3 (后台监控) - 推荐安装
- ✅ 监控所有 Pod 状态(无论如何部署)
- ✅ 不依赖命令拦截
- ✅ 自动修复 GCR、Quay 等非 Docker Hub 镜像
- ✅ 持续巡检,无需人工干预
-
Layer 2 (kubectl wrapper) - ❌ 不推荐
- ❌ 无法拦截 helm 命令
- ❌ 只在直接使用 kubectl 时有用
- ❌ 对 Helm 部署场景无效
📊 场景对比
场景 1: Helm 部署 Docker Hub 镜像
# 部署 NGINX Ingress Controller
helm install ingress-nginx ingress-nginx/ingress-nginx
镜像: registry.k8s.io/ingress-nginx/controller:v1.9.4
工作流程:
Helm 创建 Deployment
↓
K8s 拉取镜像: registry.k8s.io/ingress-nginx/controller:v1.9.4
↓
Layer 1 (Registry Mirror) 拦截
↓
转发到: harbor.omniverseai.net:8080/...
↓
• 有缓存 → 直接返回 ✅
• 无缓存 → 可能失败(非 Docker Hub)⚠️
结果:
- ✅ Docker Hub 镜像:成功
- ⚠️ 其他仓库(GCR, Quay):可能失败
场景 2: Helm 部署 GCR 镜像
# 部署 Prometheus
helm install prometheus prometheus-community/prometheus
镜像: quay.io/prometheus/prometheus:v2.48.0
工作流程(无后台监控):
Helm 创建 Deployment
↓
K8s 拉取镜像: quay.io/prometheus/prometheus:v2.48.0
↓
Layer 1 无法处理(非 Docker Hub)
↓
直接拉取失败 ❌
↓
Pod 状态: ImagePullBackOff
↓
需要手动修复 ⚠️
工作流程(有后台监控):
Helm 创建 Deployment
↓
K8s 拉取镜像: quay.io/prometheus/prometheus:v2.48.0
↓
Layer 1 无法处理(非 Docker Hub)
↓
直接拉取失败
↓
Pod 状态: ImagePullBackOff
↓
Layer 3 (后台监控) 30秒内检测到
↓
自动调用 cache-image.sh
↓
从 EU Harbor 拉取 → 推送到本地 Harbor
↓
更新 Deployment
↓
Pod 重启并成功拉取 ✅
结果:
- ✅ 自动修复,无需人工干预
🚀 推荐部署步骤
Step 1: 保持当前配置(已完成)✅
# Layer 1 (Registry Mirror) 已激活
docker info | grep -A 3 "Registry Mirrors"
Step 2: 安装后台监控(推荐)
cd /Users/brunogao/work/codes/tools/macos/k8s
# 创建 LaunchAgent
cat > ~/Library/LaunchAgents/com.k8s.image-watcher.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.k8s.image-watcher</string>
<key>ProgramArguments</key>
<array>
<string>/Users/brunogao/work/codes/tools/macos/k8s/watch-and-fix-images.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/image-watch.log</string>
<key>StandardErrorPath</key>
<string>/tmp/image-watch-error.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin</string>
</dict>
</dict>
</plist>
EOF
# 启动服务
launchctl load ~/Library/LaunchAgents/com.k8s.image-watcher.plist
# 验证
tail -f /tmp/image-watch.log
Step 3: 测试 Helm 部署
# 部署一个测试应用
helm install test-nginx bitnami/nginx
# 后台监控会自动检测并修复任何 ImagePull 错误
# 查看日志
tail -f /tmp/image-watch.log
🎯 实际使用示例
示例 1: 部署 Prometheus Stack
# 1. 添加 Helm repo
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 2. 部署(可能包含多个非 Docker Hub 镜像)
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--create-namespace
# 3. 后台监控会自动处理所有 ImagePull 错误
# 查看修复进度
tail -f /tmp/image-watch.log
# 4. 验证部署
kubectl get pods -n monitoring
预期行为:
- Layer 1 处理所有 Docker Hub 镜像(立即成功)
- Layer 3 处理所有非 Docker Hub 镜像(30-60秒内自动修复)
- 最终所有 Pod 正常运行
示例 2: 部署 ArgoCD
# 部署 ArgoCD
helm install argocd argo/argo-cd \
--namespace argocd \
--create-namespace
# 监控自动修复过程
watch kubectl get pods -n argocd
# 查看后台监控日志
tail -f /tmp/image-watch.log
示例 3: 批量部署
# 部署多个 Helm Charts
helm install grafana grafana/grafana -n monitoring
helm install loki grafana/loki -n logging
helm install tempo grafana/tempo -n tracing
# 后台监控会并行处理所有 ImagePull 错误
# 无需任何人工干预
🔧 手动修复方案(后备)
如果不想安装后台监控,也可以在 Helm 部署失败时手动修复:
方法 1: 修复整个 Deployment
# 1. 查找失败的 Deployment
kubectl get deployments --all-namespaces | grep -v "AVAILABLE.*[1-9]"
# 2. 手动修复
./cache-image.sh --update-deployment <namespace>/<deployment>
# 示例
./cache-image.sh --update-deployment monitoring/prometheus-server
方法 2: 预缓存镜像
# 1. 查看 Helm Chart 使用的镜像
helm show values prometheus-community/prometheus | grep -i "repository\|tag"
# 2. 提前缓存
./cache-image.sh \
quay.io/prometheus/prometheus:v2.48.0 \
quay.io/prometheus/alertmanager:v0.26.0 \
quay.io/prometheus/node-exporter:v1.7.0
# 3. 然后部署 Helm
helm install prometheus prometheus-community/prometheus
方法 3: 使用 helm hooks
在 Helm Chart 中添加 pre-install hook:
# templates/pre-install-cache-images.yaml
apiVersion: batch/v1
kind: Job
metadata:
name: pre-install-cache-images
annotations:
"helm.sh/hook": pre-install
"helm.sh/hook-weight": "-5"
spec:
template:
spec:
containers:
- name: cache-images
image: alpine/k8s:1.28.0
command:
- /bin/sh
- -c
- |
/Users/brunogao/work/codes/tools/macos/k8s/cache-image.sh \
{{ .Values.image.repository }}:{{ .Values.image.tag }}
restartPolicy: Never
📊 方案对比总结
| 方案 | Helm 兼容性 | 自动化程度 | 实时性 | 推荐度 |
|---|---|---|---|---|
| Layer 1 (Registry Mirror) | ✅ 完全兼容 | ⭐⭐⭐⭐⭐ | 即时 | ⭐⭐⭐⭐⭐ |
| Layer 3 (后台监控) | ✅ 完全兼容 | ⭐⭐⭐⭐⭐ | 30秒 | ⭐⭐⭐⭐⭐ |
| Layer 2 (kubectl wrapper) | ❌ 不兼容 | N/A | N/A | ⭐ |
| 手动修复 | ✅ 兼容 | ⭐ | 手动 | ⭐⭐ |
| 预缓存镜像 | ✅ 兼容 | ⭐⭐ | 提前 | ⭐⭐⭐ |
✅ 最终推荐
针对你的 Helm 部署场景:
推荐配置
✅ Layer 1: Registry Mirror(已激活)
- 处理 90% Docker Hub 镜像
- 完全透明,无需任何修改
✅ Layer 3: 后台监控(强烈推荐安装)
- 处理所有非 Docker Hub 镜像
- 自动、持续、无人值守
- 30 秒响应时间
❌ Layer 2: kubectl wrapper(不推荐)
- 对 Helm 部署无效
- 可以跳过
立即安装后台监控
cd /Users/brunogao/work/codes/tools/macos/k8s
./deploy-auto-fix.sh
# 选择选项 3(只安装后台监控)
或者手动安装:
# 创建 LaunchAgent
cat > ~/Library/LaunchAgents/com.k8s.image-watcher.plist << 'EOF'
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.k8s.image-watcher</string>
<key>ProgramArguments</key>
<array>
<string>/Users/brunogao/work/codes/tools/macos/k8s/watch-and-fix-images.sh</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>StandardOutPath</key>
<string>/tmp/image-watch.log</string>
<key>StandardErrorPath</key>
<string>/tmp/image-watch-error.log</string>
<key>EnvironmentVariables</key>
<dict>
<key>PATH</key>
<string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/homebrew/bin</string>
</dict>
</dict>
</plist>
EOF
# 启动
launchctl load ~/Library/LaunchAgents/com.k8s.image-watcher.plist
# 验证
tail -f /tmp/image-watch.log
使用效果
# 你只需要正常使用 Helm
helm install myapp ./chart
# 系统会自动:
# 1. Layer 1 处理 Docker Hub 镜像(即时)
# 2. Layer 3 处理其他镜像(30秒内)
# 3. 你无需做任何事情 ✅
文档生成: 2025-12-24 18:20 针对场景: Helm v4.0.0 部署 推荐配置: Layer 1 + Layer 3