云基础设施正在迅速成熟起来,使得企业能够利用新架构和服务以及运行在Amazon Elastic Container Service (Amazon ECS)上的应用程序。基础设施团队发现他们在使用AWS CloudFormation等工具管理传统云环境,同时还在管理 Amazon ECS 或 Kubernetes 等托管的容器本机系统。
为了弄清此功能和复杂性提高的情况,用户转而使用 GitOps 及和等工具来管理其工作流程。这样一来,组织可以采用自行决定的工作流程来编写和部署应用程序,但这些应用程序必须特定于该环境或平台。
这便是Crossplane项目的用武之地。Crossplane 基于许可证发布,支持从对复杂的应用程序和基础设施进行定义、部署和管理。Crossplane 使用 Kubernetes API 明确定义、部署和管理云基础设施,包括 SaaS 服务。Crossplane 的功能可以包含在 CI/CD 管道中,从而提供一种单一方法来定义和部署任何资源,无论该资源在 Kubernetes 本机上还是属于托管服务的组件。
在本文中,我们将说明如何使用 Crossplane 和 Argo CD 来通过Amazon Relational>
先决条件
要设置部署管道,我们需要在“控制”Kubernetes 集群中安装 Crossplane 和 Argo CD。控制集群与“引导”集群的概念相似,但不同之处在于,它在“引导”集群创建完成后继续对其进行管理。从控制集群中,我们可以预置更多的 Kubernetes 集群,将应用程序部署到这些集群中,并且能对应用程序将使用的托管服务进行部署。虽然公开 Kubernetes API 的任何计算服务都适合我们的使用案例,我们仍选择将Amazon Elastic Kubernetes Service (Amazon EKS)用于控制集群。
Argo CD 可使我们从任何托管的 Git 存储库中进行持续部署。在本文中,我们将使用 GitHub,以及公开存储库和已经存在于之上的基础设施。如果您想使用自己的存储库,或者希望从现有存储库的分支来进行部署,您将需要 GitHub 账户。
最后,使用分发 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-alphainstall 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
NAMEREADYSTATUSRESTARTSAGE
crossplane-65bdd6599c-sxtr91/1Running02m26s
crossplane-stack-manager-5556749f76-9zvl41/1Running02m26s
stack-aws-578bt0/1Completed02m18s
stack-aws-858b7b8bb9-v2cz61/1Running02m1s
复制代码
我们还希望将 AWS 凭证加载到控制集群中,以便 Crossplane 能够代表我们预置基础设施。Crossplane 文件中包含丰富的文档,介绍如何添加 AWS 凭证。但是我们打算在此教程中创建两个单独的 AWS
提供商
对象:一个用于在中预置资源,另一个用于。这两个对象都可以引用同一个账户,但字段应不同。
要创建凭证,请运行以下命令(假设使用
默认
配置文件):
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
name: aws-account-creds
namespace: crossplane-system
type: Opaque
credentials: ${BASE64ENCODED_AWS_ACCOUNT_CREDS}
apiVersion: aws.crossplane.io/v1alpha3
kind: Provider
name: aws-provider-west
credentialsSecretRef:
name: aws-account-creds
namespace: crossplane-system
key: credentials
region: us-west-2
apiVersion: aws.crossplane.io/v1alpha3
kind: Provider
name: aws-provider-east
credentialsSecretRef:
name: aws-account-creds
namespace: crossplane-system
key: credentials
region: us-east-1
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复制代码要在您的本地计算机上查看 Argo CD UI,您可以从 Amazon EKS 集群进行端口转发:
kubectl port-forward svc/argocd-server -n argocd 8080:443
复制代码请注意,Argo CD 使用自签名证明,可能需要在本地主机上启用不安全的连接来利用端口转发功能。
现在,如果您导航至localhost:8080
,您应该能够查看 Argo CD UI。初次登录时,用户名为,密码为 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 可使应用程序以与基础设施无关的方式部署,我们将同时在和预置基础设施,然后将 WordPress 部署到每一个基础设施。要开始,我们可以通过启动 UI、登录并转至设置
|项目
|新项目
来设置 ArgoCD 项目。您可以按照您认为合适的方式配置您的项目,但如果您打算在长期生产场景下运行,最简单的方法是授予对此教程最高级别的访问权并缩小范围。重要的是,您至少必须将您打算使用的所有 Crossplane 集群范围对象类型加入白名单。此外,您必须至少启用in-cluster
作为目标。
Argo CD 附带一个默认
项目,具有完整的权限,为了简单起见,我们将在整个教程中使用该项目:
现在,我们已经配置一个项目,我们希望着手预置我们的基础设施。在 Argo CD 中,使用术语应用程序
指代应作为一个单位部署的一组配置文件。应用程序使您可以为配置文件指定源存储库,然后再根据观察到的变化监视 Kubernetes 集群中的更新和创建或更新对象。
如前所述,我们已经在GitHub 存储库中为本教程定义了我们的基础设施。如果您查看了目录,您将发现和的子目录。这些目录中的配置文件在两个不同区域中指定相同的基础设施,包括从 VPC 到 Amazon EKS 集群的一切。有些资源用于以统计方式在 AWS 上预置资源(例如,在创建 Kubernetes 对象时立即创建外部资源),另一些是用于动态预置的类别(例如,创建一个可用于稍后以抽象方式预置资源的配置)。您可以在Crossplane 文档中阅读有关静态和动态预置的更多信息。
要创建我们的基础设施应用程序
,请转至应用程序
|新应用程序
并设置源
以指向存储库的目录。目的地
应设置为,表示我们打算在安装了 Crossplane 和 Argo CD 的相同 Kubernetes 集群中创建这些资源。应用程序的完整配置应如下所示:
点击创建
,您应该能够通过点击应用程序来查看每个资源及其状态。您将注意到,我们在每个区域创建 VPC,并为这些 VPC 创建子网和网络组件,并且在每个 VPC 中预置 Amazon EKS 集群。如果为凭证被用于账户凭证的账户转至 AWS 控制台,您应看到这些资源在其各自控制面板中创建。
我们对argo-west-cluster
和argo-east-cluster
的准备情况特别感兴趣,它们是我们在每个区域中创建的 Amazon EKS 集群的申明。Crossplane 中的申明指的是用作抽象请求以具体实施托管服务的 Kubernetes 对象。
在本例中,申明argo-west-cluster
和argo-east-cluster
指的是通过EKSCluster
满足的KubernetesCluster
申明。我们可以像其他提供商提供的托管 Kubernetes 产品一样来轻松满足这些申明。此过程可能需要一些时间,但如对它们进行完全预置,Crossplane 将能够在每个集群上计划我们的应用程序。您将在它们做好准备后看到 Argo CD UI 中的每个集群的相应和KubernetesTarget
:
在 us-west-2 中部署应用程序
我们首先将在Amazon EKS 集群中部署我们的应用程序,即 WordPress 博客。为执行此操作,请创建一个新的 Argo CD 应用程序,目前将源
指向目录。
创建时,我们应立即看到两个资源正在创建:KubernetesApplication
和MySQLInstance
。KubernetesApplication
对象指定我们希望部署到Amazon EKS 集群中的资源。您将在/app-1/kubernetesapplication.yaml
文件中找到命名空间
、部署
和服务
的模板。它们是在 Kubernetes 中运行面向公众的 WordPress 博客的必要 Kubernetes 组件,但我们还需要一个数据库来支持应用程序。虽然我们可以在集群中运行 MySQL 数据库,利用 Amazon RDS 之类的托管服务可使我们将此责任交给有经验的云提供商。/app-1/mysqlinstanceclaim.yaml
为 MySQL 数据库定义申明,该申明将由我们作为基础设施部署的一部分创建的RDSInstanceClass
满足。
创建这些资源可使 Crossplane 预置 Amazon RDS 实例、获取连接信息,然后将实例注入 WordPress 应用程序中,之后再将该应用程序部署到中的 Amazon EKS 集群。当此过程完成时,您应该看到与MySQLInstance
相关的 Argo CD UI 中显示。
不久之后,您应该能够点击wordpress-west-service
KubernetesApplicationResource
并在 YAML 清单底部看到主机名称。
复制并粘贴到您的浏览器后,您应进入 WordPress 设置页面。
在 us-east-1 中部署应用程序
能够将应用程序与其相关基础设施的申明一起部署非常有价值,但此模型真正的强大之处在于其便携性。为了进行演示,我们将在另一个区域中部署相同的应用程序配置。
在此教程中,我们将使用指向目录的源
来创建新的 Argo CD 应用程序。然而,如果您是存储库的拥有者,您只需将KubernetesApplication
上的targetSelector
更改为app: wordpress-east
,将MySQLInstance
申明上的classSelector
更改为region: east
即可修改我们用于的配置。事实上,如果您对两个应用程序目录进行比较,您将发现,除了上述更改外,配置几乎相同。
为我们的WordPress 应用程序创建 Argo CD 应用程序之后,我们应在wordpress-east-service KubernetesApplicationResource
上再一次看到主机名称。导航至该地址,您将看到 WordPress 设置页面。
清理
要清理所有的已部署应用程序和基础设施组件,您可以简单地删除我们创建的每个 Argo CD 应用程序。所有的 AWS 基础设施组件及其相应的 Kubernetes 资源都将从集群中删除。
小结
Crossplane 项目可使基础设施拥有者使用 Kubernetes API 以标准化方式定义它们的自定义云资源,包括托管服务。该操作反过来可使应用程序开发人员以抽象方式编写工作负载,以便可以部署到任何位置,并且可以明确进行管理。
欢迎参与
Crossplane.io 项目是完全是开源的,我们非常欢迎您加入社区,帮助我们塑造云计算的未来。在和加入我们,收看两周一次的直播“The Binding Status”,并在上关注该项目。
Dan Mangum 是 Upbound 的软件工程师,主要负责该公司的开源 Crossplane 项目。他还是 Kubernetes 发行团队的成员,是 Kubernetes 项目及其他多个开源项目的积极贡献者。他是两周一次的直播“The Binding Status”的主播,这档节目专注于扩展 Kubernetes、构建 Crossplane 和塑造云计算的未来。请关注他的 Twitter@hasheddan。
原文链接: