与大学学长交流如何教会我 DevOps/GiOps
故事
故事
我喜欢参加黑客马拉松。不仅仅是为了参与,也是为了结识新朋友,看看大家都在做什么。今年 5 月,我参加了Aventus黑客马拉松,不是为了参加,而是为了见见一些前辈和同行。在那里,我遇到了Point Blank的校友Rishabh Lakhotia ,他告诉我他的公司Vance有一个实习生职位空缺。我个人一直对 DevOps 很感兴趣,但是当我和他交谈时,我被 GITOPS、基础设施即代码和 Terraform 等词汇轰炸了!唯一的行动方案是弄清楚这一切意味着什么,这样我才有机会通过面试。我认为脱颖而出的最好方法是将我学到的所有知识运用到我现有的项目中。这篇博文将分解 GitOps 的基本内容,并分享我在实施过程中的见解。
介绍
我是 Akash Singh,来自班加罗尔,工程专业三年级学生,也是一位开源贡献者。我的LinkedIn、GitHub和Twitter
账号如下:

我在网上使用的名字是 SkySingh04。
什么是 GitOps?
GitOps 的核心是将 Git 的版本控制功能引入 DevOps 世界。通过将 Git 视为“单一事实来源”,GitOps 在单独的 Git 存储库中管理应用程序代码和基础设施即代码 (IaC)。这种设置有以下几个好处:
- 轻松回滚: Git 历史记录支持版本跟踪,如果出现问题,团队可以在几秒钟内恢复到以前的状态。
- 提高安全性:通过拉取请求和 Git 内置的安全功能控制代码更改,GitOps 增强了部署安全性。
- 完全自动化:通过自动化的 CI/CD 管道,部署成为一个顺畅、一致的过程,其中每次代码推送都会触发相关的更新和构建。
在 GitOps 中,基础架构和应用程序的预期状态存储在 Git 中。任何对此状态的更改(无论是应用程序代码更新还是基础架构配置)都可以通过拉取请求进行跟踪、审查和管理。这种方法减少了人工干预,并使团队能够更快、更可靠地交付更新。
在学习 Gitops 的过程中,我发现这个视频非常有用
在 HaalSamachar 中实施 GitOps
好了,现在我明白了 Gitops 是什么,那么具体该如何实现它呢?我们来分解一下:
步骤 1:分离应用程序和基础设施代码
为了充分利用 GitOps 原则,我将应用程序和基础设施代码分离到两个不同的 Git 仓库中。这种组织架构上的转变使得我们能够更轻松地独立管理每个部分,同时又符合 GitOps 的最佳实践。对于 HaalSamachar 来说,这意味着我们需要一个仓库专门用于应用程序代码库,另一个仓库专门用于基础设施即代码 (IaC) 脚本。
这种分离的好处在进行基础设施更新时变得显而易见。现在,我可以在不干扰主应用程序代码库的情况下管理基础设施变更,从而降低了复杂性,并提供了一种更加模块化的方法来处理部署和更新。
这是 GitOps 应用程序存储库
HaalSamachar 的应用程序存储库由使用 GoLang 构建的后端微服务组成,其中包括使用 gqlgen 构建的 GraphQL API 和使用 Gin 构建的四个 REST API,以及使用 NextJs+TypeScript 构建的前端和由 PostgreSQL 支持的数据库,并使用 Docker 进行容器化。
HaalSamachar 应用程序存储库:由使用 GoLang 构建的后端微服务组成,包括使用 gqlgen 构建的 GraphQL API 和使用 Gin 构建的四个 REST API,以及使用 NextJs+TypeScript 构建的前端和 PostgreSQL 支持的数据库,使用 Dockerfiles 和 CI/CD 管道配置使用 Docker 进行容器化。
特征
- GraphQL API:利用 gqlgen 创建 GraphQL 服务器以有效地查询和操作数据。
- REST API:使用 Gin 构建了三个 REST API 来处理各种功能。
- Docker 和 Kubernetes:使用 Docker 进行容器化。
- 带有 SSR 的 Next.js:使用 Next.js 开发的用于服务器端渲染(SSR)的前端以及 TypeScript 和 Tailwind CSS。
- PostgreSQL:用作数据库来有效地存储和管理数据。
- Firebase Auth:集成 Firebase 身份验证,用于用户身份验证和授权。
持续集成/持续部署(CI/CD)
CI/CD 流水线自动化了代码更改的测试和部署过程。HaalSamachar 利用 CI/CD 实践……
这是 GitOps 基础设施存储库
Haalsamachar IAC:包含 Haalsamachar App 的 Terraform 脚本、Kubernetes 清单和 GitOps 配置
HaalSamachar 基础设施存储库:HaalSamachar 应用程序的基础设施采用基础设施即代码 (IaC) 方法进行管理,包含 Terraform 脚本、Kubernetes 清单和 GitOps 配置。这确保了资源部署的自动化、可扩展性和一致性。
HaalSamachar 应用程序存储库:由使用 GoLang 构建的后端微服务组成,包括使用 gqlgen 构建的 GraphQL API 和使用 Gin 构建的四个 REST API,以及使用 NextJs+TypeScript 构建的前端和 PostgreSQL 支持的数据库,使用 Dockerfiles 和 CI/CD 管道配置使用 Docker 进行容器化。
设置 Kubernetes 集群
kubernetes 部署配置 yaml 文件位于/deployment
目录中。您可以根据需要修改这些文件,以扩展 Pod 数量和其他配置。
要使用 Kubernetes 部署 HaalSamachar,请按照以下步骤操作:
-
安装 Kubernetes:在您首选的云提供商上或本地使用 Minikube 设置 Kubernetes 集群。
-
应用清单:使用kubectl apply /deployments
命令应用 Kubernetes 清单并将 HaalSamachar 应用程序部署到……
步骤 2:利用 AWS 服务 – ECR 和 ECS
现在,我从与 Rishabh Bhaiya 的谈话中了解到的另外两件事是,他们正在使用 AWS ECR 和 AWS ECS。我之前并不知道它们是什么,不过好吧,是时候去实现它们了。

简而言之:
- ECR作为存储 Docker 镜像的私有存储库,确保每个构建都安全存储并随时可供部署。
- ECS负责这些容器的编排和管理,简化跨机器群的容器部署和扩展。
好的,现在我需要弄清楚如何在容器化环境中部署 HaalSamachar 的应用程序。
步骤3:为HaalSamachar设置ECR和ECS
掌握了ECR(弹性容器注册表)和ECS(弹性容器服务)的基础知识后,我开始在 HaalSamachar 中实现它们。具体过程如下:
配置 ECR
首先,我需要一个私密、安全的位置来存储 HaalSamachar 的 Docker 镜像。ECR 非常适合,因为它可以与其他 AWS 服务无缝集成,并为我的 Docker 镜像提供安全、集中的存储。
- 创建 ECR 存储库:使用 AWS 管理控制台,我在 ECR 中设置了一个新的存储库,允许它保存 HaalSamachar 每个部署版本的 Docker 镜像。
- 设置权限:接下来,我配置权限以允许 ECS(弹性容器服务)在需要时从 ECR 中提取图像。
- 将 Docker 镜像推送到 ECR:每次更新应用程序时,我都会生成一个新的 Docker 镜像,并使用 AWS CLI 将其推送到 ECR。这种版本控制功能让我能够保持一致性并高效地跟踪变更。
使用 ECS 部署
Docker 镜像存储在 ECR 中后,我转向了 AWS 的容器编排服务 ECS。以下是我利用 ECS 部署和管理 HaalSamachar 的方法:
- 任务定义: ECS 需要一个任务定义,用于指定我的应用程序在容器化环境中的运行方式。我定义了一些详细信息,例如容器镜像源(指向 ECR)、内存、CPU 要求以及端口映射。
- 服务设置:我创建了一个 ECS 服务来管理容器的部署和扩展。该服务使 ECS 能够监控容器的运行状况并自动替换任何故障实例。
- 集群和部署:最后,我在 ECS 集群中启动了该服务,这有助于管理 AWS 基础设施上的容器实例。
通过设置 ECS,我无需担心手动处理容器。AWS 负责编排,而 ECS 的自动扩展功能确保应用程序无需人工干预即可处理不同的流量负载。
步骤 4:使用 GitHub Actions 自动部署
基础设施到位后,我需要一种自动化部署的方法。于是,我找到了GitHub Actions,这是一个 CI/CD 工具,在 HaalSamachar 实现 GitOps 的过程中发挥了至关重要的作用。事实证明,Vance 也正是通过这种方式来处理他们的工作流程。
我在 GitHub Actions 中设置了一个工作流程,其中包含以下阶段:
- 构建阶段:每次我将更改推送到主分支时,工作流都会启动构建。此阶段会根据最新代码创建 HaalSamachar 的 Docker 镜像。
- 推送至 ECR: Docker 镜像构建完成后,会自动推送至 ECR 仓库。此步骤确保最新的代码更改可在镜像仓库中用于部署。
- 在 ECS 上部署:最后阶段涉及使用新的 Docker 镜像更新 ECS 服务。GitHub Actions 触发了 ECS 上的部署,它从 ECR 获取最新镜像并无缝部署。
这个工作流程显著简化了我的部署流程。每次推送到主分支都会自动触发完整的部署流程,减少了人为错误的机会,提高了效率。
但这有什么意义呢?
我和 Rishabh 兄弟的对话是一个转折点。在那次黑客马拉松之前,我对 DevOps 只是略感好奇。GitOps 、IaC(基础设施即代码)和Terraform等概念对我来说遥不可及,几乎像是“真正的”工程师才能接触到的高级知识。但 Rishabh 的话语激励我深入研究,亲身实践这些概念,并将我的项目 HaalSamachar 推向新的高度。
在那次初次交流之后,我学习、分解并拼凑了所有我能学到的 GitOps 和 DevOps 基础知识。我观看教程、阅读文档,并通过实践学习。虽然我没有获得 Vance 的实习机会,但为这个机会做准备的这段经历重塑了我对软件工程的看法。最终的目标并非获得职位,而是通过突破自己的舒适区而获得的成长。
通过这个项目,我意识到 HaalSamachar 虽然可能不是我最精妙的作品,但却意义非凡。在这个项目中,我可以检验自己对 GitOps 的理解,并从零开始学习 ECR 和 ECS 等 AWS 服务。看着它一步步成型,让我在深夜调试、构建 Docker 镜像和学习 CI/CD 的过程中感到无比充实。最终,HaalSamachar 教会了我,不必等待“完美”的项目或机会来深入研究新技术。从你现在的处境出发,学习,并构建一些东西——无论多么微小,它都会推动你前进。
展望未来的项目,HaalSamachar 将永远在我的旅程中占据独特的位置。它不仅仅是一个新闻聚合工具;它还是一个引导我了解 GitOps 并开启我 DevOps 之旅的项目。这一切都要归功于与一位愿意分享知识的资深人士的一次简单交谈。
鏂囩珷鏉ユ簮锛�https://dev.to/skysingh04/how-talking-to-a-college-senior-taught-me-devopsgitops-7fp