当前位置: 首页 > news >正文

[CI/CD] 排障实录:内网环境下 Jenkins + ArgoCD 流水线搭建

说明:本文基于个人学习测试环境编写,部分配置(如镜像仓库使用 HTTP、NodePort 暴露服务等)仅为简化演示,仅供参考,生产环境请遵循安全规范。

1. 基本信息

  • 任务类型:部署 / 故障排查
  • 涉及系统/服务
    • K3s 集群(v1.33.4+k3s1,1 Master + 2 Worker)
    • Jenkins(Helm 部署于jenkins命名空间,版本 2.541.3-jdk21)
    • ArgoCD(v3.3.3,部署于argocd命名空间)
    • 私有 Docker Registry(registry:2,NodePort 31830,HTTP 协议)
    • Gitee(代码托管,simple-webapp-sourcek8s-manifests两仓库)
    • FRP(内网穿透,用于 Gitee Webhook 触发内网 Jenkins)
    • Trivy(漏洞扫描器,版本 0.59.1)
    • containerd(K3s 内置运行时)
  • 最终状态部分成功。流水线核心阶段(代码拉取、镜像构建、推送、配置仓库更新)已验证可行;安全扫描阶段因 Trivy 漏洞数据库推送中而待最终验证;ArgoCD 同步状态已就绪但尚未进行端到端部署测试。

2. 问题描述 / 部署目标

2.1 目标

构建一套基于 GitOps 的 CI/CD 流水线,用于示例应用simple-webapp(Go 后端 + 静态前端)的自动构建与部署。完整流程如下:

  1. 开发者推送代码到 Gitee 源码仓库simple-webapp-source
  2. Gitee Webhook 通过 FRP 内网穿透触发 Jenkins Pipeline。
  3. Jenkins 动态创建 Kubernetes Pod(含 Docker-in-Docker 容器),在 Pod 内执行:
    • 拉取源码
    • 构建后端与前端 Docker 镜像
    • 推送镜像到集群内私有 Registry(registry.registry.svc.cluster.local:5000
    • 克隆配置仓库k8s-manifests,更新其中的镜像标签
    • 推送配置仓库变更
  4. ArgoCD 监测到配置仓库变更后,自动将最新版本部署到 K3s 集群的simple-webapp命名空间。

2.2 初始问题现象

  • 用户已完成基础组件部署(ArgoCD、Registry、Jenkins),但在首次触发 Jenkins 构建时,Agent Pod 始终处于ImagePullBackOffErrImagePull状态,报错http: server gave HTTP response to HTTPS clientno such host
  • 手动测试发现 Jenkins 主 Pod 可解析 Registry 内部域名,但动态 Agent Pod 无法解析。
  • 即使手动推送镜像至私有仓库,Pod 拉取仍失败,且后续构建阶段因缺少 Docker 命令、外网不通等连环失败。

3. 系统/网络架构图

内网 192.168.34.0/24

公网

K3s Master DebianVM203

Webhook POST

内网穿透

转发到

创建 Agent Pod

拉取基础镜像/推送产物

更新配置仓库

每3分钟拉取配置

同步部署

Gitee 代码仓库
/simple-webapp-source
/k8s-manifests

FRP Server
公网 IP

Jenkins Pod
jenkins/jenkins
NodePort 30080

ArgoCD Server
argocd/argocd-server

Registry Pod
registry/registry
ClusterIP 10.43.138.13:5000
NodePort 31830

CoreDNS
10.43.0.10

FRP Client

Worker 192.168.34.201

Worker 192.168.34.202

K3s-API

http://www.jsqmd.com/news/642687/

相关文章:

  • RVC语音转换效果展示:AI歌手专辑制作全流程实录分享
  • 5分钟搞定PaddleOCR的Docker部署(附常见报错解决方案)
  • 微信直连Claude Code,多账号也能用
  • Ostrakon-VL 扫描终端 Python 入门实战:3 步实现图像数据自动化处理
  • 终极指南:如何使用Python实现百度网盘直链解析与高速下载
  • ROS手眼标定实战:JAKA机械臂+ArUco标定板全流程避坑指南
  • 微信聊天数据永久保存的终极解决方案:如何用WeChatMsg高效导出并深度分析
  • Linux 的 pathchk 命令
  • **发散创新:基于日志指标的Go语言微服务可观测性实践**在现代云原生架构中,**日志 + 指标+
  • (一)Arcpy 批量提取多面要素质心并构建空间索引
  • AI对话系统可操纵购物选择
  • 计算机组成原理知识学习助手:基于GTE-Base-ZH的问答系统
  • 别只盯着DevTools了!用OpenHarmony的HiSysEvent给你的Flutter应用做一次“线上体检”
  • bootstrap怎么实现响应式的底部固定导航栏
  • Qwen3.5-35B-A3B-AWQ-4bit部署案例:高校实验报告图像数据自动解析平台
  • 太理Web历年真题解析—期末备考指南(珍藏版)
  • Linux 的 pinky 命令
  • Qwen-Image-Lightning部署教程:Mac M系列芯片Metal后端适配进展
  • 告别重复造轮子:Codex写脚本
  • 深入解析 Pandas 的 merge_asof 方法
  • 阿里小云KWS模型在安防对讲系统中的应用
  • Claude Desktop 一体化创作站:配置 11 个 MCP 服务器
  • # 发散创新:基于Python与高德地图API的智能位置服务开发实战在现代移动互联网应用
  • 语音芯片是如何让机器“开口说话”的?一文读懂语音芯片工作原理及选型指南
  • gtest断言全指南:除了EXPECT_EQ还有这些黑科技(含自定义断言模板)
  • 基于单片机的智能太阳能热水器设计(有完整资料)
  • 2026年好用的飞剪轧钢刀片/马鞍山热剪轧钢刀片公司对比推荐 - 行业平台推荐
  • Win10 + MATLAB R2021a 环境下的 TrueTime2.0 工具箱安装与网络控制系统仿真实践
  • 别再乱起名了!给Altium Designer新手的设计师:原理图库与PCB库命名规范实战指南
  • 2026年好用的马鞍山圆盘剪刀片高口碑品牌推荐 - 行业平台推荐