DevOps - 基础设施

DevOps 基础设施是现代软件开发和运营的基础。它可以帮助团队协同工作、轻松扩展和自动执行任务。主要思想是混合使用工具、方法和实践,以便在整个软件流程中更好地处理基础设施。

当开发和运营团队协同工作时,手动工作就会减少。它还使流程更快、更可靠。这样,我们可以提供质量更好的应用程序。

DevOps 中的基础设施是什么?

在 DevOps 中,基础设施是指我们创建、部署和运行应用程序所需的资源。这些资源可以是物理的、虚拟的或基于云的。它们包括 −

  • 服务器 − 运行应用程序的机器(物理或虚拟)或容器。
  • 网络 −用于数据传输、平衡负载和连接服务的设置。
  • 存储 − 文件存储、数据库和数据处理工具等系统。
  • 工具和服务 − 用于自动执行任务、监控系统、管理 CI/CD 管道和设置配置的平台。

DevOps 将基础设施视为代码。这意味着我们可以像使用基础设施即代码 (IaC) 管理应用程序代码一样管理它。 IaC 确保一切都一致且易于重复或扩展。

DevOps 基础设施的关键原则

下表重点介绍了 DevOps 基础设施的关键原则 −

原则 描述
自动化 我们自动执行设置、配置和扩展资源等任务。这节省了时间并减少了错误。Terraform 或 Ansible 等工具可帮助我们每次都创建相同的设置。
可扩展性和弹性 我们设计可自动处理工作负载变化的系统。使用云平台,我们可以根据需要轻松添加或删除资源。
不变性 我们不会更改现有的基础设施,而是在更新期间替换容器等部件。这使事情保持一致和可预测。
版本控制 我们使用 Git 等工具跟踪基础设施变化。这使得管理和在需要时回滚更改变得更加容易。
监控和可观察性 Prometheus 和 Grafana 等工具可帮助我们随时关注系统的健康和性能。
设计安全 安全性从一开始就融入到我们的工作流程中。我们使用秘密管理和自动合规性检查等技术来保证系统的安全。

基础设施即代码 (IaC):端到端示例

基础设施即代码 (IaC) 帮助我们使用代码管理和设置基础设施。它用自动化取代了手动工作。这使事情变得一致、易于扩展和可重复。Terraform、AWS CloudFormation 或 Ansible 等工具通常用于 IaC。

IaC 与 DevOps 管道配合良好。它支持持续交付,并让我们可以像使用代码一样跟踪基础设施中的变化。

分步示例:使用 Terraform 配置 Web 服务器

先决条件

首先,在您的机器上安装 Terraform。接下来,设置一个 AWS 账户并使用凭证配置 aws-cli。

目录结构

像这样排列项目文件 −

/iac-example
  ├── main.tf
  ├── variables.tf
  ├── outputs.tf

定义变量 (variables.tf)

此文件可帮助我们灵活地进行设置 −

variable "region" {
   description = "AWS region"
   default     = "us-east-1"
}
variable "instance_type" {
   description = "EC2 instance type"
   default     = "t2.micro"
}

配置资源 (main.tf)

我们在此定义基础设施 −

provider "aws" {
   region = var.region
}
resource "aws_instance" "web" {
   ami           = "ami-0c02fb55956c7d316" # Amazon Linux 2 AMI
   instance_type = var.instance_type
   tags = {
      Name = "TerraformExampleWebServer"
   }
   provisioner "remote-exec" {
      inline = [
         "sudo yum update -y",
         "sudo yum install -y httpd",
         "sudo systemctl start httpd",
         "sudo systemctl enable httpd"
      ]
   }
}
resource "aws_security_group" "web_sg" {
   name_prefix = "web-sg-"
   ingress {
      from_port   = 80
      to_port     = 80
      protocol    = "tcp"
      cidr_blocks = ["0.0.0.0/0"]
   }
   egress {
      from_port   = 0
      to_port     = 0
      protocol    = "-1"
      cidr_blocks = ["0.0.0.0/0"]
   }
}

输出信息 (outputs.tf)

设置后显示重要详细信息−

output "instance_public_ip" {
   value = aws_instance.web.public_ip
}

执行 Terraform 工作流

运行这些命令来创建基础设施 −

terraform init # 初始化 Terraform 环境
terraform plan # 查看执行计划
terraform apply # 应用更改

验证设置

运行 terraform apply 后,Terraform 将为您提供 EC2 实例的公共 IP。在浏览器中打开 IP 以检查 Web 服务器是否正常运行。

此示例展示了如何使用 Terraform 在 AWS 上设置一个简单的 Web 服务器。IaC 简化了现代基础设施管理。它帮助我们更快更好地开展 DevOps 实践。

云基础设施

云基础设施是通过互联网提供存储、网络和计算能力等计算资源所需的硬件和软件的组合。

AWS、Microsoft Azure 和 Google Cloud Platform (GCP) 等云服务提供商管理此基础设施。借助云基础设施,我们可以随时访问资源,而无需物理硬件。它具有可扩展性、灵活性,并且可以按需工作。

公有云、私有云和混合云

公有云 − 公有云由 AWS、Azure 或 GCP 等第三方公司管理。他们通过互联网提供资源。在公有云中,许多组织使用相同的基础设施。这使得它便宜、可扩展且易于使用,采用即用即付模式。示例包括 Amazon EC2 和 Microsoft Azure 虚拟机。

私有云 −私有云专用于一个组织。它可以在本地或由第三方提供商托管。与公共云相比,这种类型的云提供了更好的安全性、更多的控制和定制。但是,它可能更昂贵。私有云非常适合需要高数据隐私的行业。

混合云 − 混合云结合了公共云和私有云。这允许数据和应用程序在两者之间移动。混合模型很灵活。它允许企业使用公共云的可扩展性,同时将敏感数据保留在私有云中。这有助于管理工作负载、安全性和合规性

使用 AWS / GCP / Azure 进行基础设施管理

以下每个云平台都有自己的优势。最佳选择取决于我们的需求、我们当前的设置和业务需求。

AWS(亚马逊网络服务)

AWS 提供许多服务,如计算(EC2)、存储(S3)和数据库(RDS、DynamoDB)。它还提供 CloudFormation 和 AWS OpsWorks 等工具来实现自动化。AWS 提供托管服务,如用于 Web 应用的 AWS Elastic Beanstalk 和用于无服务器计算的 AWS Lambda。

GCP(谷歌云平台)

GCP 适用于机器学习、分析和人工智能。主要工具包括用于虚拟机的 Google Compute Engine、用于容器的 Google Kubernetes Engine (GKE) 和 Google Cloud Storage。GCP 对于使用 BigQuery 等工具进行数据分析特别有用。

Microsoft Azure

Azure 是微软的云平台。它提供计算(Azure 虚拟机)、存储(Azure Blob 存储)和网络(Azure 虚拟网络)。 Azure 与 Microsoft 软件配合良好。它还支持使用 Azure Arc 的混合云设置。许多使用 Microsoft 工具的企业更喜欢 Azure。

云基础设施的高级概念

下表重点介绍了云基础设施的一些高级概念 −

概念 要点 解释
CI/CD 管道基础设施 使用 Jenkins、GitLab CI 或 ArgoCD 构建 CI/CD 管道 Jenkins 帮助使用插件实现构建和部署自动化。GitLab CI 连接版本控制和 CI/CD。 ArgoCD 用于使用 GitOps 进行 Kubernetes 原生持续部署。
在管道中自动部署基础设施 借助 Terraform 和 CloudFormation 等 IaC 工具,我们可以自动部署基础设施,确保其在 CI/CD 管道中一致且可重复。
DevOps 基础设施中的网络 管理虚拟网络和子网 虚拟网络 (VNet) 创建隔离的云环境。子网将这些网络拆分成更小的部分以管理流量并提高安全性。
负载均衡器和流量路由 负载均衡器在服务器之间共享流量,确保可用性。路由通过以智能方式引导流量来帮助提高应用程序性能。
实施服务网格(Istio、Linkerd) Istio 和 Linkerd 等服务网格管理微服务之间的通信,无需更改应用程序代码即可提供流量管理、安全性和可观察性。
基础设施中的安全性 将基础设施作为代码进行保护 我们使用 Checkov 或 Sentinel 等工具验证 IaC 脚本。这有助于在部署前执行安全规则并避免错误。
使用 Vault 进行机密管理 Vault 安全地存储敏感数据,如 API 密钥和密码。它加密并动态管理机密,适合 CI/CD 工作流以实现安全的凭证管理。
DevSecOps:将安全性集成到管道中 我们在 CI/CD 管道早期使用 Snyk 和 Aqua Security 等工具添加安全实践。这些工具会在构建或部署期间扫描代码以查找漏洞。
扩展基础设施 水平与垂直扩展 水平扩展增加了更多实例以共享负载。垂直扩展为现有机器增加了更多资源(CPU/RAM)。水平扩展提供了更好的灵活性和冗余性。
使用 Kubernetes 和云工具自动扩展基础设施 Kubernetes 和云服务(AWS、GCP、Azure)根据需求自动扩展资源,有助于提高性能和资源利用率。
扩展时的成本优化 为了优化成本,我们可以选择合适大小的实例、使用 Spot 实例并启用自动扩展。这有助于平衡成本和性能。
灾难恢复和备份 DevOps 基础设施的备份解决方案 AWS Backup 和 Azure Backup 等备份工具可保存数据和配置。这些备份确保我们可以在故障期间恢复数据。
在故障转移场景中自动恢复 Route 53 和 Cloud DNS 等工具有助于在故障期间自动恢复。它们最大限度地减少停机时间,确保系统保持平稳运行。
基础设施测试和验证 单元测试 IaC 脚本 单元测试有助于在部署之前验证 IaC 脚本的正确性。 Terraform 等工具会检查和规划脚本,以确保它们按预期工作。
使用 Test Kitchen 和 Terratest 等工具 Test Kitchen 和 Terratest 通过部署基础设施、运行测试和检查其是否正常工作来自动测试 IaC。
混沌工程测试弹性 混沌工程使用 Chaos Monkey 等工具引入受控故障,以检查基础设施的弹性并确保其从中断中恢复。

结论

在本章中,我们研究了现代基础设施管理的关键部分。我们介绍了设置 CI/CD 管道、网络、安全、扩展、灾难恢复和基础设施测试。 Jenkins、GitLab CI 和 ArgoCD 等工具可帮助我们轻松实现管道自动化。我们还讨论了负载平衡、服务网格和云扩展如何提高性能并保持可用性。

我们还讨论了使用 DevSecOps 和 Vault 等实践来保护基础设施。为了确保一切保持弹性,我们讨论了使用混沌工程和自动恢复。通过理解和使用这些想法,我们可以构建强大、可扩展且安全的基础设施,以支持持续交付、安全性和平稳运营。