借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

news2025/3/11 0:32:02

在当今快节奏的开发环境中,实现无缝、稳健的 CI/CD 流水线对于交付高质量软件至关重要。在本文中,我们将向您介绍使用 Bitbucket Pipeline、ArgoCD GitOps 和 AWS EKS 设置部署的步骤,所有步骤都将利用 Terraform 的强大功能进行编排。在Part 1里,将主要介绍通过 Terraform 创建和部署 CI/CD 流水线的前三步。

 

使用 Terraform 创建 AWS EKS Infra

我们有两种环境,一种是 Private Node + 2 NAT,另一种是 Public Node + 1 NAT。

 

image.png

 

为了演示,以下将使用一个 AWS Ubuntu 22.04.3 LTS EC2 实例,并附加 AdministratorAccess ,从而实现 Linux 电脑上克隆 repo:

 

image.png

 

然后将目录更改为:

 

EKS-TF-Bitbucket-Pipeline-ArgoCD-GitOps/EKS TF/EKS Infra-TF (Public Node) - Prod

 

或者您也可以使用 Dev 版本,这两个版本完全相同,只是 Dev 版本有 2 个 NAT,而 Prod 版本只有 1 个 NAT。

 

现在,在将此应用于创建 AWS EKS Infra 之前,您需要做以下事情

 

  1. 在个人电脑上安装以下工具(根据操作系统进行选择)
  • AWS CLI: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
  • Terraform CLI: https://developer.hashicorp.com/terraform/install
  • Kubectl CLI:https: //kubernetes.io/docs/tasks/tools/

 

  1. 如果要在自己的电脑上运行脚本,请配置 AWS 访问密钥

 

现在运行 $ terraform fmt 命令来格式化 terraform 代码。

 

image.png

 

接下来,您可以在 vars.tf 文件中编辑环境名称、K8s 版本和 EKS 部署的地区。

 

image.png

 

也可以使用 ap-southeast-1 区域,并通过更改 default 保存文件。

 

同时不要忘记更改 eks-node-groups-policy.tf 文件中的 desired_sizeinstance_types

 

image.png

 

您应该为 Eks 集群节点选择一个中型或更好的大型实例,否则在安装 ArgoCD 或其他应用程序时会遇到问题,因为所有这些 EC2 实例类型都有 pod 数量限制,具体可以在这里查看:https://github.com/awslabs/amazon-eks-ami/blob/master/files/eni-max-pods.txt

 

现在运行 $ terraform init 下载依赖项:

 

image.png

 

之后,您可以根据自己的喜好运行 $ terraform plan$ terraform apply

 

image.png

 

输入值 yes,然后等待完成,最多需要 10-15 分钟。

 

tf 代码将创建以下 AWS 服务:

 

  • VPC
  • 子网
  • 子网路由表
  • IAM 角色和策略
  • 互联网网关
  • NAT 网关
  • 弹性 IP
  • EKS 集群和节点组

 

当成功完成 tf 脚本后,您将在最后看到类似下面的屏幕:

 

image.png

 

您还可以在 AWS 控制台中查看是否创建了 EKS 集群和所有资源。

 

image.png

 

现在,我们需要授予 kubectl 对 EKS 集群的访问权限,为此需要运行以下命令:

 

$ aws eks update-kubeconfig - region region-code - name my-cluster

 

您需要根据您的环境更新 region-codemy-cluster 名称,例如:

 

image.png

 

然后消除这个警告:

 

image.png

 

为此,您需要使用以下命令将 IAM 用户名和 arn 添加到 EKS configmap 中:

 

$ kubectl edit configmap aws-auth -n kube-system

 

它将打开一个新窗口,如下所示:

 

image.png

 

之后,在 mapRoles 段落后添加以下代码:

 

mapUsers: |
 — groups:
 — system:masters
 userarn: arn:aws:iam::XXXXXXXXXXXX:user/devashish
 username: devashish

 

不要忘记更改您试图访问 EKS 控制台的 IAM 用户名。

 

image.png

 

如果使用了 root 权限来创建和访问 EKS 集群,则必须使用 root 的userarn 和 username。

 

然后用 wq 保存文件,再刷新 EKS 集群页面——现在 IAM 用户警告应该已经消失了。

 

此外,您还可以在 EKS 集群的 Compute tab 中看到之前由于 RBAC 权限问题而没有出现的 Nodes。

 

image.png

 

您还可以运行 kubectl 命令来检查 EKS 集群是否与 Kubectl CLI 工具连接。

 

在这里插入图片描述

 

这样 EKS 集群就已经准备就绪并运行正常了,现在让我们进入下一步。

 

在 EKS 集群上部署 ArgoCD 及其依赖项

为此,我们将使用 repo 网址:https://github.com/dcgmechanics/EKS-TF-Bitbucket-Pipeline-ArgoCD-GitOps/blob/main/EKS%20Addons/Readme.md ,只需按照文件中的步骤操作即可。

 

  1. 安装 ArgoCD

 

image.png

 

您可以使用以下命令检查正在运行的 ArgoCD pods:

 

$ kubectl get po -n argocd

 

image.png

 

既然 ArgoCD 已经安装完成,现在让我们进入下一步。

 

  1. 使用 ACM 为 NLB 部署 Ingress-Nginx

 

在继续下一步之前,我们需要以下东西:

 

  • VPC CIDR,即 proxy-real-ip-cidr
  • AWS ACM 证书 arn id,即 arn:aws:acm

 

因此,如果没有,请创建它们。

 

首先,您需要使用 wget 下载 Ingress-Nginx for NLB 控制器脚本。

 

$ wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/aws/nlb-with-tls-termination/deploy.yaml

 

image.png

 

然后使用任何文本编辑器打开它。

 

$ nano deploy.yaml

 

再根据配置更改这些值。

 

image.png

 

根据您的信息更改值后,请确保在创建 ACM 证书时使用通配符,然后运行以下命令:

 

$ kubectl apply -f deploy.yaml

 

  1. 部署 ArgoCD pod Ingress服务

 

首先使用 $ nano ingress.yaml 创建一个 YAML 文件,并粘贴 EKS Addons Readme.md 文件中的内容。不要忘记更改 host 值。

 

image.png

 

然后运行:

 

$ kubectl apply -f ingress.yaml

 

在 EKS 上部署 argocd 服务 ingress 文件。您可以使用以下命令查看服务是否部署成功。

 

$ kubectl get ingress -n argocd

 

image.png

 

ADDRESS 值需要一些时间才能显示,所以请耐心等待。然后创建一个 A Record,将 ArgoCD 子域名指向该 NLB。

 

image.png

 

现在,您可以访问网站:https://argocd.showyrskills.in。

 

image.png

 

从 CLI 恢复密码,然后使用密码登录 ArgoCD,用户名应为 admin。

 

使用以下命令找回密码:

 

$ kubectl -n argocd get secret argocd-initial-admin-secret -o jsonpath="{.data.password}" | base64 -d; echo echo echo.| base64 -d; echo

 

之后就可以成功登录了。

 

image.png

 

既然 ArgoCD 已经正常运行,现在让我们进入下一步。

 

设置 Bitbucket Pipeline并部署到 ECR Repo

为此,我们需要创建一个 Bitbucket 和 AWS ECR Repo,其中 Bitbucket Pipeline 将把应用程序部署到 ECR Repo 中。

 

转到您的 Bitbucket ID 并创建一个新的 repo:

 

image.png

 

创建 repo 后,我们需要 3 个文件:

 

  • main.js
  • Dockerfile
  • bitbucket-pipeline.yaml

 

Bitbucket Pipeline + Dockerfile 文件夹下的repo 中提供了示例文件。

 

因此,让我们根据您的应用程序创建所有 3 个文件。我将在 main.js 文件中使用示例 node js 应用程序。

 

请记住,在创建 Bitbucket Pipeline YAML 文件之前,先创建 AWS ECR Repos,因为运行中需要它。例如,在 AWS ECR 中创建了以下私有 repo。

 

image.png

 

现在,我们需要将 ECR 仓库中的一些值复制并粘贴到 Bitbucket Pipeline 的 YAML 文件中。

 

image.png

 

确保根据需要更新分支名称和 -profile 标签,否则 Pipeline 将无法访问 iam 访问密钥。

 

现在,我们需要创建一个具有 ECR 仓库访问权限的 AWS 访问密钥对,并作为以下变量添加到 Bitbucket Pipeline中。

 

  • ECR_ACCESS_KEY
  • ECR_SECRET_KEY
  • ECR_REGION

 

此外,为了在 Bitbucket Pipeline中添加版本库变量,我们首先需要启用它。

 

image.png

 

然后,对于 ECR Repo 访问,我们需要创建一个具有 AmazonEC2ContainerRegistryPowerUser 访问权限的 IAM 用户。

 

image.png

 

然后创建 AWS Access Key Pair,并将其添加到 Bitbucket Pipelines 版本库变量中,如下所示:

 

image.png

 

之后,您的 repo 中就应该有以下文件了:

 

image.png

 

确保写入正确的文件名,否则可能无法工作,流水线也不会执行。

 

image.png

 

image.png

 

完成所有步骤后,流水线将自动运行。

 

image.png

 

几分钟后,流水线应该就会运行成功,并将容器镜像部署到 ECR Repo 上。

 

image.png

 

我们可以看到,标记为 1 的镜像已成功上传到 ECR,因为我们使用了 ${BITBUCKET_BUILD_NUMBER} 作为镜像的标记,所以可以更容易地通过相应的 ECR Repo 找到流水线编号。

 

image.png

 

既然部署到 ECR Repo 的 Bitbucket Pipeline 已经正常运行,也就说明可以准备进行下一步了。

 

在 Part 2 中,我们将会更详细地囊括后两个重要步骤,并指导您如何利用Terraform在 Bitbucket Pipeline 上实现端到端的 ArgoCD GitOps。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1495598.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

互联网智慧工地源码,“互联网+建筑大数据”SaaS微服务架构,支持PC端、手机端、数据大屏端

智慧工地源码,支持多端展示(PC端、手机端、平板端)SaaS微服务架构,项目监管端,工地管理端源码 智能时代的风暴已经融入了我们生活的每个方面,智能手机、iPad等移动终端智能设备已经成为我们生活的必需品。智…

[C语言]——分支和循环(3)

目录 一.while循环 1.if 和 while的对比 2.while语句的执行流程: 3.while循环的实践 4.练习 二.for循环 1.语法形式 2.for循环的执行流程 3.for循环的实践 4.while循环和for循环的对比 5.练习 三.do-while循环 1.语法形式 2.do while循环的执行流程 3…

ES单节点部署

ES 拉取镜像 docker pull elasticsearch:7.10.1启动容器 docker run -d -p 9200:9200 -p 9300:9300 -e "discovery.typesingle-node" -e "ES_JAVA_OPTS-Xms1g -Xmx1g" -v /es_data:/usr/share/elasticsearch/data --name es 558380375f1a注&#xff1a…

覆盖element-ui的el-menu样式记录:背景图片、菜单图标、菜单高亮与鼠标悬浮高亮、调整子菜单等样式

页面中修改el-menu 设置background-color"transparent"&#xff0c;menu菜单下的背景图片则能正常显示了 <el-menuclass"el-menu-demo"mode"horizontal"background-color"transparent"><el-menu-item index"1">…

Java基于微信小程序的校园失物招领小程序

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

app逆向-ratel框架-AES,DES,MD5,SHA1加密算法java hook程序

一、前言 AES&#xff08;高级加密标准&#xff09;、DES&#xff08;数据加密标准&#xff09;、MD5&#xff08;消息摘要算法5&#xff09;和SHA-1&#xff08;安全哈希算法1&#xff09;都是常见的加密算法&#xff0c;用于数据加密和哈希计算。 二、加密算法实现 1、创建…

基于单片机的火灾报警系统设计

目 录 摘 要 I Abstract II 引 言 1 第1章 系统整体方案设计 3 1.1 系统方案的选择 3 1.2 系统方案设计 3 1.2.1 系统概述 3 1.2.2 系统框图 4 第2章 系统硬件设计 5 2.1单片机STC89C52 5 2.1.1 最小系统电路 6 2.2 显示电路 7 2.2.1 显示方案的选择 7 2.2.2 1602液晶显示 7 2…

gan, pixel2pixel, cyclegan, srgan图像超分辨率

文章目录 1.gan2.DCgan3.cgan4.pixel2pixel&#xff08;Image-to-Image Translation with Conditional Adversarial Networks&#xff09;5.CycleGAN6.Deep learning for in vivo near-infrared imaging11..Photo-Realistic Single Image Super-Resolution Using a Generative …

【AI视野·今日NLP 自然语言处理论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.NLP 自然语言处理论文速览 Tue, 5 Mar 2024 (showing first 100 of 175 entries) Totally 100 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Key-Point-Driven Data Synthesis with its Enhancement on Mathematica…

论文研读_多目标部署优化:无人机在能源高效无线覆盖中的应用(ImMOGWO)精简版

此篇文章为Multi-objective Deployment Optimization of UAVs for Energy-Efficient Wireless Coverage的论文学习笔记&#xff0c;只供学习使用&#xff0c;不作商业用途&#xff0c;侵权删除。并且本人学术功底有限如果有思路不正确的地方欢迎批评指正! 创新点 RD算法 混合…

少儿编程机器人技术开发公司的创新之路

行业背景&#xff0c;国家政策利好 随着科技的不断发展&#xff0c;少儿编程机器人技术作为一种新兴的教育方式逐渐受到人们的关注。这项技术将编程与机器人技术相结合&#xff0c;通过互动性强、趣味性高的方式&#xff0c;帮助儿童学习编程知识&#xff0c;培养逻辑思维和创…

使用J-Link Commander通过J-LINK以命令的形式来访问ARM通用MCU

通常我们的操作是写好程序然后将程序下载到芯片里面&#xff0c;然后运行程序来进行相应的操作&#xff0c;其实还可以使用 J − L i n k C o m m a n d e r J-Link\quad Commander J−LinkCommander通过 J − L I N K J-LINK J−LINK以命令的形式来简单访问ARM通用MCU&#xf…

IP劫持的危害及应对策略

随着互联网的发展&#xff0c;网络安全问题日益凸显&#xff0c;其中IP劫持作为一种常见的网络攻击手段&#xff0c;对个人和企业的信息安全造成了严重的威胁。IP数据云将分析IP劫持的危害&#xff0c;并提出相应的应对策略。 IP地址查询&#xff1a;IP数据云 - 免费IP地址查询…

目标检测评估指标

目录 一、检测精度1、TP、FP、TN、FN概念正样本和负样本TP(True Positive---正确的正向预测)FP(False Positive---错误的正向预测&#xff09;FN(False Negative---错误的负向预测)TN(True Negative---正确的负向预测) 2、Precision(准确率)和Recall(召回率)3、P-R curve &…

【开源】SpringBoot框架开发网上药店系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 药品类型模块2.3 药品档案模块2.4 药品订单模块2.5 药品收藏模块2.6 药品资讯模块 三、系统设计3.1 用例设计3.2 数据库设计3.2.1 角色表3.2.2 药品表3.2.3 药品订单表3.2.4 药品收藏表3.2.5 药品留言表…

归并排序总结

1.归并排序 归并排序的步骤如下&#xff1a; ①枚举中点&#xff0c;将区间分为左右两段&#xff1b; ②对左右两段区间分别排序&#xff1b; 这个过程以递归的方式进行。 ③合并两段区间。 是一个模拟的过程。用两个指针分别指向左右区间&#xff0c;判断当前哪个数小&…

【Linux C | 网络编程】广播概念、UDP实现广播的C语言例子

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

酷开科技服务升级,酷开系统给消费者更好的使用体验!

看电视的时候你是不是也会有选择困难症&#xff1f;不知道要看哪个&#xff1f;不知道如何操作&#xff1f;体验不够顺畅&#xff1f;现在&#xff0c;有了酷开系统9.2&#xff0c;这些通通不再是问题&#xff01;酷开科技&#xff0c;一直致力于服务升级&#xff0c;给消费者更…

springBoot整合Redis(三、整合Spring Cache)

缓存的框架太多了&#xff0c;各有各的优势&#xff0c;比如Redis、Memcached、Guava、Caffeine等等。 如果我们的程序想要使用缓存&#xff0c;就要与这些框架耦合。聪明的架构师已经在利用接口来降低耦合了&#xff0c;利用面向对象的抽象和多态的特性&#xff0c;做到业务代…

uniapp+vue3+vites使用lime-echart问题记录

问题记录 1.vue3使用echarts,H5和微信小程序兼容问题 1.vue3使用echarts,H5和微信小程序兼容问题 问题描述&#xff0c;正常使用echarts&#xff0c;H5正常&#xff0c;小程序报错 报错信息如下 解决方案&#xff1a; 注意要点一&#xff1a;vue3需要使用esm文件 地址&#x…