一、笔记基础信息栏
- 笔记标题:【云原生学习】Prometheus监控、GitLab与Jenkins部署实战
- 所属模块:云基础/容器技术/云运维/CI-CD
- 学习难度:中级(需具备Kubernetes基础、Helm使用经验)
- 核心标签:#云原生 #Prometheus #监控 #GitLab #Jenkins #CI/CD #Kubernetes #DevOps
- 学习目标:掌握Prometheus监控K8s集群的部署与配置、完成GitLab在K8s中的部署与基础实验、完成Jenkins在K8s中的部署与CI/CD实验练习。
- 前置知识:Kubernetes基础操作(Pod、Service、Deployment)、Helm包管理工具基础、Linux基础命令。
二、核心知识笔记模块
模块1:Prometheus监控Kubernetes集群部署
1. 核心定义与本质
-
标准定义:Prometheus是一个开源的系统监控和告警工具,采用Pull模型采集指标数据,通过PromQL查询语言进行分析,配合Grafana实现可视化展示。
-
大白话解读:Prometheus就像一个"数据采集员",定期去各个节点和Pod那里"敲门"问"你现在CPU用了多少?内存用了多少?",然后把数据存下来;Grafana则像一个"仪表盘",把这些数据用图表展示出来,让你一眼就能看出集群健康状态。
-
监控架构:在Kubernetes中,Prometheus通过以下组件采集指标:
- Node Exporter:采集每个节点的CPU、内存、磁盘、网络等主机指标
- kube-state-metrics:采集K8s对象状态(Pod、Deployment、Node等)
- cAdvisor:采集容器级资源指标(已集成于kubelet)
- Prometheus Server:存储指标并提供查询
2. 实操环境准备
- 硬件/软件配置:Kubernetes集群(v1.19+)、kubectl已配置、Helm 3已安装
3. 分步实操流程
步骤1:添加Helm仓库并创建命名空间
csharp
# 添加Prometheus社区Helm仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
helm repo update
# 创建监控命名空间
kubectl create namespace monitoring
步骤2:安装kube-prometheus-stack(推荐方式)
kube-prometheus-stack是一个一体化监控方案,包含Prometheus、Grafana、Alertmanager、Node Exporter、kube-state-metrics及默认仪表盘与告警规则。
ini
# 完整安装(含持久化存储配置)
helm install prometheus prometheus-community/kube-prometheus-stack \
--namespace monitoring \
--set prometheus.prometheusSpec.retention=15d \
--set prometheus.prometheusSpec.storageSpec.volumeClaimTemplate.spec.resources.requests.storage=50Gi
- 操作解析 :
retention=15d表示数据保留15天;storageSpec配置持久化存储,防止Pod重启后数据丢失。
步骤3:验证部署状态
csharp
# 查看所有Pod状态
kubectl get pods -n monitoring
# 查看服务
kubectl get svc -n monitoring
步骤4:访问Grafana并配置数据源
bash
# 端口转发访问Grafana
kubectl port-forward -n monitoring svc/prometheus-grafana 3000:80
- 浏览器访问
http://localhost:3000 - 默认账号:
admin/ 密码:prom-operator - 添加数据源:Prometheus,地址为
http://prometheus-operated.monitoring.svc.cluster.local:9090
步骤5:导入Node和Pod监控大盘
kube-prometheus-stack已自带默认仪表盘,也可手动导入社区优秀大盘:
| 大盘ID | 名称 | 说明 |
|---|---|---|
| 315 | Kubernetes Cluster | 集群整体监控 |
| 6417 | Kubernetes Pods | Pod级别监控(CPU、内存、网络、磁盘) |
| 1860 | Node Exporter Full | 节点详细监控 |
导入方法:Grafana界面 → 左侧+号 → Import → 输入Dashboard ID → 选择Prometheus数据源 → Import。
步骤6:手动部署Node Exporter(备选方式)
如果不需要完整stack,可单独部署Node Exporter:
ruby
# 使用官方DaemonSet部署
kubectl apply -f https://raw.githubusercontent.com/prometheus/node_exporter/master/deploy/daemonset.yaml
Node Exporter默认监听9100端口,会在每个节点运行一个Pod采集主机指标。
步骤7:手动部署kube-state-metrics(备选方式)
perl
# 使用官方清单部署
kubectl apply -f https://github.com/kubernetes-sigs/kube-state-metrics/releases/latest/download/components.yaml
部署后检查Pod状态:
perl
kubectl get pods -n kube-system | grep kube-state-metrics
4. 常用监控查询(PromQL)
节点CPU使用率:
ini
1 - avg by(instance)(rate(node_cpu_seconds_total{mode="idle"}[1m]))
节点内存使用率:
scss
1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)
Pod CPU使用率:
scss
sum by(pod, namespace)(rate(container_cpu_usage_seconds_total{container!=""}[1m]))
Pod内存使用量:
scss
sum by(pod, namespace)(container_memory_usage_bytes{container!=""})
Pod重启次数:
scss
increase(kube_pod_container_status_restarts_total[1h])
5. 实战踩坑与排错
-
报错场景1:Prometheus Targets页面显示部分Endpoint为DOWN状态。
- 错误原因:ServiceMonitor的标签选择器未匹配到对应Service,或RBAC权限不足。
- 解决方案:检查ServiceMonitor的
selector配置是否与Service的labels匹配;检查ClusterRole是否包含对应资源的get/list/watch权限。
-
报错场景2:Grafana大盘无数据,显示"No data"。
- 错误原因:数据源URL配置错误,或Prometheus未采集到相应指标。
- 解决方案:确认数据源URL为
http://prometheus-operated.monitoring.svc.cluster.local:9090;检查Prometheus Targets页面确认采集目标健康。
-
报错场景3:Prometheus Pod频繁重启(OOMKilled)。
- 错误原因:内存限制设置过低,或数据保留时间过长导致TSDB内存占用过大。
- 解决方案:增加
prometheus.prometheusSpec.resources.limits.memory;缩短retention时间。
-
报错场景4:指标采集间歇性无数据。
- 错误原因:kubelet的cAdvisor指标生成线程不足。
- 解决方案:优化kubelet参数(增加线程、缩小缓存),调整Prometheus采集策略(延长采集间隔、分片采集)。
模块2:GitLab部署与实验练习
1. 核心定义与本质
- 标准定义:GitLab是一个基于Web的DevOps生命周期工具,提供Git仓库管理、CI/CD流水线、容器镜像仓库等功能。
- 大白话解读:GitLab就像一个"代码托管+自动打包部署"的一站式平台------你把代码push上去,它自动帮你编译、测试、打包、部署,省去了手动操作的麻烦。
2. 实操环境准备
- 硬件要求:至少8vCPU和30GB RAM(非生产环境可减少资源占用)
- 前置依赖:Kubernetes集群、Helm 3、kubectl
3. 分步实操流程
步骤1:添加GitLab Helm仓库
csharp
# 添加GitLab官方Helm仓库
helm repo add gitlab https://charts.gitlab.io/
# 或使用国内镜像(极狐GitLab)
helm repo add gitlab-jh https://charts.gitlab.cn
helm repo update
步骤2:创建命名空间
arduino
kubectl create namespace gitlab
步骤3:准备values配置文件
GitLab Helm Chart需要外部PostgreSQL、Redis和对象存储。非生产环境可使用内置PostgreSQL(但官方不推荐用于生产)。
创建gitlab-values.yaml:
yaml
# gitlab-values.yaml - 最小化部署配置
global:
hosts:
domain: example.com # 替换为你的域名或使用nip.io
ingress:
configureCertmanager: false
shell:
port: 22
# 使用内置PostgreSQL(仅限测试环境)
postgresql:
install: true
postgresqlUsername: gitlab
postgresqlPassword: gitlab123
postgresqlDatabase: gitlabhq_production
# 使用内置Redis(仅限测试环境)
redis:
install: true
# 资源限制(根据集群资源调整)
gitlab:
webservice:
resources:
requests:
cpu: 1000m
memory: 2Gi
sidekiq:
resources:
requests:
cpu: 500m
memory: 1Gi
# 启用容器镜像仓库
registry:
enabled: true
步骤4:部署GitLab
bash
helm install gitlab gitlab/gitlab -n gitlab -f gitlab-values.yaml
步骤5:验证部署
csharp
# 查看Pod状态(需要等待所有Pod变为Running)
kubectl get pods -n gitlab -w
# 查看服务
kubectl get svc -n gitlab
步骤6:获取初始密码
ini
# 获取初始root密码
kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -o jsonpath="{.data.password}" | base64 -d
步骤7:访问GitLab
bash
# 端口转发访问GitLab Web界面
kubectl port-forward -n gitlab svc/gitlab-webservice-default 8080:8181
浏览器访问 http://localhost:8080,使用用户名root和上一步获取的密码登录。
4. 实验练习
实验1:创建项目并推送代码
- 登录GitLab后,点击"New project"创建一个空白项目,命名为
hello-world - 在本地克隆项目并推送代码:
bash
git clone http://localhost:8080/root/hello-world.git
cd hello-world
echo "# Hello World" > README.md
git add README.md
git commit -m "Initial commit"
git push origin main
实验2:启用GitLab Runner
bash
# 添加GitLab Runner Helm仓库
helm repo add gitlab-runner https://charts.gitlab.io
helm repo update
# 获取GitLab Runner注册令牌(在GitLab项目或群组设置中获取)
# 部署Runner
helm install gitlab-runner gitlab-runner/gitlab-runner \
-n gitlab \
--set gitlabUrl=http://gitlab-webservice-default.gitlab:8181 \
--set runnerRegistrationToken=<你的注册令牌> \
--set runners.privileged=true
实验3:配置CI/CD流水线
在项目根目录创建.gitlab-ci.yml:
bash
# .gitlab-ci.yml
stages:
- build
- test
build-job:
stage: build
script:
- echo "编译项目..."
- echo "Hello World" > output.txt
artifacts:
paths:
- output.txt
test-job:
stage: test
script:
- echo "测试项目..."
- cat output.txt
提交代码后,GitLab会自动触发流水线执行。
5. 实战踩坑与排错
-
报错场景1:GitLab Pod反复重启,出现503错误。
- 错误原因:节点内存不足,或工作负载未设置资源限制。
- 解决方案:增加节点内存资源;在values中为各组件设置
resources.limits和resources.requests。
-
报错场景2:Helm安装失败,提示"rendered manifests contain a resource that already exists"。
- 错误原因:同名的Secret或ConfigMap已存在。
- 解决方案:执行
helm uninstall gitlab -n gitlab清理后重新安装,或使用--force参数。
-
报错场景3:Container Registry无法启用。
- 错误原因:未配置对象存储(S3/MinIO等)。
- 解决方案:在values中配置
registry.storage使用对象存储,或暂时禁用Registry功能。
-
报错场景4:GitLab Runner无法注册到GitLab。
- 错误原因:注册令牌错误,或GitLab服务地址不可达。
- 解决方案:确认
gitlabUrl为正确的服务地址(集群内使用http://gitlab-webservice-default.gitlab:8181);确认Runner注册令牌正确。
模块3:Jenkins部署与实验练习
1. 核心定义与本质
- 标准定义:Jenkins是一个开源的自动化服务器,用于持续集成和持续交付(CI/CD),通过插件系统支持各种构建、测试和部署任务。
- 大白话解读:Jenkins就像一个"自动化流水线工人"------你告诉它"代码一更新就自动编译、测试、打包",它就会乖乖照做,省去手动操作的麻烦。跑在K8s上后,每次构建都会临时启动一个Agent Pod,用完自动销毁,资源利用率更高。
2. 实操环境准备
- 硬件要求:集群至少2核CPU和4GB可用内存
- 前置依赖:Kubernetes集群、Helm 3、kubectl
3. 分步实操流程
步骤1:创建命名空间
arduino
kubectl create namespace jenkins
步骤2:添加Jenkins Helm仓库
csharp
helm repo add jenkins https://charts.jenkins.io
helm repo update
步骤3准备values配置文件
创建jenkins-values.yaml:
yaml
# jenkins-values.yaml
controller:
image: jenkins/jenkins
tag: lts-jdk17
# 资源配置
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "2000m"
memory: "4Gi"
# 服务类型(Minikube使用NodePort,云环境使用LoadBalancer)
serviceType: NodePort
servicePort: 8080
# 安装推荐插件
installPlugins:
- kubernetes:latest
- workflow-aggregator:latest
- git:latest
- configuration-as-code:latest
- job-dsl:latest
- blueocean:latest
- credentials-binding:latest
- pipeline-stage-view:latest
# Jenkins配置即代码(JCasC)
JCasC:
defaultConfig: true
# 持久化存储(关键配置!)
persistence:
enabled: true
storageClass: "" # 留空使用默认StorageClass
size: "20Gi"
accessMode: ReadWriteOnce
# Agent配置
agent:
enabled: true
podTemplates:
default: |
- name: default
label: jenkins-agent
serviceAccount: jenkins
containers:
- name: jnlp
image: jenkins/inbound-agent:latest
resourceRequestCpu: "500m"
resourceRequestMemory: "512Mi"
resourceLimitCpu: "1000m"
resourceLimitMemory: "1Gi"
# ServiceAccount
serviceAccount:
create: true
name: jenkins
步骤4:部署Jenkins
bash
helm install jenkins jenkins/jenkins -n jenkins -f jenkins-values.yaml
步骤5:验证部署
csharp
# 查看Pod状态
kubectl get pods -n jenkins
# 查看服务
kubectl get svc -n jenkins
步骤6:获取初始密码
bash
# 获取Jenkins初始管理员密码
kubectl exec -n jenkins --stdin --tty jenkins-0 -- cat /var/jenkins_home/secrets/initialAdminPassword
或使用Helm获取:
ini
kubectl get secret -n jenkins jenkins -o jsonpath="{.data.jenkins-admin-password}" | base64 -d
步骤7:访问Jenkins
bash
# 端口转发访问
kubectl port-forward -n jenkins svc/jenkins 8080:8080
浏览器访问 http://localhost:8080,使用用户名admin和上一步获取的密码登录。
4. 实验练习
实验1:创建第一个Pipeline任务
- 登录Jenkins后,点击"New Item" → 输入名称
hello-pipeline→ 选择"Pipeline" → OK - 在Pipeline配置中,输入以下脚本:
typescript
pipeline {
agent any
stages {
stage('Build') {
steps {
echo '构建阶段...'
sh 'echo "Hello from Jenkins!" > output.txt'
}
}
stage('Test') {
steps {
echo '测试阶段...'
sh 'cat output.txt'
}
}
stage('Deploy') {
steps {
echo '部署阶段...'
sh 'echo "Deploying..."'
}
}
}
}
- 点击"Save" → "Build Now"执行流水线
实验2:配置Kubernetes Agent(动态构建节点)
Jenkins Kubernetes插件允许在K8s集群中动态创建Agent Pod执行构建任务。
- 进入"Manage Jenkins" → "Cloud" → "Add a new cloud" → 选择"Kubernetes"
- 配置Kubernetes地址(集群内使用
https://kubernetes.default.svc) - 配置Pod Templates指向之前values中定义的agent模板
- 在Pipeline中使用
agent { label 'jenkins-agent' }即可使用K8s Agent
实验3:GitLab + Jenkins CI/CD集成
- 在Jenkins中安装"GitLab Plugin"
- 在"Manage Jenkins" → "System"中配置GitLab连接(需GitLab Access Token)
- 创建Pipeline任务时选择"Git"作为源码管理,填入GitLab仓库地址
- 配置Webhook:在GitLab项目中设置Webhook指向
http://jenkins:8080/project/<任务名> - 提交代码后自动触发Jenkins构建
5. 实战踩坑与排错
-
报错场景1:Jenkins Pod重启后所有配置丢失。
- 错误原因:未配置持久化存储,或PVC未正确挂载到
/var/jenkins_home。 - 解决方案:在values中启用
persistence.enabled: true;确认PVC挂载路径正确。检查容器内Jenkins用户(UID 1000)对挂载目录有读写权限。
- 错误原因:未配置持久化存储,或PVC未正确挂载到
-
报错场景2:多副本部署时PVC冲突。
- 错误原因:PVC访问模式为ReadWriteOnce,但多个Pod尝试同时挂载。
- 解决方案:高可用场景使用ReadWriteMany模式的存储(如NFS、CephFS);单副本场景使用ReadWriteOnce即可。
-
报错场景3:Jenkins Agent Pod无法连接到Master。
- 错误原因:Agent Pod无法通过集群DNS解析Jenkins服务名,或网络策略限制。
- 解决方案:确认Agent使用正确的Jenkins服务地址(
http://jenkins.jenkins.svc.cluster.local:8080);检查NetworkPolicy是否放行Agent命名空间到Jenkins命名空间的流量。
-
报错场景4:构建任务卡死或超时。
- 错误原因:Agent Pod资源限制过低,或任务需要大量资源但未配置。
- 解决方案:在PodTemplate中为Agent配置合理的
resourceRequestCpu和resourceRequestMemory;使用resourceLimitCpu和resourceLimitMemory防止资源争抢。
三、学习复盘与拓展模块
1. 本节学习总结
-
核心收获:
- 掌握了用kube-prometheus-stack一键部署K8s监控体系,能通过Grafana大盘实时查看Node和Pod的CPU、内存使用率
- 理解了Prometheus监控架构(Node Exporter + kube-state-metrics + cAdvisor)及各组件职责
- 完成了GitLab在K8s中的Helm部署,能创建项目、配置Runner、运行CI流水线
- 完成了Jenkins在K8s中的Helm部署,能创建Pipeline任务、配置Kubernetes Agent
-
知识盲区:
- Prometheus告警规则(Alertmanager)的配置与调优还需深入学习
- GitLab与Jenkins的深度集成(如自动触发、状态回传)还需实践
- 生产环境下的高可用、备份恢复方案还需探索
-
学习心得:三个工具都是云原生DevOps的核心组件------Prometheus解决"看得见"的问题(集群状态监控),GitLab解决"管得住"的问题(代码与CI),Jenkins解决"自动化"的问题(构建部署)。三者结合起来,就构成了一个完整的云原生研发运维闭环。
2. 拓展学习资源
-
官方文档:
- Prometheus官方文档:prometheus.io/docs/
- Grafana官方大盘库:grafana.com/grafana/das...
- GitLab Helm Chart文档:docs.gitlab.com/charts/
- Jenkins Helm Chart文档:github.com/jenkinsci/h...
-
优质教程:
- 《Prometheus操作指南》(Kubernetes监控最佳实践)
- GitLab官方CI/CD教程:docs.gitlab.com/ee/ci/
- Jenkins Pipeline语法参考:www.jenkins.io/doc/book/pi...
3. 后续学习计划
-
下一节学习内容:Prometheus告警管理(Alertmanager配置)、GitLab与Jenkins的CI/CD流水线深度集成、ArgoCD持续部署
-
实战项目:
- 为Prometheus配置告警规则(CPU超阈值、Pod重启等),并接入钉钉/邮件通知
- 搭建完整的GitLab → Jenkins → K8s自动部署流水线
- 使用Helm管理应用发布,结合GitOps实现自动化部署