在这篇博文中,我将引导您通过 CI/CD 管道并使用 Gitops 方法在 golang 中自动部署 Web 应用程序。
我们将通过容器化我们的应用程序将其部署在 kubernetes 上,然后使用 ArgoCD 进行部署。
要求
- kubernetes 集群 您可以使用 kubernetes 云提供商提供的任何托管服务,或者如果您的系统有足够的资源来配置 kubernetes 集群,您可以使用 Minikube/kind 设置本地 kubernetes 集群
- 一个 github 帐户 一个免费帐户就足够了,因为我们将使用 Github Actions 进行持续集成 (CI)
- 一个 dockerhub 帐户 我们将使用 dockerhub 来拉取容器镜像
- 渴望学习
- 不放弃 这是您将面临的重要问题,您应该能够排除并解决它们。在我完成这个项目之前,我必须排除很多次故障。
开始吧
使用多阶段 docker 构建对应用程序进行容器化
为了让 Web 应用程序在所有机器上可用,我们必须将其容器化,而容器化这个词比 docker 更好。
我创建了一个 Dockerfile 来运行该应用程序,但我使用了多阶段格式
为什么要进行多阶段构建?
原因很简单,如果我在单个阶段中创建图像,它将消耗更多的机器空间,而通过使用多阶段构建,我们可以通过分离构建和运行时环境来优化图像的最终大小,并减少攻击我们图像的表面以获得更好的安全性
具体方法如下
- 创建一个 dockerfile
- 在构建阶段编译应用程序
- 将编译后的二进制文件复制到最小的基础映像
- 构建镜像并将其推送到 dockerhub,以便 CI 中的 Github Actions 使用该镜像
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
现在我们有了 dockerfile,让我们构建它并将其部署到 dockerhub
docker build -t pankaj892/webapp:v1 .
我们尝试检查应用程序是否在本地计算机上按预期运行
docker run -p 8080:8080 pankaj892-webapp:v1
让我们将其推送到 dockerhub
docker Push pankaj892/webapp:v1 .
Kubernetes集群创建
您可以使用 mininkube/kind 在本地创建集群,也可以使用云上的任何一种托管解决方案。我将使用 AWS 的 Elastic Kubernetes Service(EKS)。
您可以使用控制台或命令行在 EKS 中启动集群。我将使用命令行
eksctl create cluster--instance-selector-vcpus=2 --instance-selector-memory=4 --name <name-of-cluster> --region <region-code> </region-code></name-of-cluster>
这将仅选择具有 2 个 vCPU 和 4GB 内存的节点组的机器类型
Helm 图表创建和配置
我们可以一一部署所有资源,但随着规模的扩大,管理它们会很困难,这就是 Helm 的用武之地,它充当包管理器,使用图表来管理我们的所有资源
创建舵图
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
Helm 将创建供我们使用的文件,但我们的项目不需要其中的大部分文件。
创建以下文件并添加到helm目录
部署
eksctl create cluster--instance-selector-vcpus=2 --instance-selector-memory=4 --name <name-of-cluster> --region <region-code> </region-code></name-of-cluster>
服务
helm create web-app
入口
# This is a sample deployment manifest file for a simple web application. apiVersion: apps/v1 kind: Deployment metadata: name: web-app labels: app: web-app spec: replicas: 1 selector: matchLabels: app: web-app template: metadata: labels: app: web-app spec: containers: - name: web-app image: {{ .Values.image.repository }}:{{ .Values.image.tag }} ports: - containerPort: 8080
将值文件更新为此
# Service for the application apiVersion: v1 kind: Service metadata: name: web-app labels: app: web-app spec: ports: - port: 80 targetPort: 8080 protocol: TCP selector: app: web-app type: ClusterIP
Helm 部分现已完成,让我们继续部署我们的 CI
与 Github Actions 的持续集成 (CI)
Github Actions 允许我们根据仓库中的一些事件(如推、拉)自动构建应用程序。
让我们创建管道文件
工作流程文件存储在(.github/workflows/cicd.yml)
# Ingress resource for the application apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: web-app annotations: nginx.ingress.kubernetes.io/rewrite-target: / spec: ingressClassName: nginx rules: - host: web-app.local http: paths: - path: / pathType: Prefix backend: service: name: web-app port: number: 80
这个工作流程文件首先从 dockerfile 构建我们的镜像,然后将其推送到 dockerhub,然后在 helm 的 Charts.yaml 文件中更新镜像的标签。
设置 ArgoCD 进行持续交付
我们将使用 argocd 作为我们的 Cd 管道,因为 argocd 将能够从我们的 git 存储库中获取更改并在应用程序中更新它们。
让我们在集群上安装 argocd
kubectl 创建命名空间 argocd
kubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
要访问 argocd 服务器,我们需要将服务更改为负载均衡器类型
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
对于 Windows,这将是
kubectl patch svc argocd-server -n argocd -p '{"spec": {"type": "LoadBalancer"}}'
如果它不起作用,只需通过 kubectl 编辑服务并将类型更改为 LoadBalancer 它应该可以工作
现在获取服务的IP
kubectl get svc argocd-server -n argocd
我们获得了 IP,但需要密码才能登录 argocd
kubectl 获取秘密 argocd-initial-admin-secret -n argocd -o jsonpath="{.data.password}" | base64 --解码
此命令将获取密码并解码密码,因为密码以 Base64 格式编码
登录后点击“新建项目”>;添加您的项目名称>添加存储库,以便 argocd 可以同步存储库 argocd 将自动查找值文件并在单击提交后选择该文件
入口和 DNS 映射
我们构建了管道,但我们如何访问我们的应用程序,您不能每次都从 EKS 中输入集群 URL 来访问它,我们需要为此使用入口
我正在使用来自 AWS 的 Nginx Ingress,以便我可以访问该应用程序
在我们的集群上部署入口
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.11.1/deploy/static/provider/aws/deploy.yaml
现在 Ingress 已部署,我们需要将来自 EKS 的集群 IP 添加到本地主机文件(对于 Linux,其为 /etc/hosts),对于 Windows,它位于 C:WindowsSystem32etchosts
# Start with a base image FROM golang:1.22 as base WORKDIR /app COPY go.mod ./ RUN go mod download COPY . . RUN go build -o main . ####################################################### # Reduce the image size using multi-stage builds # We will use a distroless image to run the application FROM gcr.io/distroless/base # Copy the binary from the previous stage COPY --from=base /app/main . # Copy the static files from the previous stage COPY --from=base /app/static ./static # Expose the port on which the application will run EXPOSE 8080 # Command to run the application CMD ["./main"]
现在我们可以在 web-app.local 上访问我们的应用程序
我们已经完成了所有步骤,让我们测试我们的应用程序
如您所见,顶部的 url 是我们在主机文件中定义的
我们已经运行了应用程序,让我们添加一些内容并提交到我们的存储库,以便 argocd 可以获取该更改并部署到应用程序
我对我的存储库进行了更改,这应该会触发管道
管道已启动,完成后让我们看看 argocd 是否接受该更改
是的,我们看到应用程序发生了变化,argocd 确实拾取了更改并将我们的应用程序与最新更改同步
如果你做到了这一步那么恭喜!!!
这个项目对我来说是一次很棒的学习经历,从在 AWS 上部署 Kubernetes 到创建管道和部署以及对其进行故障排除。这个项目帮助我为 Go 应用程序创建了一个端到端的 DevOps 管道,并且它可以根据需求进行扩展。我计划进行更多探索,例如使用 terraform 或 cloudformation 堆栈部署 eks clutser 并进行更多改进。
如果你遇到困难,可以参考这个仓库
请在评论中告诉我您构建此管道的体验如何。
以上是使用 Gitops 和 Kubernetes 在 Golang Web 应用程序上进行 DevOps 管道的详细内容。更多信息请关注PHP中文网其他相关文章!

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang在实际应用中表现出色,以简洁、高效和并发性着称。 1)通过Goroutines和Channels实现并发编程,2)利用接口和多态编写灵活代码,3)使用net/http包简化网络编程,4)构建高效并发爬虫,5)通过工具和最佳实践进行调试和优化。

Go语言的核心特性包括垃圾回收、静态链接和并发支持。1.Go语言的并发模型通过goroutine和channel实现高效并发编程。2.接口和多态性通过实现接口方法,使得不同类型可以统一处理。3.基本用法展示了函数定义和调用的高效性。4.高级用法中,切片提供了动态调整大小的强大功能。5.常见错误如竞态条件可以通过gotest-race检测并解决。6.性能优化通过sync.Pool重用对象,减少垃圾回收压力。

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

关于SQL查询结果排序的疑惑学习SQL的过程中,常常会遇到一些令人困惑的问题。最近,笔者在阅读《MICK-SQL基础�...

golang ...

Go语言中如何对比并处理三个结构体在Go语言编程中,有时需要对比两个结构体的差异,并将这些差异应用到第�...


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

禅工作室 13.0.1
功能强大的PHP集成开发环境

SublimeText3 Linux新版
SublimeText3 Linux最新版

DVWA
Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

记事本++7.3.1
好用且免费的代码编辑器

螳螂BT
Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。