K8s 部署 Prometheus 监控、GitLab、Jenkins(十八)
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 文档,企业内网私有化部署用来存放私有项目代码
核心内部组件
- Nginx:入口反向代理,处理 80/443 网页访问
- GitLab Workhorse:专门处理 git push/pull、大文件上传下载,分流减轻应用压力
- GitLab Shell:处理 SSH 方式拉取推送代码(git@xxx.git),负责 SSH 鉴权
- Puma:Ruby 应用服务,处理网页、API、业务逻辑
- Gitaly:新版核心,接管所有 Git 仓库读写操作,仓库独立解耦,支持分布式仓库集群
- PostgreSQL:唯一数据库,存储用户、权限、项目、MR、工单、CI 配置等元数据
- Redis:缓存 + 消息队列,会话缓存、Sidekiq 任务队列
- Sidekiq:异步后台任务,发邮件、CI 任务调度、仓库定时清理、日志处理
- 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 编写,跨平台。
核心作用
接收代码提交事件,自动完成编译、测试、打包、镜像构建、部署。
必备常用插件
- Git Plugin:拉取 GitLab/GitHub 代码
- GitLab Integration:GitLab 提交代码触发 Jenkins 构建(WebHook)
- Maven Integration:Java 项目编译打包
- Docker Plugin:构建、推送镜像
- Kubernetes Plugin:对接 K8s,动态创建 Agent Pod
- Credentials Binding:管理密码、密钥、镜像仓库账号、K8s kubeconfig
- Pipeline:流水线核心插件,支持 Jenkinsfile 流水线语法
- Blue Ocean:可视化流水线界面
- 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 滚动更新。
更多推荐
所有评论(0)