GitOps 是目前比拟现实的办法来实现基于 Kuberentes 集群的继续部署。
理解了 GitOps 的概念以及 CI/CD 流水线的架构,接下来咱们将通过以下四个模块逐渐实现构建 CI/CD 流水线的最佳实际:
- 通过 IaC 部署云基础架构;
- 在 Amazon EKS 集群上部署 Flux CD;
- 利用 Flux CD 部署 GitOps 工作流;
- 利用 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 流水线的前两个局部。在下一篇文章中,咱们将持续分享:
- 利用 Flux CD 部署 GitOps 工作流;
- 利用 GitOps 工作流实现基于镜像的主动部署;
请继续关注 Build On Cloud 微信公众号,理解更多面向开发者的技术分享和云开发动静!
往期举荐
Generative AI 新世界
亚马逊的开源文化
开发者生态
文章作者
郑予彬
亚马逊云科技资深开发者布道师
20 年 ICT 行业和数字化转型实际积攒,专一于亚马逊云科技云原生、云平安技术畛域。18 年架构师教训,致力于为金融、教育、制作以及世界 500 强企业用户提供数据中心建设以及软件定义数据核心等解决方案的征询及技术落地。
阙铭飞
亚马逊云科技大中华区解决方案研发核心 - 解决方案架构师
任职亚马逊云科技大中华区解决方案研发核心 - 解决方案架构师,负责解决方案研发工作。到目前为止有 10 年的工作教训,次要波及大数据、DevOps、容器化等相干工作。
文章起源:https://dev.amazoncloud.cn/column/article/642ea6f6a199f057d9f…