GitOps 最佳实践(上)| 基于 Amazon EKS 构建 CI/CD 流水线

news2025/1/12 21:43:49

GitOps 是目前比较理想的方法来实现基于 Kuberentes 集群的持续部署。

了解了 GitOps 的概念以及 CI/CD 流水线的架构,接下来我们将通过以下四个模块逐步完成构建 CI/CD 流水线的最佳实践:

  1. 通过 IaC 部署云基础架构;
  2. 在 Amazon EKS 集群上部署 Flux CD;
  3. 利用 Flux CD 部署 GitOps 工作流;
  4. 利用 GitOps 工作流实现基于镜像的自动部署;

CI/CD 流水线中的代码仓库我们使用 Amazon CodeCommit,CI 部分我们使用 Amazon CodePipeline,CD 引擎使用 GitOps 理念的始作俑者 WeavWorks 的 Flux。我们会详细演示如何在 Amazon EKS 环境搭建符合生产要求的 GitOps 工作流;演示微服务应用如何在以 GitOps 方式构建的 CI/CD 流水线上实现应用的持续集成和持续交付。

亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库!

 

通过 IaC 部署云基础架构

DevOps 的一个基本原则是以开发人员对待代码的方式来对待基础设施。通过代码部署云上基础架构以及云环境的治理,也就是基础设施即代码 (IaC) 。通过 IaC 开发者能够使用配置文件或代码来定义所需的基础架构,并以编程方式创建基础架构以确保一致性和可重复性。通过 IaC,开发者还可以管理资源的生命周期,比如可以在版本控制存储库中托管基础架构的定义,同时在基础设计及代码的定义修改中可以利用与应用程序代码协调的持续集成和持续部署 (CI/CD),使环境(开发、测试、生产等)与 IaC 代码更改同步。此外,在出现故障时可以自动回滚,并具有漂移检测功能以识别与预期状态的差异。

在云上,开发者可以使用云开发套件 Cloud Development Kit (CDK) 以 Python、Java 和 Typescript 等语言对其基础设施进行建模。CDK 提供了称为构造 Constructs 的高级组件,这些组件使用被验证的默认值预配置云资源。CDK 还允许开发者根据组织的要求编写和共享自己的自定义结构,从而加快新项目的进度。

1 使用 CDK CLI 新建项目

使用 cdk init 新建一个 TypeScript CDK 项目。创建了文件夹结构并安装 TypeScript CDK 项目所需的一些必要模块。

mkdir -p ~/environment/quickstart
cd ~/environment/quickstart
cdk init --language typescript

2 使用 EKS Blueprints 创建 EKS 集群

EKS Blueprints 可帮助开发者构建完整的 EKS 集群。通过 EKS Blueprints 将 EKS 环境所需状态的配置(例如控制平面、工作节点和 Kubernetes 附加组件)描述为 IaC 蓝图。配置蓝图后,开发者可以使用它通过持续部署自动化来消除跨多个亚马逊云科技账户和区域的一致环境。同时,开发者可以使用 EKS Blueprints通过 Amazon EKS 插件以及各种流行的开源插件轻松引导 EKS 集群,包括 Prometheus、Karpenter、Nginx、Traefik、Amazon Load Balancer Controller、Fluent Bit、Keda 、ArgoCD 等。EKS Blueprints 还可以实施来自同一个集群多个团队运行操作工作负载所需的相关安全控制。

执行以下代码,安装项目的依赖:

npm install @aws-quickstart/eks-blueprints@1.3.0 typescript@~4.8.4 --save

左滑查看更多

打开 lib/quickstart-stack.ts 编写 EKS Blueprints 代码:

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as blueprints from '@aws-quickstart/eks-blueprints';
import { KubernetesVersion } from 'aws-cdk-lib/aws-eks';

export class QuickstartStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);
    const account = props?.env?.account!;
    const region = props?.env?.region!;

    const clusterProvider = new blueprints.GenericClusterProvider({
      version: KubernetesVersion.V1_23,
      managedNodeGroups: [
        {
          id: "default-ng",
          desiredSize: 2,
          minSize: 1,
          maxSize: 2,
        }
      ]
    });

    const cluster = blueprints.EksBlueprint.builder()
      .clusterProvider(clusterProvider)
      .account(account)
      .region(region)
      .addOns(
        new blueprints.AwsLoadBalancerControllerAddOn,
      )
      .teams();
  }
}

左滑查看更多

在上述代码中,我们创建了一个 EKS 集群,定义了它的 NodeGroup,并且添加了 AwsLoadBalancerController 插件。

最佳实践

我们建议通过 clusterProvider 自定义集群参数,通过 EKS Blueprints 内置的 addOns 添加插件。

虽然利用 CDK 命令行工具部署一个堆栈很方便,但我们建议设置自动 Pipeline,负责部署和更新 EKS 基础设施。这样更方便使用框架的代码管道堆栈在不同地区部署开发测试和生产环境。

CodePipelineStack 是一种持续交付 Amazon CDK 应用程序的结构。每当将 Amazon CDK 应用程序的源代码上传 Git 时,堆栈可以自动构建、测试和部署新版本。如果添加了应用程序阶段或堆栈,也会自动重新配置自身以部署这些新阶段或堆栈。

最佳实践

把基础设施通过 CDK 代码定义,使用 Pipeline 管理多集群的变更,也是 GitOps 理念的一种落地形式。

随后我们可以执行 cdk deploy 命令,部署该堆栈。

cdk deploy

完成集群部署后,查询信息

kubectl get ns

看到输出如下:

最后通过命令查看 Amazon Application Load balancer 是否成功安装:

kubectl get pod -n kube-system

查看输出,确认 Amazon Application Load balancer 部署成功:

3 小结

以上内容我们介绍了 IaC 的概念,并且通过使用 CDK 创建了一个自定义 EKS 集群,同时安装了 Amazon Application Load balancer 插件,为后续访问微服务的 web 页面提供了前置条件:

  • 通过 cdk init 初始化 CDK 项目
  • 通过 EKS Blueprint 快速定义 EKS 集群,同时添加 Amazon Application Load balancer 插件

在 Amazon EKS 集群上部署 Flux CD

Flux CD 是一个持续交付工具。Weaveworks 最初开发了该项目,然后将其开源到 CNCF。它成功的原因是它可以感知 Kubernetes 变化并且易于设置。它提供的最亮点的功能是,它允许团队以声明方式管理其 Kubernetes 部署。Flux CD 通过定期轮询存储库来将存储在源代码存储库中的 Kubernetes manifests 文件与 Kubernetes 集群同步, 因此团队无需担心运行 kubectl 命令和监视环境以查看他们是否部署了正确的工作负载。Flux CD 确保 Kubernetes 集群始终与源代码存储库中定义的配置保持同步。

1 Flux 客户端安装

Flux CLI 是所有平台的二进制可执行文件,可以从 GitHub 发布页面下载:

curl -s https://fluxcd.io/install.sh | sudo bash
. <(flux completion bash)

左滑查看更多

2 准备 Amazon CodeCommit 凭证

创建用户,我们实验中使用 CodeCommit 作为 Git 源,需要 Amazon CodeCommit 的 HTTPS Git 凭证:

aws iam create-user --user-name BuildingModernCodeCommitUser
aws iam attach-user-policy --user-name BuildingModernCodeCommitUser --policy-arn arn:aws:iam::aws:policy/AWSCodeCommitPowerUser
aws iam create-service-specific-credential --user-name BuildingModernCodeCommitUser --service-name "codecommit.amazonaws.com" >> ~/environment/credential.json

左滑查看更多

把生成的 Amazon CodeCommit 的 HTTPS Git 凭证保存到 credential.json 文件:

3 在集群上安装 Flux

Clone 准备好的 GitOps 代码:

cd ~/environment
git clone codecommit::us-west-2://gitops
cd gitops

左滑查看更多

项目结构如下:

最佳实践

该项目结构是我们推荐的一种,我们把 flux 相关资源分为了基础设施层(infrastructure)、集群管理层(clusters)和应用层(apps)。我们通过 Kustomization (base、overlays)实现了多集群部署的支持。

使用 flux bootstrap 命令在 Kubernetes 集群上安装 flux,并将其配置为从 Git 存储库管理自己。如果集群上存在 Flux 组件,则引导命令将在需要时执行升级。引导程序是幂等的,可以安全地运行命令任意次数。用 Amazon CodeCommit 的 HTTPS Git 凭证替换下面命令中的 username 和 password。

flux bootstrap git \
  --url=https://git-codecommit.us-west-2.amazonaws.com/v1/repos/gitops \
  --username=__替换成Git凭证_username_ \
  --password=__替换成Git凭证_password__ \
  --token-auth=true \
  --path="./clusters/dev-cluster" \
  --components-extra=image-reflector-controller,image-automation-controller

左滑查看更多

注意: 启用镜像自动更新功能,bootstrap Flux 时需要加上 --components-extra=image-reflector-controller,image-automation-controller 参数。

用 git pull 查询引导程序提交的更新,会看到 Git 仓库 clusters/dev-cluster/flux-system 目录下会新增 3 个文件:

  • gotk-components.yaml:定义了 Flux 的 6 个 controller,分别是:helm、kustomize、source、notification、image-automation、image-reflector。
  • gotk-sync.yaml:Flux 的 Git 源,集群中的 Source Controller 会监听 gitops 仓库的代码变更,并执行相应的变更。
  • kustomization.yaml:多集群配置

通过命令 flux get kustomizations –watch 检查 Flux 是否安装成功,输出类似:

通过命令:kubectl -n flux-system get pod,services 检查 flux-system 部署的组件,输出如下:

4 小结

在这一部分我们使用 flux bootstrap 命令在 Kubernetes 集群上安装 flux,并且介绍最重要的 3 个配置文件 gotk-components.yaml,gotk-sync.yaml 和 kustomization.yaml:

  • Flux 客户端安装
  • 创建 IAM 用户,并且创建 CodeCommit 凭证
  • 在 Amazon EKS 集群安装 Flux,并且启用镜像自动更新功能

使用 GitOps 工具 FluxCD 实现管理云环境下的 Amazon EKS 集群的微服务自动发布,本文详细实践了 GitOps 流水线的前两个部分。在下一篇文章中,我们将继续分享:

  1. 利用 Flux CD 部署 GitOps 工作流;
  2. 利用 GitOps 工作流实现基于镜像的自动部署;

请持续关注 Build On Cloud 微信公众号,了解更多面向开发者的技术分享和云开发动态!

往期推荐

Generative AI 新世界

亚马逊的开源文化

开发者生态

文章作者

郑予彬

亚马逊云科技资深开发者布道师

20 年 ICT 行业和数字化转型实践积累,专注于亚马逊云科技云原生、云安全技术领域。18 年架构师经验,致力于为金融、教育、制造以及世界 500 强企业用户提供数据中心建设以及软件定义数据中心等解决方案的咨询及技术落地。

 

 

阙铭飞

亚马逊云科技大中华区解决方案研发中心-解决方案架构师

任职亚马逊云科技大中华区解决方案研发中心-解决方案架构师,负责解决方案研发工作。到目前为止有 10 年的工作经验,主要涉及大数据、DevOps、容器化等相关工作。

文章来源:https://dev.amazoncloud.cn/column/article/642ea6f6a199f057d9f145f9?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=CSDN 

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

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

相关文章

2023年新课标I卷作文,5位人工智能考生(ChatGPT,文心一言,GPT4, ChatGLM-6b, ChatT5)来写作,看谁写得最好

大家好&#xff0c;我是微学AI&#xff0c;今天是2023年6月7日&#xff0c;一年一度的高考又来了&#xff0c;今年的高考作文题也新鲜出炉。今年是特殊的一年&#xff0c;有人说2023是AI的元年&#xff0c;这一年里有大语言模型的爆发&#xff0c;每天都有大模型的公布&#xf…

23年测试岗,测试工程师从初级到中高级进阶,测试晋升之路...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 调查显示&#xf…

【旋转摆正验证码】移动积分兑换影视会员活动旋转摆正验证码识别——识别解绝方法

移动积分兑换影视会员活动旋转验证码的0~200ms级小模型识别思路 具体讲解识别思路 移动积分兑换影视会员活动拖动旋转验证码被破解&#xff1f;当代流行的人机验证到底安不安全&#xff1f; 提示&#xff1a;以下是皆为学习交流之&#xff0c;如有侵权 &#xff0c;望通知删帖…

年内BEV落地之战:华为遥遥领先,还是蔚小理登上王座?

作者 | 张祥威 编辑 | 德新 落地城市NOA&#xff0c;是今年最重磅的自动驾驶大战。而BEV感知&#xff0c;目前看来是 通往城市NOA的必经之路。 年内落地BEV&#xff0c;已经是国内自动驾驶头部玩家的共识。 其实&#xff0c;BEV是很早就提出的算法&#xff0c;又称鸟瞰图或上帝…

R730调整风扇转速

整整一个月没有写文章了&#xff0c;一是因为最近太忙&#xff0c;有点休息的时间就想躺着&#xff1b;二是买了Tesla P40显卡&#xff0c;想写个安装教程&#xff0c;结果快一个月了&#xff0c;安装还是失败。 大家如果谁懂在R730的ESXi上&#xff0c;用直通方式安装Tesla&am…

MMPretrain代码课

安装注意事项 训练时需要基于算法库源码进行开发&#xff0c;所以需要git clone mmpretrain仓库。如果只调用&#xff0c;则pip install 即可。 from mmpretrain import get_model, list_models,inference_model分别用于模型的获取、例举、推理 此时还没加载预训练权重 tor…

Redis-Cluster集群架构

Redis-Cluster 1.哨兵模式和redis-cluster模式的区别 哨兵模式的问题&#xff1a;1.只有一个master节点可以提供写的操作&#xff0c;qps 最多10w&#xff0c;对于高并发特别高的大型互联网系统 ​ 2.单节点不会内存太大&#xff0c;内存很大会给主节点造成压力&#xff0c;…

如何用数据资产管理,解锁数据新价值

数字经济和数字化转型的发展有什么共通点吗&#xff1f;这个问题的答案也很明显&#xff0c;数据就是数字经济数字化转型的基础&#xff0c;也是推动两者快速发展的核心要素。数字化时代&#xff0c;数据已经成为了个人、机构、企业乃至国家的重要战略资产&#xff0c;所以如何…

CnOpenData数字经济专利及引用被引用数据

一、数据简介 自人类社会进入信息时代以来&#xff0c;数字技术的快速发展和广泛应用衍生出数字经济。与农耕时代的农业经济、工业时代的工业经济大有不同&#xff0c;数字经济是一种新的经济、新的动能、新的业态&#xff0c;并引发了社会和经济的整体性深刻变革。现阶段&…

Nginx网络服务——页面优化与安全

Nginx网络服务——优化与防盗链 一、Nginx的网页优化1.Nginx的网页压缩2.Nginx的图片缓存3.Nginx的连接超时设置4.Nginx的并发设置 二、Nginx的页面安全1.查看Nginx版本的方式2.隐藏版本号 三、Nginx的日志分割1.编写日志分割脚本2. 执行脚本进行测试3. 将日志脚本添加至计划性…

InnoDB - 行格式

文章目录 InnoDB - 行格式1. 什么是行格式2. 四种行格式3. Compact行格式 InnoDB - 行格式 1. 什么是行格式 我们平时是以行记录为单位向表中插入数据的&#xff0c;这些数据在磁盘上的存放方式被称为行格式或者记录格式。 InnoDB引擎中支持四种行格式&#xff1a;Compact、…

Java8 Stream详解及中间操作方法使用示例(一)

Java 8 引入了 Stream API&#xff0c;提供了一种新的处理集合和数组的方式。Stream API 可以让我们更加便捷、灵活地处理数据&#xff0c;尤其是大规模数据。在这里&#xff0c;我将详细介绍 Java 8 中的 Stream API。 什么是 Stream Stream 是 Java 8 中引入的一个新的概念&…

vs2022配置pcl1.13.1

下载 下载PCL预编译安装程序PCL-1.13.1-AllInOne-msvc2022-win64.exe 和要安装的PCL组件&#xff08;例如pcl-1.13.1-pdb-msvc2022-win64.zip&#xff09; 安装 双击 PCL-1.13.1-AllInOne-msvc2022-win64.exe进行安装。到图1的步骤时&#xff0c;选择第二项。 图1 下一步&am…

串口助手(布局,图标,串口号,隐藏界面,显示实时时间)

文章目录 前言一、串口助手布局二、设置软件的标题&#xff0c;图标三、显示可用串口号四、隐藏&#xff0c;显示面板五、显示实时时间总结 前言 从这篇文章开始 教大家自己制作一个串口助手软件&#xff0c;并实现基本的功能。学做一个 串口助手可以一边回顾复习 QT 的相关知…

《面试1v1》G1垃圾回收器

我是 javapub&#xff0c;一名 Markdown 程序员从&#x1f468;‍&#x1f4bb;&#xff0c;八股文种子选手。 《面试1v1》 连载中… 面试官&#xff1a; G1垃圾收集器?听说很牛逼的样子! 候选人&#xff1a; 是的,G1是JDK9默认的垃圾收集器,代替了CMS收集器。它的目标是达到…

4.运算符|Java学习笔记

文章目录 运算符介绍算术运算符关系运算符&#xff08;比较运算符&#xff09;逻辑运算符赋值运算符三元运算符位运算符 运算符优先级Java命名规范关键字保留字 进制十进制转&#xff08;二/八/十六进制&#xff09;原码、反码、补码 运算符介绍 运算符是一种特殊的符号&#…

【Linux】认识Linux下的编译器gcc/g++ | 认识动静态库

本文思维导图&#xff1a; 文章目录 前言tips: 关于前两篇文章所提到的sudo指令 一、gcc/g编译器的认识和使用tips 1.预处理2. 编译3.汇编4.链接关于预编译&#xff0c;编译&#xff0c;汇编阶段的指令记忆方法 二、gcc/g指令汇总三、认识动静态库1.库的认知库的命名规则静态库…

C++ ---- 继承

目录 继承概念及定义 继承概念 继承定义 语法 继承关系和访问限定符 继承基类成员访问方式的变化 规律总结 以公有继承为例测试 基类和派生类对象赋值转换 继承中的作用域 派生类的默认成员函数 构造函数 析构函数 拷贝构造 赋值重载 继承与友元 继承与静态成员…

ESP8266调用NTP服务器进行时间校准

一、背景知识 【1】什么是NTP服务器&#xff1f; NTP是网络时间协议&#xff08;Network Time Protocol&#xff0c;简称NTP&#xff09;&#xff0c;是一种用于同步计算机时间的协议。NTP服务器指的是提供NTP服务的计算机或设备。NTP服务器的主要功能是保证网络上的所有设备…

Linux下信号量使用总结

目录 1.Linux下信号量简介 2.POSIX信号量 2.1 无名信号量 2.2 有名信号量 3.System V信号量 1.Linux下信号量简介 信号量是解决进程之间的同步与互斥的IPC机制&#xff0c;互斥与同步关系存在的症结在于临界资源。 临界资源是在同一个时刻只容许有限个&#xff08;一般只有…