使用 Argo CD 和 OCI Kubernetes Engine 部署 GitOps

本文介绍了使用 Argo CD 和 Oracle Cloud Infrastructure Kubernetes Engine 部署 GitOps 的基础架构。

GitOps 是 CI/CD 的一种风格,它使用 Git 资源库作为单一信息源来提供基础设施即代码。它主张将应用程序的全部内容,从源代码和应用程序的配置,以声明方式放在 Git 存储库中。这提供了一种一致的方式来部署对应用程序配置的更改,并通过使用熟悉的 Git 工作流(例如拉入请求和合并请求)提供版本控制。

使用 GitOps 原则可确保:
  • 应用程序开发的标准工作流。
  • 提高了提前设置应用需求的安全性。
  • 通过 Git 提高可见性和版本控制可靠性。
  • 在任何集群、任何云和任何内部部署环境中保持一致。
Argo CD 是专为 Kubernetes 构建的声明式连续交付工具。通过 Argo CD,Kubernetes 配置通过对 Github 存储库的更改来统一创建。这使 Git 资源库成为 Kubernetes 集群中提供的所有应用程序配置的单一信息源。Argo CD 使用拉取模型,该模型检查 Git 存储库中的更改,无论更改源是什么。这些更改可以来自 CI 管道,也可以是开发人员或管理员的手动配置。这样可以分离 CI/CD 管道。由于 CI 是用于构建代码,因此它更适合由开发人员维护,而 CD 是 Ops 团队的关注点。两者之间的分离使每个团队可以相互独立地对 CI / CD 管道进行修改。

最佳做法是为应用程序源代码和配置设置单独的 Git 资源库,因为配置更改通常不需要更改应用程序源代码。使用不同的系统信息库,可以在不触发 CI 构建的情况下更改应用程序配置。

Argo CD 支持以下格式的 Kubernetes 配置:
  • Kubernetes 清单
  • Helm 图表
  • 定制清单。
对于 Argo CD 管理的应用程序,将持续监视应用程序的实时状态配置。它与 Git 系统信息库中指定的所需状态进行比较。如果实时状态偏离所需状态,Argo CD 将将应用程序标识为 OutOfSync ,然后从 Git 系统信息库中提取配置并应用更改。

体系结构

此体系结构显示 OCI Kubernetes Engine 集群,在其自己的名称空间中部署了 Argo CD 工具。

您可以通过其 Web UI 或 Argo CD 命令行界面访问 Argo CD 应用程序。与 Argo CD 工具的连接由 OCI Kubernetes Engine 集群中部署的负载平衡器服务提供。部署 Argo CD 后,您可以将其配置为与内部或外部托管的 Git 存储库同步到 Oracle Cloud Infrastructure,前提是 OCI Kubernetes Engine 集群在所需的端口和 Git 存储库的身份证明上具有 IP 连接。Argo CD 与系统信息库同步后,系统信息库中对应用程序配置的任何更新都将应用于 OCI Kubernetes Engine 集群。如果对 Git 资源库之外的应用程序进行了更改,Argo CD 将考虑应用程序不同步并恢复更改,以便与 Git 资源库的所需状态保持一致。

下图说明了此引用体系结构。

下面是 argocd.png 的说明
插图 argocd.png 的说明

argocd-oracle.zip

此体系结构由以下几部分组成:
  • Tenancy

    Oracle Autonomous Transaction Processing 是一个自我驱动、自我保护和自我修复的数据库服务,针对事务处理工作负载进行了优化。您不需要配置或管理任何硬件,或者安装任何软件。Oracle Cloud Infrastructure 可处理数据库创建以及数据库备份、打补丁、升级和调优。

  • 区域

    Oracle Cloud Infrastructure 区域是包含一个或多个数据中心(称为可用性域)的本地化地理区域。地区独立于其他地区,远距离可以把它们分开(跨越国家甚至大陆)。

  • 区间

    区间是 Oracle Cloud Infrastructure 租户中的跨区域逻辑分区。使用区间在 Oracle Cloud 中组织资源、控制对资源的访问并设置使用限额。要控制对给定区间中资源的访问,您可以定义策略来指定谁可以访问资源以及可以执行哪些操作。

  • 可用性域

    可用性域是区域中的独立数据中心。每个可用性域中的物理资源与其他可用性域中的资源隔离,从而提供容错能力。可用性域不共享电源或冷却设备等基础设施,也不共享内部可用性域网络。因此,一个可用性域失败不太可能影响区域中的其他可用性域。

  • 容错域

    容错域是可用性域内的一组硬件和基础设施。每个可用性域都有三个容错域,它们具有独立的电源和硬件。在多个容错域之间分配资源时,应用可以承受容错域内的物理服务器故障、系统维护和电源故障。

  • 虚拟云网络 (VCN) 和子网

    VCN 是您在 Oracle Cloud Infrastructure 区域中设置的可定制软件定义网络。与传统的数据中心网络一样,VCN 允许您完全控制您的网络环境。VCN 可以具有多个不重叠的 CIDR 块,您可以在创建 VCN 后更改这些块。您可以将 VCN 划分为子网,子网可以限定为区域或可用性域。每个子网都包含一系列不与 VCN 中的其他子网重叠的连续地址。可以在创建后更改子网的大小。子网可以是公共子网,也可以是专用子网。

  • 负载平衡器

    Oracle Cloud Infrastructure Load Balancing 服务提供从单个入口点到后端多个服务器的自动流量分配。通过负载平衡器可以访问不同的应用。

  • 代码资料档案库

    在 DevOps 服务中,您可以创建自己的专用代码资料档案库或连接到外部代码资料档案库,例如 GitHub、GitLab 和 Bitbucket 云。

  • 安全列表

    对于每个子网,可以创建安全规则来指定必须允许进出子网的通信的源、目标和类型。

  • NAT 网关

    NAT 网关允许 VCN 中的专用资源访问互联网中的主机,同时不会向传入的互联网连接公开这些资源。

  • 服务网关

    通过服务网关,您可以从 VCN 访问其他服务,例如 Oracle Cloud Infrastructure Object Storage。从 VCN 到 Oracle 服务的流量通过 Oracle 网络结构传输,并且永远不会遍历互联网。

  • Cloud Guard

    您可以使用 Oracle Cloud Guard 监视和维护 Oracle Cloud Infrastructure 中资源的安全性。Cloud Guard 使用检测器配方,您可以定义这些配方来检查资源是否存在安全漏洞,以及监视操作员和用户是否有风险活动。检测到任何配置错误或不安全活动时,Cloud Guard 会根据您可以定义的响应器配方推荐更正操作并协助执行这些操作。

  • 安全区域

    安全区域从一开始就实施加密数据和阻止公共访问整个区间的网络等策略,从而确保 Oracle 的安全优秀实践。安全区域与同名的区间关联,并包括安全区域策略或适用于该区间及其子区间的“配方”。无法将标准区间添加或移动到安全区域区间。

  • 对象存储

    通过对象存储,可以快速访问任意内容类型的大量结构化和非结构化数据,包括数据库备份、分析数据以及图像和视频等丰富内容。您可以安全地存储数据,然后直接从互联网或云平台检索数据。您可以无缝扩展存储,而不会导致性能或服务可靠性下降。将标准存储用于需要快速、立即和频繁访问的“热”存储。将归档存储用于长期保留、很少访问或很少访问的“冷”存储。

  • FastConnect

    Oracle Cloud Infrastructure FastConnect 提供了一种在您的数据中心与 Oracle Cloud Infrastructure 之间创建专用私有连接的简便方式。与基于 Internet 的连接相比,FastConnect 提供了更高的带宽选项和更可靠的网络体验。

  • 本地连接网关 (LPG)

    通过 LPG,您可以在同一区域中将一个 VCN 与另一个 VCN 对等。对等连接意味着 VCN 使用专用 IP 地址进行通信,而流量不会通过互联网或内部部署网络进行路由。

  • 自治数据库

    Oracle Cloud Infrastructure 自治数据库是完全托管的预配置数据库环境,可用于事务处理和数据仓库工作负载。您不需要配置或管理任何硬件,或者安装任何软件。Oracle Cloud Infrastructure 可处理数据库创建以及数据库备份、打补丁、升级和调优。

  • 自治数据仓库

    Oracle Autonomous Data Warehouse 是一个自我驱动、自我保护和自我修复的数据库服务,针对数据仓库工作负载进行了优化。您不需要配置或管理任何硬件,或者安装任何软件。Oracle Cloud Infrastructure 可处理数据库创建以及数据库备份、打补丁、升级和调优。

  • 自治事务处理

    Oracle Autonomous Transaction Processing 是一个自我驱动、自我保护和自我修复的数据库服务,针对事务处理工作负载进行了优化。您不需要配置或管理任何硬件,或者安装任何软件。Oracle Cloud Infrastructure 可处理数据库创建以及数据库备份、打补丁、升级和调优。

  • Exadata DB 系统

    通过 Exadata Cloud Service,您可以利用云端 Exadata 的强大功能。您可以预配灵活的 X8M 系统,以便随着需求的增长将数据库计算服务器和存储服务器添加到系统中。X8M 系统提供 RoCE (RDMA over Converged Ethernet) 网络,支持高带宽和低延迟、持久性内存 (PMEM) 模块以及智能 Exadata 软件。可以使用等效于四分之一机架 X8 系统的配置来预配 X8M 系统,然后在预配后随时添加数据库和存储服务器。

推荐

使用 Argo CD 和 OCI Kubernetes Engine 部署 GitOps 时,请使用以下建议作为起点。您的具体要求可能不同于此处介绍的体系结构。
  • VCN

    创建 VCN 时,请根据您计划附加到 VCN 中子网的资源数量,确定所需的 CIDR 块数和每个块的大小。使用标准专用 IP 地址空间内的 CIDR 块。

    选择与您要设置专用连接的任何其他网络(在 Oracle Cloud Infrastructure 中、您的内部部署数据中心或其他云提供商中)不重叠的 CIDR 块。

    创建 VCN 后,您可以更改、添加和删除其 CIDR 块。

    设计子网时,请考虑流量和安全要求。将特定层或角色中的所有资源附加到可以用作安全边界的同一子网。

    使用区域子网。

  • 安全

    使用 Oracle Cloud Guard 主动监视和维护 Oracle Cloud Infrastructure 中资源的安全性。Cloud Guard 使用检测器配方,您可以定义这些配方来检查资源是否存在安全漏洞,以及监视操作员和用户是否有风险活动。检测到任何配置错误或不安全活动时,Cloud Guard 会根据您可以定义的响应器配方推荐更正操作并协助执行这些操作。

    对于需要最高安全性的资源,Oracle 建议您使用安全区域。安全区域是与 Oracle 定义的基于优秀实践的安全策略配方关联的区间。例如,安全区域中的资源必须无法从公共 Internet 访问,并且必须使用客户管理的密钥对它们进行加密。在安全区域中创建和更新资源时,Oracle Cloud Infrastructure 会根据安全区域配方中的策略验证操作,并拒绝违反任何策略的操作。

  • Cloud Guard

    克隆和定制 Oracle 提供的默认配方,以创建定制检测器和响应器配方。通过这些配方,您可以指定哪种类型的安全违规会生成警告,以及允许对它们执行哪些操作。例如,您可能希望检测可见性设置为公共的对象存储桶。

    在租户级别应用 Cloud Guard,以涵盖最广泛的范围并减轻维护多个配置的管理负担。

    还可以使用“托管列表”功能将某些配置应用于检测器。

  • 安全区域

    克隆和定制 Oracle 提供的默认配方,以创建定制检测器和响应器配方。通过这些配方,您可以指定哪种类型的安全违规会生成警告,以及允许对它们执行哪些操作。例如,您可能希望检测可见性设置为公共的对象存储桶。

    在租户级别应用 Cloud Guard,以涵盖最广泛的范围并减轻维护多个配置的管理负担。还可以使用“托管列表”功能将某些配置应用于检测器。

  • 网络安全组 (NSG)

    可以使用 NSG 定义一组适用于特定 VNIC 的入站和出站规则。我们建议使用 NSG 而非安全列表,因为 NSG 使您能够将 VCN 的子网体系结构与应用的安全要求分开。

    可以使用 NSG 定义一组适用于特定 VNIC 的入站和出站规则。我们建议使用 NSG 而非安全列表,因为 NSG 使您能够将 VCN 的子网体系结构与应用的安全要求分开。

  • 负载平衡器带宽

    创建负载平衡器时,您可以选择提供固定带宽的预定义配置,也可以指定定制(灵活)配置,在其中设置带宽范围并允许服务根据流量模式自动扩展带宽。通过任一方法,您都可以在创建负载平衡器后随时更改配置。

部署

此参考架构的 Terraform 代码作为 Oracle Cloud Infrastructure Resource Manager 中的示例堆栈提供。此示例 Terraform 堆栈部署了 OCI 数据流应用环境以及 IAM 策略和 OCI 对象存储存储桶(而非第三方存储)。默认情况下,还将部署一个 Python Spark 演示应用程序。您还可以从 GitHub 下载代码,并根据您的特定要求对其进行定制。

  • 使用 Oracle Cloud Infrastructure Resource Manager 中的示例堆栈进行部署:
    1. Click 部署到 Oracle Cloud

      如果您尚未登录,请输入租户和用户凭据。

    2. 选择要部署堆栈的区域。
    3. 按照屏幕上的提示和说明创建堆栈。
    4. 创建堆栈后,单击 Terraform 操作,然后选择计划
    5. 等待作业完成,然后查看计划。

      要进行任何更改,请返回到“堆栈详细信息”页,单击编辑堆栈,然后进行所需的更改。然后,再次运行计划操作。

    6. 如果不需要进一步更改,请返回“堆栈详细信息”页面,单击 Terraform 操作,然后选择应用
  • 使用 GitHub 中的 Terraform 代码部署:
    1. 转至 GitHub
    2. 将资料档案库克隆或下载到本地计算机。
    3. 按照 README 文档中的说明进行操作。

除了 GitHub 上提供的 Terraform 代码之外,下面的代码片段还说明了如何连接到 Amazon Web Services S3 以及如何查询数据。

  • 要连接到 S3 并从其查询数据,需要包括 hadoop-aws.jaraws-java-sdk.jar 软件包。可以在 pom.xml 文件中引用这些软件包,如下所示:
    <dependency>
    	<groupId>org.apache.hadoop</groupId>
    	<artifactId>hadoop-aws</artifactId>
    	<version>2.9.2</version>
    	<exclusions>
    	<exclusion>
    		<groupId>org.apache.hadoop</groupId>
    		<artifactId>hadoop-common</artifactId>
    	</exclusion>
    	</exclusions>
    </dependency>
    <dependency>
    	<groupId>com.amazonaws</groupId>
    	<artifactId>aws-java-sdk</artifactId>
    	<version>1.7.4</version>
    </dependency>
  • 使用类似于以下内容的代码连接到 Amazon Web Services S3。您必须提供您的访问密钥和您的密钥。在下面的代码片段中,这些值分别由变量 ACCESSSECRET 表示:
    SparkSession spark = SparkSession.builder().master("local")
    	.config("spark.hadoop.fs.s3a.impl", "org.apache.hadoop.fs.s3a.S3AFileSystem")
    	.config("spark.hadoop.fs.s3a.access.key", ACCESS)
    	.config("spark.hadoop.fs.s3a.secret.key", SECRET)
    	.config("fs.s3a.connection.ssl.enabled", "false")
    	.getOrCreate();
  • 使用与以下内容类似的代码,使用指定的 S3 位置和表名查询数据。
    Dataset<Row> ds = sqlContext.read().format("csv").option("header","true").load("<S3 Location>");
    ds.createOrReplaceTempView("<Table Name>");
    Dataset<Row> result_ds = sqlContext.sql("<SQL Query Using <Table Name>>");

浏览更多

详细了解 Argo CD 以及如何使用它与 OCI Kubernetes Engine 部署 GitOps。

查看以下附加资源:

确认

作者: Chiping Hwang