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

Golang 应用的 CI/CD 与 K8S 自动化部署全流程指南

一、CI/CD 流程设计与工具选择

1. 技术栈选择
  • 版本控制:Git(推荐 GitHub/GitLab)
  • CI 工具:Jenkins/GitLab CI/GitHub Actions(本文以 GitHub Actions 为例)
  • 容器化:Docker + Docker Compose
  • 制品库:Harbor/Docker Hub(本文以 Harbor 为例)
  • K8S 管理:kubectl + Helm
  • 监控告警:Prometheus + Grafana + Alertmanager
2. CI/CD 流程架构
代码提交 -> GitHub Actions 触发 -> 单元测试 -> 代码检查 -> 构建 Docker 镜像 -> 
推送至 Harbor -> 部署到沙盒环境 -> 自动化测试 -> 部署到开发环境 -> K8S 滚动更新

二、Golang 应用容器化与 CI 流程实现

1. 编写 Dockerfile

在项目根目录创建 Dockerfile

# 构建阶段
FROM golang:1.20 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o main .# 运行阶段
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]
2. 配置 GitHub Actions

在项目根目录创建 .github/workflows 目录,并添加 ci-cd.yml

name: Golang CI/CD Pipelineon:push:branches:- main- developpull_request:branches:- mainjobs:test:runs-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Gouses: actions/setup-go@v5with:go-version: '1.20'- name: Install dependenciesrun: go mod download- name: Run unit testsrun: go test -v ./...- name: Code lintrun: |curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.55.2$(go env GOPATH)/bin/golangci-lint runbuild-and-push:needs: testruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Docker Buildxuses: docker/setup-buildx-action@v3- name: Login to Harboruses: docker/login-action@v3with:registry: your-harbor-domain.comusername: ${{ secrets.HARBOR_USERNAME }}password: ${{ secrets.HARBOR_PASSWORD }}- name: Build and push Docker imageuses: docker/build-push-action@v5with:context: .push: truetags: |your-harbor-domain.com/your-project/your-app:${{ github.sha }}your-harbor-domain.com/your-project/your-app:latestlabels: |org.opencontainers.image.source=${{ github.repository }}org.opencontainers.image.revision=${{ github.sha }}
3. 配置 GitHub 仓库密钥

在 GitHub 仓库的 Settings > Secrets 中添加以下密钥:

  • HARBOR_USERNAME:Harbor 用户名
  • HARBOR_PASSWORD:Harbor 密码

三、K8S 部署与自动化流程

1. 准备 K8S 部署文件

创建 deployments/ 目录,包含以下文件:

# deployments/deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: your-appnamespace: your-namespace
spec:replicas: 3selector:matchLabels:app: your-apptemplate:metadata:labels:app: your-appspec:containers:- name: your-appimage: your-harbor-domain.com/your-project/your-app:latestports:- containerPort: 8080resources:requests:cpu: 100mmemory: 128Milimits:cpu: 200mmemory: 256Mienv:- name: ENVvalue: "development"
# deployments/service.yaml
apiVersion: v1
kind: Service
metadata:name: your-appnamespace: your-namespace
spec:selector:app: your-appports:- protocol: TCPport: 80targetPort: 8080type: LoadBalancer
2. 配置 K8S 认证

在 GitHub Actions 中添加 K8S 认证步骤:

# ci-cd.yml 中添加 deploy 作业
deploy:needs: build-and-pushruns-on: ubuntu-lateststeps:- name: Checkout codeuses: actions/checkout@v4- name: Set up Kubeconfiguses: azure/k8s-set-context@v3with:method: kubeconfigkubeconfig: ${{ secrets.KUBE_CONFIG }}- name: Deploy to sandboxif: github.ref == 'refs/heads/develop'run: |kubectl apply -f deployments/ -n sandboxkubectl rollout status deployment/your-app -n sandbox- name: Deploy to developmentif: github.ref == 'refs/heads/main'run: |kubectl apply -f deployments/ -n developmentkubectl rollout status deployment/your-app -n development
3. 添加 Helm 支持(可选)

创建 charts/ 目录并初始化 Helm 模板:

helm create charts/your-app

更新 values.yaml,并修改 CI/CD 流程使用 Helm 部署:

# ci-cd.yml 中 deploy 作业更新
- name: Deploy with Helmuses: koslib/helm-action@v2with:helm_version: '3.12.0'command: upgradechart: charts/your-apprelease_name: your-appnamespace: ${{ env.NAMESPACE }}values: |image:repository: your-harbor-domain.com/your-project/your-apptag: ${{ github.sha }}flags: --install --wait

四、沙盒与开发环境部署策略

1. 环境隔离设计
  • 命名空间隔离:使用 K8S 命名空间(sandboxdevelopment)隔离环境
  • 配置管理:通过 ConfigMap 和 Secret 管理环境变量和敏感信息
  • 网络策略:限制不同环境间的网络访问
2. 部署流程
  1. 沙盒环境(develop 分支触发)

    • 自动部署最新代码
    • 运行集成测试
    • 代码质量分析(SonarQube)
  2. 开发环境(main 分支触发)

    • 需手动审批(可配置 GitHub Actions 工作流)
    • 灰度发布(先部署 1 个实例)
    • 健康检查通过后滚动更新全部实例

五、K8S 自动化管理最佳实践

1. 资源优化配置
  • 使用 Horizontal Pod Autoscaler (HPA) 自动扩缩容
  • 配置 PodDisruptionBudget 确保高可用性
  • 使用 NodeSelector/Taints/Tolerations 控制 Pod 调度
# HPA 配置示例
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:name: your-app-hpa
spec:scaleTargetRef:apiVersion: apps/v1kind: Deploymentname: your-appminReplicas: 2maxReplicas: 10metrics:- type: Resourceresource:name: cputarget:type: UtilizationaverageUtilization: 70- type: Resourceresource:name: memorytarget:type: UtilizationaverageUtilization: 80
2. 监控与告警
  • 部署 Prometheus 和 Grafana 监控集群和应用
  • 配置 Alertmanager 发送告警
  • 使用 kube-state-metrics 收集 K8S 资源指标
3. 安全增强
  • 使用 NetworkPolicy 限制 Pod 间通信
  • 配置 PodSecurityPolicy 限制容器权限
  • 定期扫描容器镜像安全漏洞(Trivy/Snyk)

六、执行与验证步骤

  1. 环境准备

    • 搭建 K8S 集群(可使用 minikube 或云厂商服务)
    • 部署 Harbor 镜像仓库
    • 配置 GitHub 仓库与 Secrets
  2. 测试 CI/CD 流程

    • 提交代码到 develop 分支,触发沙盒环境部署
    • 验证沙盒环境应用可用性
    • 合并代码到 main 分支,触发开发环境部署
  3. 验证 K8S 管理

    • 使用 kubectl get pods -n development 查看应用状态
    • 模拟流量增长,验证 HPA 是否自动扩容
    • 查看 Grafana 监控面板,确认指标正常

七、优化与扩展建议

  1. 多环境部署:添加 staging 和 production 环境配置
  2. 蓝绿部署:使用 Helm 和 Ingress 实现零停机部署
  3. 自动化测试:添加端到端测试(如 Selenium)
  4. 成本优化:使用 Cluster Autoscaler 自动调整节点数量

通过这套方案,您可以实现 Golang 应用从代码提交到生产环境的全自动化流程,提高开发效率和系统稳定性。

相关文章:

Golang 应用的 CI/CD 与 K8S 自动化部署全流程指南

一、CI/CD 流程设计与工具选择 1. 技术栈选择 版本控制:Git(推荐 GitHub/GitLab)CI 工具:Jenkins/GitLab CI/GitHub Actions(本文以 GitHub Actions 为例)容器化:Docker Docker Compose制品库…...

【前端基础】8、CSS的选择器

一、什么是选择器? 根据一定的规则选出符合条件的HTML元素,从而为他们添加各种特定的样式。 二、选择器分类 通用选择器元素选择器类选择器id选择器属性选择器后代选择器兄弟选择器选择器组伪类 三、通用选择器(*) 作用&…...

Gitee Team:关键领域行业DevSecOps落地的项目管理引擎

在全球数字化转型浪潮下,关键领域行业的软件研发正面临前所未有的挑战与机遇。国产化进程的加速推进与国防装备的智能化转型,对软件研发效能和质量提出了更高要求。在这样的背景下,Gitee Team作为国内领先的研发协作平台,正在为关…...

【Redis】键值对数据库实现

目录 1、背景2、五种基本数据类型对应底层实现3、redis数据结构 1、背景 redis是一个(key-value)键值对数据库,其中value可以是五大基本数据类型:string、list、hash、set、zset,这五大基本数据类型对应着不同的底层结…...

什么是 NoSQL 数据库?它与关系型数据库 (RDBMS) 的主要区别是什么?

我们来详细分析一下 NoSQL 数据库与关系型数据库 (RDBMS) 的主要区别。 什么是 NoSQL 数据库? NoSQL (通常指 “Not Only SQL” 而不仅仅是 “No SQL”) 是一类数据库管理系统的总称。它们的设计目标是解决传统关系型数据库 (RDBMS) 在某些场景下的局限性&#xf…...

网址为 http://xxx:xxxx/的网页可能暂时无法连接,或者它已永久性地移动到了新网址

这是由于浏览器默认的非安全端口所导致的,所谓非安全端口,就是浏览器出于安全问题,会禁止一些网络浏览向外的端口。 避免使用6000,6666这样的端口 6000-7000有很多都不行,所以尽量避免使用这个区间 还有在云服务器中&#xff0c…...

《智能网联汽车 自动驾驶功能场地试验方法及要求》 GB/T 41798-2022——解读

目录 1. 适用范围与核心目标 2. 试验核心要求 2.1 试验场地与环境 2.2 试验设备与数据采集 2.3 试验车辆要求 3. 试验过程与通过条件 4. 关键试验场景与方法 4.1 交通信号识别及响应 4.2 基础设施与障碍物识别 4.3 行人及非机动车场景 4.4 紧急避险与风险策略 5. 特…...

鸿蒙跨平台开发教程之Uniapp布局基础

前两天的文章内容对uniapp开发鸿蒙应用做了一些详细的介绍,包括配置开发环境和项目结构目录解读,今天我们正式开始写代码。 入门新的开发语言往往从Hello World开始,Uniapp的初始化项目中已经写好了一个简单的demo,这里就不再赘述…...

uniapp使用npm下载

uniapp的项目在使用HBuilder X创建时是不会有node_modules文件夹的,如下图所示: 但是uni-app不管基于哪个框架,它内部一定是有node.js的,否则没有办法去实现框架层面的一些东西,只是说它略微有点差异。具体差异表现在…...

uni-app微信小程序登录流程详解

文章目录 uni-app微信小程序登录流程实战详解微信小程序登录流程概述1. 获取登录凭证(code)2. 发送登录请求3. 保存登录态4. 登录状态管理5. 应用登录状态请求拦截器中添加 token自动登录页面路由守卫 使用 Vuex 集中管理登录状态登录组件示例登录流程最…...

【C++游戏引擎开发】第34篇:C++实现反射

一、反射系统概述 1.1 反射的核心概念 1.1.1 运行时自省能力 反射允许程序在运行时动态获取和操作自身的类型信息。这种能力突破了静态类型语言的限制,使得开发者可以: 检查对象类型及其成员结构动态创建未在编译期确定的类型实例实现类型无关的通用操作接口1.1.2 元数据驱…...

C# 的异步任务中, 如何暂停, 继续,停止任务

namespace taskTest {using System;using System.Threading;using System.Threading.Tasks;public class MyService{private Task? workTask;private readonly SemaphoreSlim semaphore new SemaphoreSlim(0, 1); // 初始为 0,Start() 启动时手动放行private read…...

langchain4j中使用milvus向量数据库做RAG增加索引

安装milvus向量数据库 官方网址 https://milvus.io/zh 使用docker安装milvus mkdir -p /data/docker/milvus cd /data/docker/milvus wget https://raw.githubusercontent.com/milvus-io/milvus/master/scripts/standalone_embed.sh#在docker中启动milvus sh standalone_emb…...

MySQL SQL Mode及其说明

以下是MySQL中所有支持的SQL Mode及其说明,综合了多个来源的信息并进行了分类整理: 一、严格模式相关 STRICT_TRANS_TABLES 对事务型存储引擎(如InnoDB)启用严格数据校验。若插入非法值(如类型不符、超出范围等&#…...

Web前端最新导航

前言 本文列出了很多与前端有关的常见网站、博客、工具等,整体来看比较权威。有些东西已经过时了,我就不列出来了。学是一方面,也是最主要的方面;但还有一个作用,比如,“这个前端框架你都不知道啊”、“这个…...

2025年AI工程师认证深度解析:AAIA认证体系全景指南与实战策略

一、IAAAI认证体系演进与价值定位 1.1 国际人工智能认证发展现状 全球人工智能认证市场呈现显著分化态势。据Gartner 2025Q1报告显示,北美市场以IEEE/ACM双认证体系为主导(市占率38%),欧盟区推行AI Act合规认证(强制…...

CentOS 和 RHEL

CentOS 和 RHEL(Red Hat Enterprise Linux)关系非常紧密,简而言之: CentOS 最初是 RHEL 的免费、开源克隆版,几乎与 RHEL 二进制兼容。 CentOS 原是 RHEL 的“免费双胞胎”,但已被放弃,现在推荐…...

flask开启https服务支持

目录 一、背景 二、开启https支持 三、自签名 1、安装openssl 2、验证安装 3、自签名 四、编写代码 五、访问https接口 一、背景 最近在做自动化业务,需要兼容现在主流的框架开发的前端页面,于是到github找到了几个项目,clone下来项目并…...

统计服务器CPU、内存、磁盘、网络IO、队列、数据库占用空间等等信息

文章目录 一、背景二、说明三、页面四、代码 前端 MonitorServiceProcessPage.vueMonitorServiceProcessTable.vueMonitorServiceProcessTableButton.vueaddMonitorTask.vueproductOperation.vueshowMonitorTask.vueMonitorSystemLog.vueMonitorTask.vueMonitorTaskLog.vueReal…...

【SGL】Scatter-Gather List内存传输技术

文章目录 1. What is SGL?2. sgl内存传输的原理2.1 核心思想2.2 sgl数据结构2.3 摘链和挂链 3. 零拷贝技术3.1 问题背景3.2 零拷贝的核心思想及实现方式 4. sgl在存储行业的应用 1. What is SGL? sgl(Scatter-Gather List)内存传…...

-MAC桢-

MAC桢和IP的关系: 主机A想跨网络和B通信需要IP地址进行路由选择,但一个局域网,比如路由器进行路由选择之前,首先要将数据包发送给路由器B,也就是局域网通信也就是同一个网段的主机进行通信,所以必须通过mac…...

安装:Kali2025+Docker

安装:Kali2025Docker Kali2025安装 直接官网下载WMware版本 https://www.kali.org/get-kali/#kali-virtual-machines 直接打开运行 初始用户密码 kali/kali sudo -i 命令切换到root 更换镜像 切换到其他可用的 Kali Linux 镜像源可能会解决问题,可以使用国内的镜像源&…...

Linux云计算训练营笔记day04[Rocky Linux中的命令:mv、cp、grep(^$)、tar、重定向>和>>]

mv 移动(剪切) 源数据会消失 格式: mv 源文件 目标路径 touch /opt/a.txt 创建文件 mv /opt/a.txt /root 移动文件,没有改名 mkdir gongli 创建目录 mv gongli /opt/ 移动目录,没有改名 mv /opt/gongli tedu 移动目录,改名了 …...

AbMole Olaparib:打破常规,用PARP抑制重塑肿瘤研究

在当今的生物医学研究领域,Olaparib(AZD2281,AbMole,M1664)作为一种重要的PARP(聚腺苷二磷酸核糖聚合酶)抑制剂,受到了广泛关注。Olaparib可干扰 DNA 单链断裂的修复,从而…...

RPC、gRPC和HTTP的区别

RPC 只是一种屏蔽远程过程调用的设计,它与HTTP不是对立的,两者不是一个层面的概念。 RPC底层通信可以使用TCP实现(如Thrift),也可以使用HTTP实现(如gRPC),其本身并无限制。 1. 概念…...

Windows重置网络,刷新缓存

同时按键盘上的【Windows】键和【S】键,弹出搜索框,输入 命令提示符 在“最佳匹配”下的【命令提示符】上右键,点击【以管理员身份运行】 1弹出一个窗口,在光标闪烁的位置,直接输入【netsh winsock reset】&#xff0…...

Ref是什么

在 React 中,ref 是一种用于访问 DOM 元素或组件实例的机制。它允许你在组件中直接操作 DOM 元素,或者访问子组件的实例。ref 的使用场景非常广泛,包括表单操作、焦点控制、动画等。以下是关于 ref 的详细讲解以及在项目中的常见使用场景。 …...

OpenHarmony平台驱动开发(十),MMC

OpenHarmony平台驱动开发(十) MMC 概述 功能简介 MMC(MultiMedia Card)即多媒体卡,是一种用于固态非易失性存储的小体积大容量的快闪存储卡。 MMC后续泛指一个接口协定(一种卡式)&#xff0…...

解决IDEA无法运行git的问题

之前git一直没有问题,今天打开就提示我安装git,自然用git去提交新项目也会遇到问题。 我出现问题的原因是:git路径缺失 文件->设置->git 发现git的路径为空,按照实际位置填写即可...

HTTP 响应状态码总结

一、引言 HTTP 响应状态码是超文本传输协议(HTTP)中服务器对客户端(通常是 Web 浏览器)请求的响应指示。这些状态码是三位数字代码,用于告知客户端请求的结果,包括请求是否成功。响应被分为五个类别&#…...