借助 Terraform 功能协调部署 CI/CD 流水线-Part 1
在当今快节奏的开发环境中,实现无缝、稳健的 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 之前,您需要做以下事情
- 在个人电脑上安装以下工具(根据操作系统进行选择)
- 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/
- 如果要在自己的电脑上运行脚本,请配置 AWS 访问密钥
现在运行 $ terraform fmt
命令来格式化 terraform 代码。
接下来,您可以在 vars.tf
文件中编辑环境名称、K8s 版本和 EKS 部署的地区。
也可以使用 ap-southeast-1
区域,并通过更改 default
保存文件。
同时不要忘记更改 eks-node-groups-policy.tf
文件中的 desired_size
和 instance_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-code
和 my-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 ,只需按照文件中的步骤操作即可。
- 安装 ArgoCD
您可以使用以下命令检查正在运行的 ArgoCD pods:
$ kubectl get po -n argocd
既然 ArgoCD 已经安装完成,现在让我们进入下一步。
- 使用 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
- 部署 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。
借助 Terraform 功能协调部署 CI/CD 流水线-Part 1的更多相关文章
- GitLab私有化部署 - CI/CD - 持续集成/交付/部署 - 源代码托管 & 自动化部署
预期目标 源代码管理 借助GitLab实现源代码托管,私有化部署版本,创建项目,创建用户组,分配权限,项目的签入/牵出等. 自动化部署 源代码产生变更时(如签入),自动化编译并发布到指定服务器中部署, ...
- 如何在 Jenkins CI/CD 流水线中保护密钥?
CI/CD 流水线是 DevOps 团队软件交付过程的基本组成部分.该流水线利用自动化和持续监控来实现软件的无缝交付.通过持续自动化,确保 CI/CD 流水线每一步的安全性非常重要.在流水线的各个阶段 ...
- devops-5:从0开始构建一条完成的CI CD流水线
从0开始构建一条完成的CI CD流水线 前文中已经讲述了静态.动态增加agent节点,以动态的k8s cloud为例,下面就以Maven构建Java程序为例,开始构建出一条完整的CI CD流水线. 实 ...
- Docker: Jenkins与Docker的自动化CI/CD流水线实战
什么是CI/CD 持续集成(Continuous Integration,CI):代码合并.构建.部署.测试都在一起,不断地执行这个过程,并对结果反馈.持续部署(Continuous Deployme ...
- 持续部署CI/CD
一.简介 在敏捷开发时,通常将服务进行拆分成不同模块,每个开发小组负责一个模块的开发,会在一天内对这个模块进行频繁的提交到仓库主干并部署到线上.CI/CD就是在开发中使用工具保证快速并稳定上线的方法, ...
- Jenkins自动化CI CD流水线之1--介绍与安装
第1章 大纲 CI/CD, DevOps介绍 Git安装与使用 Jenkins安装与使用 权限管理 参数化构建 Master-Slave 流水线(Pipeline) 邮件通知 应用案例 自动发布PHP ...
- Jenkins自动化CI&CD流水线
1 环境说明 主机名称 IP cpu核数/内存/硬盘 安装软件 用途 controlnode 172.16.1.120 2/2/60 git 代码仓库 slavenode1 172.16.1.121 ...
- 使用 jenkins 搭建CI/CD流水线 (MAC)
如何搭建持续集成/持续交付平台?? 如何使用jenkins搭建持续交付流水线,以及和其他工具(如artifactory)集成?如何使用元数据,记录软件发布过程的构建信息,测试结果,并用rest Api ...
- Jenkins自动化CI CD流水线之8--流水线自动化发布Java项目
一.前提 插件:Maven Integration plugin 环境: maven.tomcat 用的博客系统代码: git clone https://github.com/b3log/solo. ...
- Jenkins自动化CI CD流水线之5--pipeline
一.概览 二.安装 在对jenkins进行初始化安装时,默认已经安装了jenkins的相关插件,如下图所示: 三.实操 新建任务: 编写pipeline脚本: 我们可以借助流水线语法去做. test流 ...
随机推荐
- Go泛型简介
Go语言的泛型是在Go 1.18版本中引入的一个新特性,它允许开发者编写可以处理不同数据类型的代码,而无需为每种数据类型都编写重复的代码.以下是关于Go语言泛型的一些关键点: 泛型是通过在函数或类型定 ...
- 多进程实现socket通信(Python)
服务器端: #__author__:Kelvin #date:2020/5/9 11:35 import socket from multiprocessing import Process def ...
- HanLP — 词性标注
词性(Part-Of-Speech,POS)指的是单词的语法分类,也称为词类.同一个类别的词语具有相似的语法性质 所有词性的集合称为词性标注集. 词性的用处 当下游应用遇到OOV时,可以通过OOV的词 ...
- CSS文本,字体设置与元素边框,阴影,显示模式
什么是元素的显示模式 网页中的标签很多,在不同的地方使用不同类型的标签. 元素显示模式就是标签以什么方式进行显示.如:div自己占一行,span一行可以放多个. HTML元素一般分为块元素和行内元素两 ...
- 实战视频所需要的IDE和工具软件的下载链接
以下是视频实战所需要的IDE和工具软件的下载链接: Visual Studio Code(适用于Windows.Mac和Linux):https://code.visualstudio.com/dow ...
- 轻量级按键动作识别模块(C语言)
1.前言 继嵌入式(单片机)裸机 C 语言开发 + 按键扫描(模块分层/非阻塞式)文章后,原来的按键识别基本能满足大部分需求,但是对于双击和多击等多样化的功能需求并不能满足,因此对整个按键动作识别模块 ...
- Java 运算符 - 除法
1. 除法运算符 Java中的除法运算符是"/"符号,表示将左侧操作数除以右侧操作数. 2. 整数除法 在Java中,整数除法的结果是一个整数,即只保留除法的整数部分,舍去小数部分 ...
- es6 快速入门 系列 —— 解构
其他章节请看: es6 快速入门 系列 解构 我们经常使用数组或对象存储数据,然后从中提取出相关数据信息 试图解决的问题 以前开发者为了从对象或数组中提取出特定数据并赋值给变量,编写了很多重复的代码, ...
- numpy数组初始化方法总结
1 使用list初始化 a=np.array([[1,2,3],[4,5,6]],dtype='float32') #a=[[1. 2. 3.],[4. 5. 6.]] 2 赋值与复制 (1)赋值 a ...
- CSS实现展开动画
CSS实现展开动画 展开收起效果是比较常见的一种交互方式,通常的做法是控制display属性值在none和其它值之间切换,虽说功能可以实现,但是效果略显生硬,所以会有这样的需求--希望元素展开收起能具 ...