我喜欢参加黑客马拉松。不仅仅是为了参与,更是为了认识新朋友,并了解他们在构建什么项目。今年5月,我去参加了一个名为Aventus的黑客马拉松,不是为了参加比赛,而是为了见一些前辈和同行。在那里,我遇见了Rishabh Lakhotia,他是Point Blank的校友,他告诉我他所在公司Vance有一个实习生的空缺。我个人一直对DevOps很感兴趣,但与他交谈时,他向我介绍了诸如GitOps、Infrastructure as Code和Terraform等概念!唯一的办法就是弄清楚这些概念意味着什么,以便有机会通过面试。我认为,最能脱颖而出的方式是将学到的内容应用于我现有的项目中。这篇博客文章将详细讲解GitOps的基础,并分享我在实施过程中的见解。
简单介绍一下大家好,我是阿卡什·辛格,一名来自班加罗尔的大三的工程学生和开源项目的贡献者。
我的社交媒体链接如下:LinkedIn,GitHub 和 微博。
谢谢!
在网上我用的昵称是SkySingh04。
GitOps是什么?本质上,GitOps 将 Git 的版本控制能力引入了 DevOps 领域。通过将 Git 视为“唯一可信来源”,GitOps 管理应用代码和 IaC,分别存放在不同的 Git 仓库里。这种设置带来了诸多好处:
- 轻松回滚: Git 的版本历史记录允许版本追踪,如果出现问题,团队可以轻松地回滚到之前的某个状态。
- 增强安全性: 通过拉取请求和 Git 内置的安全特性来控制代码变更,GitOps 增强了部署的安全性。
- 全面自动化: 自动化的 CI/CD 管道使部署过程变得顺畅一致,每次代码推送都会自动触发相应的构建和更新。
在 GitOps 中,基础设施和应用程序的期望的状态存储在 Git 中。任何对此状态的更改,无论是应用程序代码更新还是基础设施配置,都通过拉取请求来追踪、审查和管理。这种方法减少了手动操作,让团队能够更快、更可靠地交付更新。
在HaalSamachar中实施GitOps在学习GitOps的时候,我觉得这个视频非常有帮助
现在我理解了GitOps是什么,接下来该怎么具体实施呢?让我们分步骤说明一下:
第一步:把应用代码和基础架构代码分开
为了充分利用GitOps原则,我将应用和基础设施代码分成了两个独立的Git仓库。这使得管理和操作每一部分变得更加容易,不仅符合GitOps的最佳实践,还使管理和操作每一部分变得更加容易。对于HaalSamachar来说,这意味着将应用代码库和基础设施即代码(IaC)脚本分别存放在两个不同的仓库里。
这种分离的好处在进行基础设施更新时变得非常明显。现在,我可以独立更新基础设施而不影响核心应用的代码库,减少复杂性,提供更模块化的处理方式来应对部署和更新。
这里是一个GitOps应用仓库
HaalSamachar应用仓库:包含用GoLang构建的后端微服务,其中包括用gqlgen构建的GraphQL API和用Gin构建的四个REST接口,前端使用NextJs+TypeScript构建,并使用PostgreSQL数据库。整个应用使用Docker进行容器化。
HaalSamachar应用仓库:包含用GoLang构建的后端微服务,其中包括用gqlgen构建的GraphQL API和用Gin构建的四个REST接口,前端使用NextJs+TypeScript构建,并使用PostgreSQL数据库。整个应用使用Docker进行容器化,通过Dockerfile和CI/CD管道配置来实现。 HaalSamachar基础设施仓库:包含用于Haalsamachar App的Terraform脚本、Kubernetes清单和GitOps配置。 功能-
GraphQL API: 使用gqlgen构建一个GraphQL服务器,以高效查询和操作数据。
-
REST APIs: 使用Gin构建的三个REST接口,用于处理各种功能。
-
Docker & Kubernetes: 使用Docker进行容器化。
-
Next.js进行SSR: 使用Next.js进行服务器端渲染(SSR),搭配TypeScript和Tailwind CSS。
-
PostgreSQL: 用于存储和管理数据的数据库。
- Firebase Auth: 集成Firebase认证,用于用户的身份验证和授权。
持续集成/持续部署(CI/CD)CI/CD 流水线自动化了测试和部署代码变更的流程。HaalSamachar 使用了 CI/CD 实践……
以下是 GitOps 基础设施仓库的链接
Haalsamachar IAC(包含 Haalsamachar 应用的 Terraform 脚本、Kubernetes 清单和 GitOps 配置)
HaalSamachar 基础设施仓库:HaalSamachar 应用程序的基础设施通过基础设施即代码 (IaC) 管理方法进行管理,包括 Terraform 脚本、Kubernetes 部署文件和 GitOps 配置。这确保了资源的自动化部署、可扩展性和一致性。 HaalSamachar 应用程序仓库:包含用 GoLang 构建的后端微服务,其中包括使用 gqlgen 构建的 GraphQL API,以及四个基于 Gin 构建的 REST API,前端使用 NextJs 和 TypeScript 构建,并由 PostgreSQL 数据库驱动,通过 Dockerfile 和 CI/CD 管道配置进行容器化。 如何搭建 Kubernetes集群Kubernetes部署配置的YAML文件位于 /deployment
目录下,可以修改以调整Pod的数量和其他配置,以满足需要。
要使用Kubernetes部署HaalSamachar,只需按照以下步骤进行即可。
-
安装 Kubernetes 集群: 在您选择的云提供商上或使用 Minikube 本地搭建 Kubernetes 集群
- 应用配置文件: 运行
kubectl apply /deployments
命令应用 Kubernetes 配置文件并将 HaalSamachar 应用部署…
第 2 步:使用 AWS 的 ECR 和 ECS 服务
从我和里沙卜拜的谈话中,我还了解到他们使用了AWS ECR和AWS ECS(这些是亚马逊提供的服务)。不过,我之前对这些一无所知,现在是时候动手了。
如图所示:
简单来说:
- ECR 作为一个私有仓库,用于存储 Docker 镜像,确保每个构建都安全存储并随时可用部署。
- ECS 负责这些容器的编排和管理,让部署和扩展变得简单,简化了在多台机器上部署和扩展容器的流程。
好的,现在我需要搞清楚怎么在容器化的环境中部署HaalSamachar的应用。
第三步:为 HaalSamachar 安装并配置 ECR 和 ECS
一旦我掌握了ECR(弹性容器注册表)和ECS(弹性容器服务)的基础知识,我就开始在HaalSamachar中应用它们。以下是具体实施情况:
这里保留了原本的Markdown格式。
配置 ECR
首先,我得一个私密和安全的地方来存储HaalSamachar的Docker镜像。ECR非常适合这一点,因为它可以与AWS的其他服务无缝衔接,并为我的镜像提供安全的集中存储。
- 创建ECR仓库: 通过AWS管理控制台,我设置了一个新的ECR仓库,用于存放HaalSamachar每个部署版本的Docker镜像。
- 设置权限: 接下来,我配置了权限,允许ECS(弹性容器服务)在需要时从ECR拉取Docker镜像。
- 将Docker镜像推送到ECR: 每次当我更新应用时,我都会生成一个新的Docker镜像并通过AWS CLI推送到ECR。这种版本管理方式使我能够有效地维护一致性并追踪变更。
使用ECS进行部署
将 Docker 镜像存放在 ECR 之后,接下来我转向了 ECS,ECS 是 AWS 提供的一种容器编排服务。我将介绍我是如何利用 ECS 来部署和管理 HaalSamachar 的:
- 任务定义: ECS 需要一个任务定义,以指定我的应用程序如何在容器化环境中运行。我定义了容器镜像来源(指向 ECR)、内存、CPU 需求和端口映射等细节。
- 服务设置: 我创建了一个 ECS 服务来管理容器的部署和扩展工作。该服务使 ECS 能够监控容器的健康状况,并自动替换任何失败的实例。
- 集群和部署: 最后,我在 ECS 集群中启动了该服务,这有助于在 AWS 基础设施上管理和维护容器实例。
通过使用ECS,我不需要担心手动处理容器。AWS通过ECS的自动扩展功能来处理编排,确保应用程序能自动适应不同的流量负载,无需手动调整。
第四步:通过 GitHub 操作自动化部署流程
一旦基础设施就位,我就需要一种自动化部署的手段。这时,GitHub Actions就登场了,一个对于HaalSamachar实施GitOps至关重要的CI/CD工具。结果发现,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》虽然可能不是我最复杂的作品之一,但它却有着特别的意义。这是一个可以从零开始学习AWS服务(如ECR和ECS)的项目,同时也可以测试我对GitOps的理解。看着它一步步实现,那些调试问题、构建Docker镜像和学习CI/CD的深夜工作,让我觉得非常值得。最终,《HaalSamachar》教会了我,你不必等待“完美的”项目或机会来深入新的技术。从你当前所在的位置开始,学习并构建一些东西——不论多么微小,它都会让你前进。
展望未来项目时,HaalSamachar 将在我旅程中一直占有一席之地。它不仅仅是一个新闻聚合工具,也是让我首次接触 GitOps,并引领我进入 DevOps 世界项目的开始。这一切都要感谢与一位乐于分享知识的老前辈的一次简短交谈。