保姆级教程:用国内镜像源和预拉镜像搞定Kube-Prometheus部署(K8s 1.23实测)
国内开发者实战指南:高效部署Kube-Prometheus的镜像优化方案
对于国内Kubernetes开发者来说,部署Kube-Prometheus时最令人头疼的莫过于镜像拉取问题。那些反复出现的ImagePullBackOff错误不仅消耗时间,更打击学习热情。本文将分享一套经过实战验证的解决方案,帮助您绕过网络障碍,实现一次部署成功。
1. 环境准备与资源规划
在开始部署前,合理的环境准备能避免80%的后续问题。以下是经过优化的准备工作清单:
- Kubernetes集群版本匹配:Kube-Prometheus 0.10版本最佳适配K8s 1.20-1.23,版本错配是常见失败原因
- 工作目录规范:建议创建
/opt/k8s-monitoring/目录结构:mkdir -p /opt/k8s-monitoring/{manifests,images,backup} - 离线资源包获取:对于无法访问GitHub的情况,可提前下载以下资源:
- kube-prometheus-release-0.10.zip
- 关键镜像打包文件(约2.3GB)
重要提示:所有操作建议在具有sudo权限的非root用户下进行,避免权限问题导致部署异常。
2. 镜像加速实战方案
2.1 国内镜像源替换技巧
通过系统化的镜像地址替换,可显著提升拉取成功率。以下是经过验证的替换策略:
# 主镜像仓库替换 find manifests/ -type f -exec sed -i \ 's/quay.io/quay.mirrors.ustc.edu.cn/g' {} + # 特殊镜像处理 sed -i 's/k8s.gcr.io/lank8s.cn/g' \ manifests/kubeStateMetrics-deployment.yaml替换效果对比表:
| 原始地址 | 替换后地址 | 可用性测试 |
|---|---|---|
| quay.io/prometheus | quay.mirrors.ustc.edu.cn/prometheus | ✅ 稳定 |
| k8s.gcr.io/kube-state-metrics | lank8s.cn/kube-state-metrics | ✅ 稳定 |
| quay.io/grafana | quay.mirrors.ustc.edu.cn/grafana | ⚠️ 偶尔波动 |
2.2 预拉镜像的完整流程
预拉取镜像是解决网络问题的终极方案,具体操作如下:
提取镜像列表:
grep -hr "image:" manifests/ | awk '{print $2}' | sort -u > image-list.txt批量拉取镜像(Node节点执行):
while read img; do docker pull $img done < image-list.txt镜像导出备份:
docker save $(cat image-list.txt) -o kube-prometheus-images-0.10.tar镜像导入集群:
kind load image-archive kube-prometheus-images-0.10.tar # 适用于kind集群 # 或使用节点手动加载
经验分享:实际测试中,完整镜像包大小约2.3GB,传输到内网环境时建议使用
rsync替代scp,支持断点续传。
3. 关键配置文件深度调优
3.1 Prometheus Operator部署调整
prometheusOperator-deployment.yaml是核心配置文件,需要特别注意以下参数:
spec: containers: - args: - --kubelet-service=kube-system/kubelet - --prometheus-config-reloader=quay.mirrors.ustc.edu.cn/prometheus-operator/prometheus-config-reloader:v0.46.0 image: quay.mirrors.ustc.edu.cn/prometheus-operator/prometheus-operator:v0.46.0 resources: requests: cpu: 200m memory: 512Mi # 国内环境建议适当提高常见配置问题解决方案:
- 资源不足错误:增加requests/limits值
- 镜像校验失败:添加
imagePullPolicy: IfNotPresent - 权限问题:检查ServiceAccount绑定
3.2 网络策略与访问控制
默认NetworkPolicy会阻止外部访问,需要调整以下服务:
# 删除默认网络策略(开发环境适用) kubectl delete -f manifests/prometheus-networkPolicy.yaml kubectl delete -f manifests/grafana-networkPolicy.yaml # 生产环境建议保留策略,通过Ingress暴露 kubectl apply -f custom-ingress.yaml服务暴露方式对比:
| 方式 | 命令示例 | 适用场景 | 安全风险 |
|---|---|---|---|
| NodePort | kubectl patch svc grafana -p '{"spec":{"type":"NodePort"}}' | 测试环境 | 中 |
| Ingress | 需预先部署Ingress Controller | 生产环境 | 低 |
| Port-forward | kubectl port-forward svc/grafana 3000:3000 | 临时调试 | 最低 |
4. 部署验证与问题排查
4.1 健康检查完整流程
部署完成后,建议按照以下顺序验证:
基础资源检查:
kubectl get pods -n monitoring --watch kubectl get crd | grep monitoring服务端点测试:
# 测试Prometheus查询接口 kubectl exec -it prometheus-k8s-0 -n monitoring -- \ curl http://localhost:9090/api/v1/targets数据采集验证:
kubectl port-forward svc/prometheus-k8s 9090:9090 & # 浏览器访问localhost:9090验证数据采集
4.2 典型问题解决方案
以下是三个最常见错误及其解决方法:
问题1:ImagePullBackOff
# 查看详细错误信息 kubectl describe pod <pod-name> -n monitoring # 临时解决方案(使用已拉取的镜像) kubectl patch deployment prometheus-operator -p \ '{"spec":{"template":{"spec":{"containers":[{"name":"prometheus-operator","imagePullPolicy":"IfNotPresent"}]}}}}'问题2:CrashLoopBackOff
通常由资源不足或配置错误导致:
- 检查日志:
kubectl logs <pod-name> -n monitoring -p - 增加资源限制
- 验证配置文件语法
问题3:网络连接超时
# 测试集群内DNS解析 kubectl run -it --rm debug --image=busybox --restart=Never -- nslookup prometheus-operated.monitoring.svc # 检查网络策略 kubectl get networkpolicy -n monitoring5. 性能优化与长期维护
5.1 资源分配建议
基于国内典型集群的资源配置参考:
| 组件 | CPU Request | 内存 Request | 推荐节点规格 |
|---|---|---|---|
| Prometheus | 2 cores | 4GB | 独占节点 |
| Grafana | 500m | 1GB | 共享节点 |
| AlertManager | 1 core | 2GB | 共享节点 |
注:数据量大的环境建议为Prometheus配置SSD存储
5.2 数据持久化配置
避免监控数据丢失的配置示例:
# prometheus-prometheus.yaml片段 spec: retention: 15d # 国内环境建议适当缩短 storage: volumeClaimTemplate: spec: storageClassName: alicloud-disk-ssd resources: requests: storage: 100Gi5.3 版本升级策略
灰度升级流程:
# 先升级operator kubectl apply -f operator-new-version.yaml --server-side # 间隔观察期后再升级其他组件回滚方案:
kubectl rollout undo deployment/prometheus-operator -n monitoring kubectl delete -f manifests/ && kubectl apply -f manifests-old-version/
实际项目中,建议在升级前使用以下命令备份关键配置:
kubectl get prometheus,alertmanager,servicemonitor -n monitoring -o yaml > backup-$(date +%F).yaml