prometheus

定义

Prometheus 是开源时序监控系统,专门用来收集服务器、容器、中间件、业务接口的指标数据(CPU、内存、磁盘、QPS、错误率等),搭配 Grafana 做可视化面板、AlertManager 实现告警。

特点

时序存储、Pull 拉取模式、自带 PromQL 查询语言、原生适配 Kubernetes。

K8s 部署 Prometheus 实现 Node&Pod 监控并搭建节点、Pod 使用率大盘

主机信息:Ubuntu 24.04、集群节点 IP:192.168.9.100、K8s 集群正常运行、已装好 Helm3

配置 Helm 监控仓库(在 192.168.9.100 机器执行)

# 添加 prometheus 仓库
helm repo add prometheus-community https://prometheus-community.github.io/helm-charts
# 更新仓库
helm repo update

创建监控专属命名空间

kubectl create namespace monitoring

部署 kube-prometheus-stack 全套监控

自动部署:Prometheus、Grafana、node-exporter、kube-state-metrics,自动抓取 Node、Pod 指标

helm install prometheus prometheus-community/kube-prometheus-stack \
-n monitoring \
--set prometheus.prometheusSpec.serviceMonitorSelectorNilUsesHelmValues=false \
--set prometheus.prometheusSpec.podMonitorSelectorNilUsesHelmValues=false

等待所有监控 Pod 启动完成

kubectl get pods -n monitoring -w

所有 Pod 状态变成 Running,按下 Ctrl+C 退出监听。

把 Grafana 改成 NodePort,外网可访问

kubectl patch svc prometheus-grafana -n monitoring -p '{"spec":{"type":"NodePort","ports":[{"port":80,"targetPort":3000,"nodePort":30080}]}}'

访问地址:http://192.168.9.100:30080

获取 Grafana 初始账号密码

账号:admin

kubectl get secret prometheus-grafana -n monitoring -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

分别搭建 Node、Pod 两套使用率大盘

Grafana 已经自动绑定 Prometheus 数据源,不用手动配置数据源。

Node 节点使用率大盘

浏览器打开 http://192.168.9.100:30080 登录 Grafana

左侧菜单栏 +Import

填写面板 ID:1860 → Load

数据源选择 Prometheus,导入保存,命名:节点资源使用率大盘 功能:查看服务器 CPU、内存、磁盘、系统负载、网卡带宽。

Pod 容器使用率大盘

再次 +Import

面板 ID:8919 → Load

选择 Prometheus 数据源导入,命名:Pod 资源使用率大盘 功能:查看每个 Pod 的 CPU / 内存使用率、容器状态、OOM 崩溃、网络流量。

运维命令

# 查看监控所有服务
kubectl get svc -n monitoring

# 重启 Prometheus
kubectl rollout restart statefulset prometheus-kube-prometheus-prometheus -n monitoring

# 整体卸载监控
helm uninstall prometheus -n monitoring

gitlab

定义

GitLab 是私有化部署一站式 DevOps 平台,不止是私有代码仓库,完整覆盖:代码托管、MR 代码评审、CI/CD 自动构建部署、缺陷管理 (Issue)、制品仓库、容器镜像仓库、安全扫描、Wiki 文档,企业内网私有化部署用来存放私有项目代码

核心内部组件

  1. Nginx:入口反向代理,处理 80/443 网页访问
  2. GitLab Workhorse:专门处理 git push/pull、大文件上传下载,分流减轻应用压力
  3. GitLab Shell:处理 SSH 方式拉取推送代码(git@xxx.git),负责 SSH 鉴权
  4. Puma:Ruby 应用服务,处理网页、API、业务逻辑
  5. Gitaly:新版核心,接管所有 Git 仓库读写操作,仓库独立解耦,支持分布式仓库集群
  6. PostgreSQL:唯一数据库,存储用户、权限、项目、MR、工单、CI 配置等元数据
  7. Redis:缓存 + 消息队列,会话缓存、Sidekiq 任务队列
  8. Sidekiq:异步后台任务,发邮件、CI 任务调度、仓库定时清理、日志处理
  9. GitLab Runner:独立组件,专门执行 .gitlab-ci.yml 流水线构建、打包、部署任务,可以分布式部署多台 Runner 分担压力

gitlab部署

基于同一台节点 192.168.9.100、已有 Helm3 + 正常 K8s 集群;GitLab 占用资源较高,集群节点内存建议≥8G。

添加 GitLab 官方 Helm 仓库

helm repo add gitlab https://charts.gitlab.io/
helm repo update

新建命名空间

kubectl create ns gitlab

Helm 部署 GitLab

helm install gitlab gitlab/gitlab \
-n gitlab \
--set global.hosts.externalIP=192.168.9.100 \
--set global.hosts.domain=gitlab.local \
--set gitlab.gitlab-shell.authToken.create=true

等待 GitLab 所有组件启动

kubectl get pods -n gitlab -w

获取 GitLab 管理员初始密码

kubectl get secret gitlab-gitlab-initial-root-password -n gitlab -ojsonpath="{.data.password}" | base64 -d
echo ""

查看访问地址

kubectl get ingress -n gitlab

修改本机 hosts 文件,追加一行

192.168.9.100 gitlab.local

或者直接用 NodePort 方式暴露 GitLab web 服务访问:

kubectl patch svc gitlab-webservice-default -n gitlab -p '{"spec":{"type":"NodePort","ports":[{"port":8080,"targetPort":8080,"nodePort":30088}]}}'

直接访问:http://192.168.9.100:30088

首次登录配置

  • 浏览器打开地址,账号 root,粘贴上面获取的初始密码登录;
  • 登录成功后强制修改初始密码;
  • 新建项目,即可作为私有代码仓库使用。

运维命令

# 查看gitlab所有pod
kubectl get pods -n gitlab

# 卸载gitlab
helm uninstall gitlab -n gitlab

# 查看gitlab所有service
kubectl get svc -n gitlab

jenkins

定义

jenkins 是开源通用持续集成 / 持续部署(CI/CD)工具,Java 编写,跨平台。

核心作用

接收代码提交事件,自动完成编译、测试、打包、镜像构建、部署。

必备常用插件

  1. Git Plugin:拉取 GitLab/GitHub 代码
  2. GitLab Integration:GitLab 提交代码触发 Jenkins 构建(WebHook)
  3. Maven Integration:Java 项目编译打包
  4. Docker Plugin:构建、推送镜像
  5. Kubernetes Plugin:对接 K8s,动态创建 Agent Pod
  6. Credentials Binding:管理密码、密钥、镜像仓库账号、K8s kubeconfig
  7. Pipeline:流水线核心插件,支持 Jenkinsfile 流水线语法
  8. Blue Ocean:可视化流水线界面
  9. Prometheus metrics:把 Jenkins 指标暴露给 Prometheus 监控

jenkins部署

添加 Jenkins 官方 Helm 仓库

helm repo add jenkins https://charts.jenkins.io
helm repo update

创建独立命名空间

kubectl create ns jenkins

部署 Jenkins

helm install jenkins jenkins/jenkins -n jenkins

等待 Pod 启动

kubectl get pods -n jenkins -w

改为 NodePort 暴露访问端口

kubectl patch svc jenkins -n jenkins -p '{"spec":{"type":"NodePort","ports":[{"port":8080,"targetPort":8080,"nodePort":30099}]}}'
访问地址:http://192.168.9.100:30099

获取 Jenkins 初始管理员密码

kubectl exec -n jenkins jenkins-0 -- cat /var/jenkins_home/secrets/initialAdminPassword

初始化 Jenkins

  • 浏览器访问 http://192.168.9.100:30099,粘贴密码解锁;
  • 选择「安装推荐插件」,等待插件自动安装;
  • 创建管理员账号,完成初始化。

安装必备插件(对接 GitLab+K8s 流水线)

左侧【系统管理】→【插件管理】,安装下面插件:
Git Plugin
GitLab Integration
Kubernetes Plugin
Pipeline
安装完成重启 Jenkins。

运维命令

# 查看jenkins资源
kubectl get pods,svc -n jenkins

# 卸载jenkins
helm uninstall jenkins -n jenkins

# 进入jenkins容器
kubectl exec -it jenkins-0 -n jenkins -- bash

Jenkins 案例

GitLab 提交代码 → WebHook 触发 Jenkins 自由风格项目 → 拉代码 → Maven 打包 → 构建镜像推 Harbor → 部署 K8s。

环境

GitLab:10.0.15 Jenkins:10.0.16 Harbor:10.0.15:8082 K8s 集群

提前装好插件

系统管理 → 插件管理

Git、GitLab Plugin、Maven Integration plugin、Docker Plugin、Credentials Binding、Kubernetes CLI Plugin。

Jenkins 提前配置好全局工具

配置 Maven
系统管理 → 全局工具配置 → Maven → 新增 Maven3.8.8,勾选自动安装。
配置 Docker、kubectl
Jenkins 宿主机装好 docker、kubectl,并且 kubectl 连通集群、docker 能登录 Harbor。
凭据录入(系统→凭据→全局凭据)

账号密码:gitlab-auth(GitLab 账号密码)
账号密码:harbor-auth(Harbor 登录账号密码)

新建

新建任务 → 输入项目名称:springboot-demo-free → 选中「自由风格项目」,确定

源码管理配置(拉取 GitLab 代码)

源码管理选择 Git
仓库地址:http://10.0.15/gitlab/demo/spring-demo.git
凭据:选择 gitlab-auth
分支构建:*/main

构建触发器(GitLab 提交自动触发)

勾选:GitLab hook 触发此项目构建 后面 GitLab 配置 WebHook 对接这个地址即可。

构建环节

Maven 打包

构建步骤 1 → 调用顶层 Maven 目标 Maven 版本选你配置好的 Maven

构建 Docker 镜像 + 推送到 Harbor

新增构建步骤 → 执行 shell

# 定义变量
HARBOR_ADDR="10.0.15:8082/dev"
APP_NAME="spring-demo"
BUILD_TAG=${BUILD_NUMBER}

# 登录harbor,凭证注入
docker login ${HARBOR_ADDR} -u $HARBOR_USER -p $HARBOR_PWD

# 构建镜像
docker build -t ${HARBOR_ADDR}/${APP_NAME}:${BUILD_TAG} .

# 推送镜像
docker push ${HARBOR_ADDR}/${APP_NAME}:${BUILD_TAG}

# 退出登录
docker logout ${HARBOR_ADDR}

 替换 K8s yaml 的镜像版本并部署

新增构建步骤 → 执行 shell

TAG=${BUILD_NUMBER}
# 替换yaml中的VERSION占位符
sed -i "s#VERSION#${TAG}#g" k8s/deploy.yaml
# 部署到k8s prod命名空间
kubectl apply -f k8s/deploy.yaml -n prod
# 等待滚动更新完成
kubectl rollout status deployment/spring-demo -n prod

构建后操作(构建成功 / 失败输出提示)

构建后操作 → 添加后置动作 → 执行 shell

if [ ${BUILD_STATUS} = "SUCCESS" ];then
  echo "===部署成功 版本${BUILD_NUMBER}==="
else
  echo "===构建部署失败==="
fi

注意

项目代码里必备两个文件

Dockerfile 放在项目根目录

FROM openjdk:17-jdk-slim
WORKDIR /app
COPY target/*.jar app.jar
ENTRYPOINT ["java","-jar","app.jar"]

k8s/deploy.yaml

apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-demo
  namespace: prod
spec:
  replicas: 2
  selector:
    matchLabels:
      app: spring-demo
  template:
    metadata:
      labels:
        app: spring-demo
    spec:
      containers:
      - name: spring-demo
        image: 10.0.15:8082/dev/spring-demo:VERSION
        ports:
        - containerPort: 8080
---
apiVersion: v1
kind: Service
metadata:
  name: spring-demo-svc
  namespace: prod
spec:
  selector:
    app: spring-demo
  ports:
  - port: 80
    targetPort: 8080

GitLab 配置 WebHook 自动触发构建手动测试流程

GitLab 项目 → 设置 → 集成
URL 填写格式:
http://Jenkins地址:8080/project/项目名
示例:http://10.0.16:8080/project/springboot-demo-free
触发事件:勾选「推送事件」
保存并测试,返回 200 代表连通成功。

手动测试流程

Jenkins 页面点击「立即构建」

查看构建日志:依次执行 mvn 打包→构建镜像→推送 harbor→部署 k8s

kubectl get pods -n prod 查看 Pod 滚动更新。

    更多推荐