亚马逊AWS官方博客

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

本文是 Upbound 的软件工程师 Dan Mangum 写的一篇客座博文。

云基础设施正在迅速成熟起来,使得企业能够利用新架构和服务以及运行在 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 区域。

说明如何使用 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 时,可以通过以下命令完成此操作:

kubectl create namespace crossplane-system
helm repo add crossplane-alpha https://charts.crossplane.io/alpha
helm 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:

$ kubectl get pods -n crossplane-system
NAME                                        READY   STATUS      RESTARTS   AGE
crossplane-65bdd6599c-sxtr9                 1/1     Running     0          2m26s
crossplane-stack-manager-5556749f76-9zvl4   1/1     Running     0          2m26s
stack-aws-578bt                             0/1     Completed   0          2m18s
stack-aws-858b7b8bb9-v2cz6                  1/1     Running     0          2m1s

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

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

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: v1
kind: Secret
metadata:
  name: aws-account-creds
  namespace: crossplane-system
type: Opaque
data:
  credentials: ${BASE64ENCODED_AWS_ACCOUNT_CREDS}
---
apiVersion: aws.crossplane.io/v1alpha3
kind: Provider
metadata:
  name: aws-provider-west
spec:
  credentialsSecretRef:
    name: aws-account-creds
    namespace: crossplane-system
    key: credentials
  region: us-west-2
---
apiVersion: aws.crossplane.io/v1alpha3
kind: Provider
metadata:
  name: aws-provider-east
spec:
  credentialsSecretRef:
    name: aws-account-creds
    namespace: crossplane-system
    key: credentials
  region: us-east-1
EOF

kubectl apply -f "aws-credentials.yaml"

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

secret/aws-account-creds 已创建
provider.aws.crossplane.io/aws-provider-west 已创建
provider.aws.crossplane.io/aws-provider-east 已创建

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

kubectl create namespace wordpress-app

安装 Argo CD

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

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

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

kubectl port-forward svc/argocd-server -n argocd 8080:443

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

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

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 集群中创建这些资源。应用程序的完整配置应如下所示:

完整配置设置的屏幕截图,包括同步策略和存储库 url

显示目录设置的屏幕截图

点击创建,您应该能够通过点击应用程序来查看每个资源及其状态。您将注意到,我们在每个区域创建 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

屏幕截图,显示在它们做好准备时 Argo CD UI 中每个集群的相应 Secret 和 KubernetesTarget

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

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

屏幕截图,显示我们首先在 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

屏幕截图,显示当此过程完成时,您应该看到与 MySQLInstance 相关的 Argo CD UI 中显示 Secret。

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

屏幕截图,在 YAML 清单对不显示主机名称。

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

登陆 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

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

本博文中的内容和意见属于第三方作者,AWS 不对本博文的内容或准确性负责。