Seal AppManager如何基于Terraform简化基础设施管理

news2025/2/3 21:46:40

作者简介

陈灿,数澈软件Seal 后端研发工程师,曾在腾讯负责敏捷研发体系建设以及 DevOps 解决方案的敏捷实践。在敏捷研发和产品效能提升有着丰富的经验,致力于构建一站式研发友好的平台工程解决方案。现在是 Seal 平台工程团队核心研发人员。

 

平台工程(Platform Engineering)是近几年大火的技术概念,指专注于通过减少现代软件交付的复杂性和不确定性来提高开发人员的生产力的一种软件工程方法。内部开发平台则是平台工程的具体实现之一。本文将结合平台工程的理念介绍 Terraform 的基本概念和使用方法,包括在使用 Terraform 的过程中所面临的一些挑战以及 Seal AppManager 是如何解决这些问题的。
 

什么是内部开发者平台(IDP)

内部开发平台, Internal Development Platform(IDP),是建立在工程团队现有技术工具之上的一个自助服务层。IDP 是一个由平台团队开发的平台,使开发人员能够轻松地配置、部署和启动应用基础设施,无需依赖运维团队。IDP 有助于进一步自动化运维工作流程,并通过简化应用程序配置和基础设施管理来弥补和提升工作效率。同时,IDP 让开发人员拥有更多的自主权,使开发人员从编写代码到软件交付,都能够处理自如。
 

在传统的基础设施部署和管理中,通常会使用手动配置和管理的方式。这意味着管理员需要手动操作服务器、网络设备和存储等基础设施组件,安装和配置软件,以及处理各种依赖关系和环境变化。这种方式需要花费大量的时间和精力,并且容易出现配置错误和不一致性。
 


 

平台工程的首要任务之一是降低开发人员使用基础设施的难度。因为绝大多数的开发人员并不关心底层服务的复杂概念和创建方式,比如开发需要用存储服务,但不关心它们是如何创建的,再如一些专有名词如对象存储、磁盘阵列等,也不属于开发人员的关心范畴。
 

在大多数的业务场景中,开发人员只关注如何使用这些服务、数据是否可以持久化地保存在指定目录中。因此,平台工程完全可以提供一个适应大多数场景的存储服务,开发人员只需要选择自己所需要的服务类型,利用平台工程的能力创建服务,获取服务的地址,即可使用该服务。
 

平台工程通过抽象定义,在服务的基础上抽象出应用这一概念,多个应用可以组合成一个业务场景,应用之间存在显式或者隐式的关系。彼此之间通过这种关系有机地组合成一个完整的业务整体,并对外提供服务。
 


 

什么是 Terraform

Terraform 是一个基础设施即代码(IaC)工具,它允许你安全、高效地构建、改变和更新基础设施。这包括低级别的组件,如计算实例、存储和网络,以及高级别的组件,如 DNS 条目、SaaS 功能等。
 

在 Terraform 诞生之前,基础设施的管理是一个非常繁琐的工作,需要人工操作,而且易出错,而 Terraform 的出现,让基础设施的管理变得简单、高效、可靠。Terraform 特别适合云环境:AWS、GCP、Azure、阿里云等, 通过丰富的 Provider 管理不同类型的资源,一切都像插件一样,可以轻松地扩展。
 

Terraform 采用 HCL 代码管理和维护基础设施资源,并且在运行之前可以通过terraform plan命令可以看到资源的变化,而这些变化是通过 Terraform 的状态文件来管理的。
 

Terraform 的 State(状态)是一个关键概念,用于记录当前基础设施的状态和配置。使用 Terraform 进行部署时,它会跟踪已创建的资源和其配置状态,并将其存储在本地的.tfstate文件中或使用远程存储(如AWS S3、Azure Blob存储)进行管理。
 

State 文件记录了资源的状态,当资源发生变化时,配置状态也会变化。因此,Terraform 支持在部署前预览资源变化而不需要真正的执行。Terrafrom 的配置状态文件可以保存在本地,也支持保存在远程的存储中,如:S3、Consul、gcs、kubernetes 或者其他自定义的 HTTP Backend 中。
 

 

安装 Terraform

 

macOS
 

brew tap hashicorp/tap
brew install hashicorp/tap/terraform

 

Linux Ubuntu
 

wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
sudo apt update && sudo apt install terraform

 

Linux CentOS
 

sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
sudo yum -y install terraform

 

Linux 二进制安装
 
Linux 用户也可以通过二进制的方式安装 Terraform,从官方下载对应的版本。

https://www.terraform.io/downloads.html
 

通过二进制安装 1.4.6 版本的 Terraform:
 

curl -sfL https://releases.hashicorp.com/terraform/1.4.6/terraform_1.4.6_linux_amd64.zip -o /tmp/terraform.zip
unzip /tmp/terraform.zip -d /usr/bin/
rm -f /tmp/terraform.zip

 

Windows
 

windows 用户可以通过 Chocolatey 来安装 Terraform, Chocolatey 是一个 Windows 的包管理器,类似于 Linux 的 yum 或者 apt-get,它可以帮助你快速的安装和卸载软件。
 

choco install terraform

 

或者去 Terraform 官网下载对应的版本,然后解压后配置 PATH 环境变量。最后,通过terraform version命令来验证是否安装成功。
 

Terraform 管理 Kubernetes 资源示例

配置 Kubernetes Provider,通过后~/.kube/config文件来管理 Kubernetes 资源,这里也可以使用其他的 kubeconfig 文件。
 

provider "kubernetes" {
  config_path = "~/.kube/config"
}

 

创建一个 Kubernetes Deployment
 

resource "kubernetes_deployment" "nginx" {
  metadata {
    name = "nginx"
    labels = {
      app = "nginx"
    }
  }

  spec {
    replicas = 1

    selector {
      match_labels = {
        app = "nginx"
      }
    }

    template {
      metadata {
        labels = {
          app = "nginx"
        }
      }

      spec {
        container {
          image = "nginx:latest"
          name = "nginx"
          port {
            container_port = 80
          }
        }
      }
    }
  }
}

 

Kubernetes Deployment 服务
 

resource "kubernetes_service" "nginx" {
  metadata {
    name = "nginx"
  }

  spec {
    selector = {
      app = kubernetes_deployment.nginx.metadata[0].labels.app
    }

    type = "NodePort"

    port {
      port = 80
      target_port = 80
      node_port = 30080
    }
  }
}

 

将上面的配置复制并在目标目录如~/terraform-demo
 

mkdir ~/terraform-demo && cd ~/terraform-demo

 

创建 main.tf 文件,将上述配置复制到 main.tf 并保存,完整的文件配置如下:
 


 

打开终端,进入到目标目录,初始化 Terraform 环境

cd ~/terraform-demo && terraform init

 

 

执行terraform plan来预览资源的变化
 


 

执行terraform apply来创建资源
 


 

最后在浏览器中访问http://localhost:30080即可看到 nginx 的欢迎页面。
 


 

如果想要删除资源,可以执行terraform destroy命令来删除资源。
 

通过上述例子,我们可以看到 Terraform 的管理 Kubernetes 资源非常简单,只需要通过 HCL 语言来描述资源的配置,然后通过terraform apply来创建资源。此外 Terraform 还支持通过terraform import来导入已经存在的资源,这样就可以将已经存在的资源纳入到 Terraform 的中进行管理。
 

Terraform 状态管理

Terraform 通过 HCL 描绘了资源的配置,但它如何知道资源是否已经被创建了呢?资源的新增、修改和删除是如何决定的?它怎样管理资源之间的依赖关系呢?要了解这些问题,就得依赖 Terraform 的状态管理机制了。
 

Terraform 将每次执行基础设施变更操作时的状态信息保存在一个状态(State)文件中,默认情况下会保存在当前工作目录下的terraform.tfstate文件里,依托于状态文件来决定执行资源的变更方式。
 

在上述示例中,可以看到生成的状态(State) 文件中包含所创建的资源,如kubernetes_deploymentkubernetes_service,这与我们编写 HCL 文件的资源也是相对应的,我们所创建的 resource 和 data 资源都会被记录到这个文件。
 

状态(State) 文件中还包含了一些元数据信息,如资源的 ID、资源的属性值等,这些信息都是 Terraform 用来管理资源的重要依据。
 


 

我们知道获取云资源状态常见的方式之一是通过各个平台自身提供的 API 服务来获取,比较 API 资源和配置文件资源的异同来决定创建或者删除资源,而 Terraform 却选择状态(State)文件来管理映射云平台的资源,而不是API 的方式来检查资源是否已经被创建,原因是什么呢?
 

Terraform 采取状态(State)文件的方式的好处有:
 

  1. Terraform 可以直接通过该文件获取创建的云资源状态。对于小型基础设施,Terraform 可以查询并同步所有资源的最新属性,这样在每次 apply 的时候只需要检查资源和状态文件的配置是否一致。如果一致则不需要做任何操作,如果不一致则需要创建、更新或者删除资源。

  2. 通过状态文件可以记录不同资源之间的关系,Terraform 可以通过依赖关系来管理创建或者销毁的顺序。

  3. 另外,对于大型基础设施,查询每个资源的耗时会较长。许多云提供商不提供同时查询多个资源的 API,每个资源的往返时间为数百毫秒。除此之外,云提供商几乎总是有 API 速率限制,因此 Terraform 在一段时间内只能请求一定数量的资源,通过 state 状态管理可以大大提升性能。

  4. 远端的 Backend 可以管理状态文件,这样可以实现多人协作,多人共享同一个状态文件。
     

然而,采用这种方式管理资源并非十全十美,当执行terraform apply时,Terraform 会直接读取 State 文件来判断是否需要创建、更新或者删除资源。如果我们手动删除这个文件,再次执行terraform apply时,Terraform 会认为这是一个全新的环境,从而会重新创建所有的资源,进而导致资源的管控混乱——原先创建的资源就再也没法通过terraform destroy来删除了。因此妥善保管好这个状态文件非常重要,任何时候都不要手动修改或者删除这个文件。
 

细心的你可能会发现,状态(State)文件中的所有信息都是明文的,这意味着如果这个文件泄露,里面包含密码等关键信息都会被泄露,这将会对你的基础设施造成巨大的安全风险。除此之外,如果因设备损坏或者其他因素导致文件损坏,那么 tfstate 所记录的资源信息也会丢失,这样也会导致资源的泄露、管控混乱。
 

因此,Terraform 还提供了一种 Backend 的状态管理方案。这样就可以将状态文件保存在远程的存储中,比如 AWS S3、GCS、HTTP 等,这样就可以避免状态文件被泄露的风险。团队成员之间可以利用 Backend 解决文件存储和共享的问题。
 

使用 Terraform 所面临的挑战

通过上面的示例,我们可以看到 Terraform 管理 Kubernetes 资源非常简单,但是正如前文中提到过的 Terraform 也存在一些问题,这些问题可能会影响到我们对资源管理的使用体验。比如:
 

  • 使用 HCL 语言来描述资源的配置,意味着开发人员需要学习一门新的语言,而且如果想要使用 Terraform 来管理其他资源,比如 AWS、GCP 等,那么就需要学习这些资源的 Provider 的配置,导致学习成本增加。另外一些语法问题也会增加使用的难度。

  • 状态管理问题,Terraform 通过状态文件来管理资源,而状态文件所记录的资源都是明文的。如果状态文件遭受泄露、损坏等情况,会对资源的管控造成巨大的风险。

  • 基础设施资源管理者需要拥有对资源的知识经验,这样才能够正确的配置资源,否则就会导致资源的配置错误导致资源的创建失败,或者资源的配置不符合预期。

  • 大量的资源管控需要编写大量的 HCL 文件,资源的使用者需要花费大量的时间来查找资源和配置文件,管理资源的成本也会随着资源的增加而增加。

  • 资源的状态不能实时获取,如 Kubernetes 的资源状态,查看日志和执行终端等等,这些需要通过其他的方式管理。
     

利用 Seal AppManager 降低管理基础设施难度

Seal AppManager 是一款基于平台工程理念的应用部署管理平台,底层基于 Terraform 技术构建,上周刚刚发布新版本。它可以帮助开发人员和运维快速地搭建一个生产或者测试环境,同时也可以帮助运维人员快速地管理这些环境,通过平台工程的能力解决上述问题。
 

Seal AppManager 可以将资源抽象成服务,利用应用来控制这些服务,进而将资源的底层配置和实际使用分离开,简化基础设施的管理。
 

通过管理多个环境和配置的方法,确保开发、测试和生产环境的一致性,降低错误和不一致的风险,并确保应用程序始终准确运行。
 

由于平台提供控制和治理功能,开发人员还可以确保所使用的环境是安全的,并且符合最佳实践和安全标准。资源的使用者只需要关注资源的使用,而不需要关注资源的底层原理及配置。
 


 

通过定义的资源模版,开发人员无需再关注 HCL 语言的语法,Terraform Provider 参数该如何配置以及基础设施的底层实现是什么原理,只需要通过平台提供的 UI 界面,通过定义好的模块填写参数就可以自助使用资源。这大大降低了开发人员使用资源的难度,提升了整体的开发效率。
 

除此之外,Terraform 的状态管理的不便之处也得到了解决。Seal AppManager 平台通过将状态文件保存在 HTTP Backend 远端,这样就可以避免状态文件被泄露的风险。不同的服务之间会自动管理所属的状态,这样团队成员之间可以利用 Backend 解决状态存储和共享的问题。
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/762083.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

配置spark

配置spark Yarn 模式Standalone 模式Local 模式 Yarn 模式 tar -zxvf spark-3.0.0-bin-hadoop3.2.tgz -C /opt/module cd /opt/module mv spark-3.0.0-bin-hadoop3.2 spark-yarn修改 hadoop 配置文件/opt/module/hadoop/etc/hadoop/yarn-site.xml, 并分发 <!--是否启动一…

【板栗糖GIS】——如何安装ffmpeg

【板栗糖GIS】——如何安装ffmpeg 目录 1. 解压安装包 2. 把bin路径放在环境变量中 3. 检测是否安装成功 下载软件包&#xff0c;我已经准备好资源&#xff0c;只是审核还未通过&#xff0c;过两天会加上安装包链接 1. 解压安装包 2. 把bin路径放在环境变量中 3. 检测是否…

Anaconda安装和激活

一、Anaconda下载地址 https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/?CM&OD 说明&#xff1a;使用paddlepaddle需要先安装python环境&#xff0c;这里我们选择python集成环境Anaconda工具包 Anaconda是1个常用的python包管理程序安装完Anaconda后&#xff0c…

面试经验分享 | 如何打造优秀的个人简历

月説小飞象交流会 一个人自身拥有越丰富&#xff0c;他对身外之物的需求也就越少&#xff0c;别人对他来说就越不重要。 内部交流│27期 面试经验分享| 打造优秀的个人简历 data analysis ●●●● 分享人&#xff1a;夏宇 暑假将至&#xff0c;毕业季来临&#xff0c;有准备实…

timing报告中的半周期现象

遇到phase shift是半个周期的问题多数是endpoint寄存器是下降沿触发的原因,举例来说,一个正向时钟周期的开始是0-1的跳变,下一个周期的开始也是如此,所以计算上升沿触发的寄存器的周期就是完整的周期值,而下降沿触发的寄存器就要在半周期也就是1-0的时候触发跳变,phase s…

评分高达92.6%!谷歌AI医疗大模型重磅论文登上《自然》:水平媲美临床医生

“AI医生”&#xff0c;离我们越来越近了。 7月12日&#xff0c;谷歌和DeepMind的科研人员在《自然》杂志上发表了一项研究&#xff0c;不仅提出了MultiMedQA&#xff08;美国医师执照试题&#xff09;评估基准&#xff0c;用于评估大语言模型在编码临床知识方面的表现&#x…

【技能实训】DMS数据挖掘项目-Day12

文章目录 任务14【任务14.1】类ClientFrame【任务14.1.1】在构造函数中定义组件属性【任务14.1.2】补充initConfig()方法的代码&#xff0c;获取客户端配置信息【任务14.1.4】菜单界面的初始化方法【任务14.2】在14.1的基础上&#xff0c;实现日志数据与物流数据的采集功能 任务…

安全开发-PHP应用文件管理模块显示上传黑白名单类型过滤访问控制文件管理模块包含上传遍历写入删除下载安全

文章目录 文件管理模块-上传-过滤机制文件管理模块-显示-过滤机制PHP文件操作安全文件包含文件上传文件删除文件下载文件编辑 文件管理模块-上传-过滤机制 $_FILES&#xff1a;PHP中一个预定义的超全局变量&#xff0c;用于在上传文件时从客户端接收文件&#xff0c;并将其保存…

基于 OpenVINO 的目标识别

基于 OpenVINO 的目标识别 YOLOV5原理 YOLOv5是一种快速高效的目标检测算法&#xff0c;具有优秀的实时性能和较高的准确度。该算法利用深度学习技术实现了端到端的目标检测&#xff0c;在计算资源有限的情况下也能够获得出色的表现 YOLOv5采用了一种基于Anchor的检测方式&…

广西电网:筑牢数字化安全根基,推动新型能源体系建设

广西电网是南方电网的全资子公司&#xff0c;是广西地区内资产规模数一数二的特大型企业。一直以来&#xff0c;广西电网都积极探索深化数字化绿色化协同&#xff0c;深入推进数字电网建设&#xff0c;构建新型电力系统和新型能源体系。 国家政策提出要求 以安全保障数字纽带 …

postman常用操作说明

环境变量 环境变量就是我们存放一组公共数据的地方&#xff0c;比如我有100个接口&#xff0c;三套环境(开发环境、测试环境、生产环境)&#xff0c;我们没有必要把这100个接口根据三个环境分别写一套用例。只需要维护一套用例脚本&#xff0c;然后设置对应三个环境的变量就行…

抗性宏基因组揭秘人和动物共享ARG以及ARG的转移能力

抗生素耐药性&#xff08;Antibiotic Resistance&#xff09;是全球日益严重的公共卫生问题&#xff0c;随着“同一健康”概念的提出&#xff0c;人们更追求人、动物和环境的最佳健康。动物服用抗生素后会在其内脏中产生抗药细菌&#xff0c;并留在动物体内&#xff0c;最终可能…

MIT 6.829 -- Lecture 1: Packet Switching

MIT 6.829 -- Lecture 1: Packet Switching 引言InterconnectionsCircuit SwitchingPacket SwitchingDatagram routingSource routingVirtual circuits An example&#xff1a;LAN SwitchingLearning bridgesThe Solution&#xff1a;Spanning TreesVirtual LANs Summary 本课程…

PS图层混合模式超详细解答-图层混合模式的原理(Part1)

PS图层混合模式超详细解答-图层混合模式的原理 ☕ 前言 本教程非常详细&#xff0c;请用心看完 本教程如果有如何问题&#xff0c;欢迎评论区留言讨论 本教程为了避免冗余&#xff0c;一些不必要的截图就省略了 本教程只讨论8bit的情形下的混合 未经许可&#xff0c;不可转…

3.7 Bootstrap 导航栏

文章目录 Bootstrap 导航栏响应式的导航栏导航栏中的表单导航栏中的按钮导航栏中的文本结合图标的导航链接组件对齐方式固定到顶部固定到底部静态的顶部反色的导航栏 Bootstrap 导航栏 导航栏是一个很好的功能&#xff0c;是 Bootstrap 网站的一个突出特点。导航栏在您的应用或…

详解GPT技术发展脉络

文章目录 前言关于本篇的分享内容大语言模型大模型语言模型 百花齐放TransformerAuto-RegressiveResnetLayer-NormMaskScaled Dot-Product AttentionMulti-Head AttenionSelf-AttentionPositional Encoding关于并行计算关于长程依赖Transformer演化 GPT SeriesGPT-1GPT-2GPT-3 …

STM32存储左右互搏 I2C总线读写EEPROM AD24C02

STM32存储左右互搏 I2C总线读写EEPROM AD24C02 在较低容量存储领域&#xff0c;EEPROM是常用的存储介质&#xff0c;不同容量的EEPROM的地址对应位数不同&#xff0c;在发送字节的格式上有所区别。EEPROM是非快速访问存储&#xff0c;因为EEPROM按页进行组织&#xff0c;在连续…

数据库查询速度上不去的查询和分析

主要原因 数据库查询速度上不去、阻塞是指在并发访问 MySQL 数据库时,某个事务占用了资源并且长时间不释放,导致其他事务无法执行或执行缓慢的情况。MySQL 阻塞可能会导致数据库性能下降,甚至出现死锁等问题,需要马上进行处理。在 MySQL中,线程阻塞可能是由于以下原因导致…

vite 启动项目 报错 spawnargs: [ ‘--service=0.12.15‘, ‘--ping‘ ]

当前项目使用的是 vue3-antd-admin 框架 vue3-antd-admin 框架 详细地址 我们运行项目的时候发现报以下错误&#xff0c;npm i 了也不行, node:events:504throw er; // Unhandled error event^Error: spawn C:\Users\DELL\Desktop\vue3-antd-admin-master\node_modules\esbu…

阿里国际、敦煌、速卖通、沃尔玛、TEMU做测评补单核心关键点,看完你就会了

现在不管是做国内电商还是跨境电商&#xff0c;测评补单一直都有人在做&#xff0c;也确确实实的给卖家们带来了突破&#xff0c;不管是订单&#xff0c;留评&#xff0c;权重等等都有很大的提升&#xff0c;可以说有电商的地方就有测评补单&#xff0c;这是刚需。但是就像前人…