首页 > 其他分享 >借助 Terraform 功能协调部署 CI/CD 流水线-Part 1

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

时间:2024-03-06 11:45:04浏览次数:25  
标签:CI Pipeline ArgoCD AWS Bitbucket CD Terraform ECR EKS

在当今快节奏的开发环境中,实现无缝、稳健的 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。

 

 

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

 

 

然后将目录更改为:

 

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. 在个人电脑上安装以下工具(根据操作系统进行选择)

 

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

 

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

 

 

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

 

 

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

 

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

 

 

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

 

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

 

 

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

 

 

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

 

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

 

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

 

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

 

 

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

 

 

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

 

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

 

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

 

 

然后消除这个警告:

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

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

 

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

 

 

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

 

 

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

 

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

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

 

  1. 安装 ArgoCD

 

 

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

 

$ kubectl get po -n argocd

 

 

既然 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

 

 

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

 

$ nano deploy.yaml

 

再根据配置更改这些值。

 

 

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

 

$ kubectl apply -f deploy.yaml

 

  1. 部署 ArgoCD pod Ingress服务

 

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

 

 

然后运行:

 

$ kubectl apply -f ingress.yaml

 

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

 

$ kubectl get ingress -n argocd

 

 

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

 

 

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

 

 

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

 

使用以下命令找回密码:

 

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

 

之后就可以成功登录了。

 

 

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

 

设置 Bitbucket Pipeline并部署到 ECR Repo

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

 

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

 

 

创建 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。

 

 

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

 

 

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

 

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

 

  • ECR_ACCESS_KEY
  • ECR_SECRET_KEY
  • ECR_REGION

 

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

 

 

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

 

 

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

 

 

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

 

 

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

 

 

 

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

 

 

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

 

 

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

 

 

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

 

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

标签:CI,Pipeline,ArgoCD,AWS,Bitbucket,CD,Terraform,ECR,EKS
From: https://www.cnblogs.com/sealio/p/18056192

相关文章

  • 获取企业裁判文书接口 - GetJudicialDocuments
     在如今的商业环境中,企业信息的准确性和可信度是非常重要的。尤其是在与其他公司进行合作或者与银行等金融机构进行业务往来时,对企业的背景和信用度有着更高的要求。那么如何有效地验证企业的信息是否真实可信呢?挖数据平台的获取企业裁判文书接口-GetJudicialDocuments将成为......
  • [CISCN2019 华北赛区 Day2 Web1]Hack World 1 盲注
    页面打开如上获取到信息flag在flag表中的flag列中尝试注入发现对用户的输入进行了限制使用burp进行fuzz测试其中535代表该页面对该条件进行了过滤其中括号并没有被过滤所以可以利用括号来代替空格进行盲注已知f的ascii码为102构筑等式(select(ascii(mid(flag,1,1)......
  • IEEE TCDS 专刊"Embodied AI in Indoor Robotics"征稿通知
    原文地址:https://mp.weixin.qq.com/s/Z-U4EO6FCF703yMwHXAq5A随着深度学习和强化学习在机器人学领域的迅猛发展,尤其是大型语言模型的创新进步,具身人工智能系统正以其感知、交互和自主导航的能力,预示着对家庭机器人技术等多个领域的革命性变革。因此我们联合英国利物浦大......
  • PCIE Spec 5.0, 6.0
    官网网站https://pcisig.com/specificationsPCIExpress®BaseSpecificationRevision6.0https://pan.baidu.com/s/1kUrho2M7hRJeCNXSxwLN8A?pwd=7zkxpwd=7zkxPCIExpress®BaseSpecificationRevision5.0https://pan.baidu.com/s/1aqRrbmR7dNO3gHz3Q3kF0Q提取码:62b8......
  • tp5框架No input file specified
    最近从网上下载了一个项目,本地搭建好环境。访问页面出现Noinputfilespecified。这个问题之前就遇到过,是因为权限的问题,导致nginx无法解析php文件,这次有点不一样所以记录一下。在项目的public目录下发现有这样一个文件,user.ini 打开文件后是这样的内容open_basedir的作......
  • 直播预告|从一张 CD 说起,关于播放器的前世今生
      1877年,天才发明家爱迪生研发出了人类历史上第一台可以录音和放音的装置,被称为“话筒”。 当时,这台机器使用一张薄薄的铁箔盘来录制声音,爱迪生亲手转动铁箔盘,在上面刻下声音的波纹。不过这个设计并不太实用,很难录制清晰持久的声音。据说爱迪生尝试过无数种设计和材料,直......
  • BigDecimal的基本使用
    BigDecimal的基本使用BigDecimal是Java中用于处理高精度数值的类。它可以表示任意精度的小数,并提供了各种数值运算的方法。1、创建BigDecimal对象BigDecimal类提供了多个方法来创建BigDecimal对象,下面是一些常用的方法: -BigDecimal(Stringval):使用字符串作为参数创建Bi......
  • 使用go写的etcd转发
    背景:因为公司中的机器比较老。我们的云上监控规定,使用的token的方式来监控,所以无法监控我们的etcd集群,我这里提供的一个etcd数据转发功能,能让监控到etcd集群packagemainimport( "crypto/tls" "crypto/x509" "fmt" "io" "net/http" "os" "sync" "......
  • 编码绕过xss说明和htmlspecialchars函数
    html实体编码JS编码1.htmlspecialchars函数把一些预定义的字符转换为html实体预定义的字符&->&amp;"->"'->'<-><>->gt;<script>--><&ltscript&gt默认绕过绕过方式:payload:'onclick='alert(123)'或者&#......
  • 2024 ICPC Asia Pacific Championship-K-线段树合并or主席树
    比赛链接:https://codeforces.com/contest/1938给一棵有根树,执行以下代码:letLbeanemptyarrayforx=1ton fory=1ton append((x-1)*n*n+(LCA(x,y)-1)*n+(y-1))toLsortLinnon-decreasingorder然后进行\(q\)次询问,每次问\(L\)中第......