【云原生学习】Prometheus监控、GitLab与Jenkins部署实战

一、笔记基础信息栏

  • 笔记标题:【云原生学习】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:创建项目并推送代码

  1. 登录GitLab后,点击"New project"创建一个空白项目,命名为hello-world
  2. 在本地克隆项目并推送代码:
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.limitsresources.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任务

  1. 登录Jenkins后,点击"New Item" → 输入名称 hello-pipeline → 选择"Pipeline" → OK
  2. 在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..."'
            }
        }
    }
}
  1. 点击"Save" → "Build Now"执行流水线

实验2:配置Kubernetes Agent(动态构建节点)

Jenkins Kubernetes插件允许在K8s集群中动态创建Agent Pod执行构建任务。

  1. 进入"Manage Jenkins" → "Cloud" → "Add a new cloud" → 选择"Kubernetes"
  2. 配置Kubernetes地址(集群内使用https://kubernetes.default.svc
  3. 配置Pod Templates指向之前values中定义的agent模板
  4. 在Pipeline中使用agent { label 'jenkins-agent' }即可使用K8s Agent

实验3:GitLab + Jenkins CI/CD集成

  1. 在Jenkins中安装"GitLab Plugin"
  2. 在"Manage Jenkins" → "System"中配置GitLab连接(需GitLab Access Token)
  3. 创建Pipeline任务时选择"Git"作为源码管理,填入GitLab仓库地址
  4. 配置Webhook:在GitLab项目中设置Webhook指向http://jenkins:8080/project/<任务名>
  5. 提交代码后自动触发Jenkins构建

5. 实战踩坑与排错

  • 报错场景1:Jenkins Pod重启后所有配置丢失。

    • 错误原因:未配置持久化存储,或PVC未正确挂载到/var/jenkins_home
    • 解决方案:在values中启用persistence.enabled: true;确认PVC挂载路径正确。检查容器内Jenkins用户(UID 1000)对挂载目录有读写权限。
  • 报错场景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配置合理的resourceRequestCpuresourceRequestMemory;使用resourceLimitCpuresourceLimitMemory防止资源争抢。

三、学习复盘与拓展模块

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. 拓展学习资源

3. 后续学习计划

  • 下一节学习内容:Prometheus告警管理(Alertmanager配置)、GitLab与Jenkins的CI/CD流水线深度集成、ArgoCD持续部署

  • 实战项目

    1. 为Prometheus配置告警规则(CPU超阈值、Pod重启等),并接入钉钉/邮件通知
    2. 搭建完整的GitLab → Jenkins → K8s自动部署流水线
    3. 使用Helm管理应用发布,结合GitOps实现自动化部署
相关推荐
菜鸟界的菜鸟1 小时前
k8s-Service详解(七)
云原生·容器·kubernetes
wazmlp0018873691 小时前
k8s pod 管理
docker·容器·kubernetes
Dear~yxy1 小时前
k8s的pod
云原生·容器·kubernetes
Dear~yxy1 小时前
k8s中的控制器管理
云原生·容器·kubernetes
众人皆醒我独醉2 小时前
自动扩缩容:KPA/HPA/KEDA 三条路径
面试·kubernetes·llm
qizhideyu3 小时前
kubernetes中的pod管理
云原生·容器·kubernetes
lxw20230271163 小时前
k8s的pod管理
linux·容器·kubernetes
Yiiz.3 小时前
Kubernetes Pod 与控制器知识点
云原生·容器·kubernetes
高磊20054 小时前
Kubernetes Pod 管理实战详解
linux·容器·kubernetes