写点什么

使用开源的 Crossplane 将 AWS 托管服务连接到 Argo CD 管道

  • 2020-03-13
  • 本文字数:5248 字

    阅读完需:约 17 分钟

使用开源的 Crossplane 将 AWS 托管服务连接到 Argo CD 管道

云基础设施正在迅速成熟起来,使得企业能够利用新架构和服务以及运行在 Amazon Elastic Container Service (Amazon ECS) 上的应用程序。基础设施团队发现他们在使用 AWS CloudFormation 等工具管理传统云环境,同时还在管理 Amazon ECS 或 Kubernetes 等托管的容器本机系统。


为了弄清此功能和复杂性提高的情况,用户转而使用 GitOps 及 Argo CDFlux CD 等工具来管理其工作流程。这样一来,组织可以采用自行决定的工作流程来编写和部署应用程序,但这些应用程序必须特定于该环境或平台。


这便是 Crossplane 项目的用武之地。Crossplane 基于 Apache 2.0 许可证发布,支持从 kubectl 对复杂的应用程序和基础设施进行定义、部署和管理。Crossplane 使用 Kubernetes API 明确定义、部署和管理云基础设施,包括 SaaS 服务。Crossplane 的功能可以包含在 CI/CD 管道中,从而提供一种单一方法来定义和部署任何资源,无论该资源在 Kubernetes 本机上还是属于托管服务的组件。


在本文中,我们将说明如何使用 Crossplane 和 Argo CD 来通过 Amazon Relational Database Service (Amazon RDS) 将一个简单的应用程序部署到两个 AWS 区域。


先决条件

要设置部署管道,我们需要在“控制”Kubernetes 集群中安装 Crossplane 和 Argo CD。控制集群与“引导”集群的概念相似,但不同之处在于,它在“引导”集群创建完成后继续对其进行管理。从控制集群中,我们可以预置更多的 Kubernetes 集群,将应用程序部署到这些集群中,并且能对应用程序将使用的托管服务进行部署。虽然公开 Kubernetes API 的任何计算服务都适合我们的使用案例,我们仍选择将 Amazon Elastic Kubernetes Service (Amazon EKS) 用于控制集群。


Argo CD 可使我们从任何托管的 Git 存储库中进行持续部署。在本文中,我们将使用 GitHub,以及公开存储库和已经存在于 GitHub 之上的基础设施。如果您想使用自己的存储库,或者希望从现有存储库的分支来进行部署,您将需要 GitHub 账户。


最后,使用 Helm 分发 Crossplane。为了轻松安装 Crossplane 和必要的提供商,必须安装 Helm。我们将使用 Helm 3 安装 Crossplane,但使用旧版 Helm 的说明可参见 Crossplane 安装文档


开始之前,请确保您已完成以下全部操作:


安装并设置 Crossplane

要在 AWS 上部署托管服务,我们必须在 Amazon EKS 集群中安装 Crossplane 和提供商 AWS。使用 Helm 3 时,可以通过以下命令完成此操作:


Bash


kubectl create namespace crossplane-systemhelm repo add crossplane-alpha https://charts.crossplane.io/alphahelm install crossplane --namespace crossplane-system crossplane-alpha/crossplane --version 0.8.0 --set clusterStacks.aws.deploy=true --set clusterStacks.aws.version=v0.6.0 --disable-openapi-validation
复制代码


完成安装后,您应该可以在 crossplane-system 命名空间中看到以下四个 pod:


Bash


$ kubectl get pods -n crossplane-systemNAME                                        READY   STATUS      RESTARTS   AGEcrossplane-65bdd6599c-sxtr9                 1/1     Running     0          2m26scrossplane-stack-manager-5556749f76-9zvl4   1/1     Running     0          2m26sstack-aws-578bt                             0/1     Completed   0          2m18sstack-aws-858b7b8bb9-v2cz6                  1/1     Running     0          2m1s
复制代码


我们还希望将 AWS 凭证加载到控制集群中,以便 Crossplane 能够代表我们预置基础设施。Crossplane 文件中包含丰富的文档,介绍如何添加 AWS 凭证。但是我们打算在此教程中创建两个单独的 AWS 提供商对象:一个用于在 us-west-2 中预置资源,另一个用于 us-east-1。这两个对象都可以引用同一个账户 Secret,但 region 字段应不同。


要创建凭证 Secret,请运行以下命令(假设使用默认配置文件):


Bash


BASE64ENCODED_AWS_ACCOUNT_CREDS=$(echo -e "[default]\naws_access_key_id = $(aws configure get aws_access_key_id --profile default)\naws_secret_access_key = $(aws configure get aws_secret_access_key --profile default)" | base64  | tr -d "\n")
cat > aws-credentials.yaml <<EOF---apiVersion: v1kind: Secretmetadata: name: aws-account-creds namespace: crossplane-systemtype: Opaquedata: credentials: ${BASE64ENCODED_AWS_ACCOUNT_CREDS}---apiVersion: aws.crossplane.io/v1alpha3kind: Providermetadata: name: aws-provider-westspec: credentialsSecretRef: name: aws-account-creds namespace: crossplane-system key: credentials region: us-west-2---apiVersion: aws.crossplane.io/v1alpha3kind: Providermetadata: name: aws-provider-eastspec: credentialsSecretRef: name: aws-account-creds namespace: crossplane-system key: credentials region: us-east-1EOF
kubectl apply -f "aws-credentials.yaml"
复制代码


完成这些步骤后,您应该会看见以下资源创建:


Bash


secret/aws-account-creds 已创建provider.aws.crossplane.io/aws-provider-west 已创建provider.aws.crossplane.io/aws-provider-east 已创建
复制代码


最后,创建一个新的命名空间,以用于本指南剩余部分中创建的资源:


Bash


kubectl create namespace wordpress-app
复制代码

安装 Argo CD

Argo CD 可以使用以下命令安装:


Bash


kubectl create namespace argocdkubectl apply -n argocd -f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
复制代码


要在您的本地计算机上查看 Argo CD UI,您可以从 Amazon EKS 集群进行端口转发:


Bash


kubectl port-forward svc/argocd-server -n argocd 8080:443
复制代码


请注意,Argo CD 使用自签名证明,可能需要在本地主机上启用不安全的连接来利用端口转发功能。


现在,如果您导航至 localhost:8080,您应该能够查看 Argo CD UI。初次登录时,用户名为 admin,密码为 Argo CD API 服务器的 pod 名称。要查找您生成的 pod 名称,请运行以下命令:


Bash


kubectl get pods -n argocd -l app.kubernetes.io/name=argocd-server -o name | cut -d'/' -f 2</code
复制代码


有关更多信息,请查看 Argo CD 入门指南

部署基础设施

由于 Crossplane 可使应用程序以与基础设施无关的方式部署,我们将同时在 us-west-2us-east-1 预置基础设施,然后将 WordPress 部署到每一个基础设施。要开始,我们可以通过启动 UI、登录并转至设置 | 项目 | 新项目来设置 ArgoCD 项目。您可以按照您认为合适的方式配置您的项目,但如果您打算在长期生产场景下运行,最简单的方法是授予对此教程最高级别的访问权并缩小范围。重要的是,您至少必须将您打算使用的所有 Crossplane 集群范围对象类型加入白名单。此外,您必须至少启用 in-cluster 作为目标。


Argo CD 附带一个默认项目,具有完整的权限,为了简单起见,我们将在整个教程中使用该项目:



现在,我们已经配置一个项目,我们希望着手预置我们的基础设施。在 Argo CD 中,使用术语应用程序指代应作为一个单位部署的一组配置文件。应用程序使您可以为配置文件指定源存储库,然后再根据观察到的变化监视 Kubernetes 集群中的更新和创建或更新对象。


如前所述,我们已经在 GitHub 存储库中为本教程定义了我们的基础设施。如果您查看了 infra/ 目录,您将发现 us-west-2us-east-1 的子目录。这些目录中的配置文件在两个不同区域中指定相同的基础设施,包括从 VPC 到 Amazon EKS 集群的一切。有些资源用于以统计方式在 AWS 上预置资源(例如,在创建 Kubernetes 对象时立即创建外部资源),另一些是用于动态预置的类别(例如,创建一个可用于稍后以抽象方式预置资源的配置)。您可以在 Crossplane 文档中阅读有关静态和动态预置的更多信息。


要创建我们的基础设施应用程序,请转至应用程序 | 新应用程序并设置以指向存储库的 infra/ 目录。目的地应设置为 https://kubernetes.default.svc,表示我们打算在安装了 Crossplane 和 Argo CD 的相同 Kubernetes 集群中创建这些资源。应用程序的完整配置应如下所示:




点击创建,您应该能够通过点击应用程序来查看每个资源及其状态。您将注意到,我们在每个区域创建 VPC,并为这些 VPC 创建子网和网络组件,并且在每个 VPC 中预置 Amazon EKS 集群。如果为凭证被用于账户凭证 Secret 的账户转至 AWS 控制台,您应看到这些资源在其各自控制面板中创建。


我们对 argo-west-clusterargo-east-cluster 的准备情况特别感兴趣,它们是我们在每个区域中创建的 Amazon EKS 集群的申明。Crossplane 中的申明指的是用作抽象请求以具体实施托管服务的 Kubernetes 对象。


在本例中,申明 argo-west-clusterargo-east-cluster 指的是通过 EKSCluster 满足的 KubernetesCluster 申明。我们可以像其他提供商提供的托管 Kubernetes 产品一样来轻松满足这些申明。此过程可能需要一些时间,但如对它们进行完全预置,Crossplane 将能够在每个集群上计划我们的应用程序。您将在它们做好准备后看到 Argo CD UI 中的每个集群的相应 SecretKubernetesTarget


在 us-west-2 中部署应用程序

我们首先将在 us-west-2 Amazon EKS 集群中部署我们的应用程序,即 WordPress 博客。为执行此操作,请创建一个新的 Argo CD 应用程序,目前将指向 /app-1 目录。




创建时,我们应立即看到两个资源正在创建:KubernetesApplicationMySQLInstanceKubernetesApplication 对象指定我们希望部署到 us-west-2 Amazon EKS 集群中的资源。您将在 /app-1/kubernetesapplication.yaml 文件中找到命名空间部署服务的模板。它们是在 Kubernetes 中运行面向公众的 WordPress 博客的必要 Kubernetes 组件,但我们还需要一个数据库来支持应用程序。虽然我们可以在集群中运行 MySQL 数据库,利用 Amazon RDS 之类的托管服务可使我们将此责任交给有经验的云提供商。/app-1/mysqlinstanceclaim.yaml 为 MySQL 数据库定义申明,该申明将由我们作为基础设施部署的一部分创建的 RDSInstanceClass 满足。


创建这些资源可使 Crossplane 预置 Amazon RDS 实例、获取连接信息,然后将实例注入 WordPress 应用程序中,之后再将该应用程序部署到 us-west-2 中的 Amazon EKS 集群。当此过程完成时,您应该看到与 MySQLInstance 相关的 Argo CD UI 中显示 Secret



不久之后,您应该能够点击 wordpress-west-service KubernetesApplicationResource 并在 YAML 清单底部看到主机名称。



复制并粘贴到您的浏览器后,您应进入 WordPress 设置页面。


在 us-east-1 中部署应用程序

能够将应用程序与其相关基础设施的申明一起部署非常有价值,但此模型真正的强大之处在于其便携性。为了进行演示,我们将在另一个区域 us-east-1 中部署相同的应用程序配置。


在此教程中,我们将使用指向 /app-2 目录的来创建新的 Argo CD 应用程序。然而,如果您是存储库的拥有者,您只需将 KubernetesApplication 上的 targetSelector 更改为 app: wordpress-east,将 MySQLInstance 申明上的 classSelector 更改为 region: east 即可修改我们用于us-west-2 的配置。事实上,如果您对两个应用程序目录进行比较,您将发现,除了上述更改外,配置几乎相同。


为我们的 us-east-1 WordPress 应用程序创建 Argo CD 应用程序之后,我们应在 wordpress-east-service KubernetesApplicationResource 上再一次看到主机名称。导航至该地址,您将看到 WordPress 设置页面。

清理

要清理所有的已部署应用程序和基础设施组件,您可以简单地删除我们创建的每个 Argo CD 应用程序。所有的 AWS 基础设施组件及其相应的 Kubernetes 资源都将从集群中删除。

小结

Crossplane 项目可使基础设施拥有者使用 Kubernetes API 以标准化方式定义它们的自定义云资源,包括托管服务。该操作反过来可使应用程序开发人员以抽象方式编写工作负载,以便可以部署到任何位置,并且可以明确进行管理。

欢迎参与

Crossplane.io 项目是完全是开源的,我们非常欢迎您加入社区,帮助我们塑造云计算的未来。在 SlackGitHub 加入我们,收看两周一次的直播“The Binding Status”,并在 Twitter 上关注该项目。


Dan Mangum

Dan Mangum 是 Upbound 的软件工程师,主要负责该公司的开源 Crossplane 项目。他还是 Kubernetes 发行团队的成员,是 Kubernetes 项目及其他多个开源项目的积极贡献者。他是两周一次的直播“The Binding Status”的主播,这档节目专注于扩展 Kubernetes、构建 Crossplane 和塑造云计算的未来。请关注他的 Twitter @hasheddan


本文转载自 AWS 技术博客。


原文链接:https://amazonaws-china.com/cn/blogs/china/connecting-aws-managed-services-to-your-argo-cd-pipeline-with-open-source-crossplane/


2020-03-13 17:27799

评论

发布
暂无评论
发现更多内容

数字经济时代下,区块链如何助力数字产业发展?

旺链科技

区块链 分布式存储 数字经济

浪潮云说丨如何对多云进行统一运营

浪潮云

云计算

handler内存泄露,已成功拿下字节、腾讯、脉脉offer

欢喜学安卓

android 程序员 面试 移动开发

关于单元测试的那些事儿,Mockito 都能帮你解决

华为云开发者联盟

测试 Mockito Mock Java 开发 模拟测试框架

网络攻防学习笔记 Day82

穿过生命散发芬芳

网络攻防 7月日更

支持60+数据传输链路,华为云DRS链路商用大盘点

华为云开发者联盟

华为云 DRS

Pandas高级教程之:自定义选项

程序那些事

Python 数据挖掘 数据分析 pandas 程序那些事

架构实战营模块2课后作业

hello

架构实战营

图计算之开局女朋友跑了

Zhuan

图算法 图计算 networkX GraphScope

Rust从0到1-面向对象编程-Trait 对象

rust oop 面向对象编程 Trait Objects Trait 对象

痛苦调优10小时,我把 Spark 脚本运行时间从15小时缩短到12分钟!

小拍Piper

scala spark 计算机 spark-shell spark-env

音视频的这些功能你知道吗?

anyRTC开发者

音视频 屏幕共享 智能降噪

Discourse 云平台安装

HoneyMoose

主存中存储单元地址的分配

朱华

计算机组成原理 计算机专业

Vue进阶(九十五):addEventListener() 监听事件

No Silver Bullet

Vue 事件监听 7月日更

小程序开发教程,2021Android开发现状分析

欢喜学安卓

android 程序员 面试 移动开发

从京东零售云走出来的3D数字人正在触动未来的互动世界

Go语言:参数传递中,值、引用及指针之间的区别

微客鸟窝

Go 语言

在线XML转HTML工具

入门小站

工具

BSC币安智能链挖矿模式开发

获客I3O6O643Z97

分布式存储 币安智能链

flutter开发工具,细数Android开发者的艰辛历程

欢喜学安卓

android 程序员 面试 移动开发

回帖送大奖 『和AI在一起』

百度大脑

人工智能 活动 大奖

深度分享|金融行业模型管理效能提升的规划与思考

索信达控股

大数据 金融科技 金融 风险管理 营销管理

JAVA语言异步非阻塞设计模式(应用篇)

有道技术团队

后端 网易有道

互操作性和去信任化的两难困境,到底需要治标还是治本?

CECBC

Vue进阶(七十九):应用 postMessage 实现父子跨域通信

No Silver Bullet

Vue 跨域 7月日更 跨域通信

大数据获取客户系统软件开发源码

获客I3O6O643Z97

大数据

大数据精准营销APP系统开发源码搭建

获客I3O6O643Z97

大数据 抖音霸屏

PancakeSwap交易所市值管理机器人开发

Geek_23f0c3

市值管理机器人开发 PancakeSwap交易所 交易所机器人

鉴释首席运营官赵科林:质量第一思维模式

鉴释

代码 安全编码

Python OpenCV 图像的双线性插值算法,全网最细致的算法说明

梦想橡皮擦

Python 7月日更

使用开源的 Crossplane 将 AWS 托管服务连接到 Argo CD 管道_开源_亚马逊云科技 (Amazon Web Services)_InfoQ精选文章