24、使用 Argo CD 进行 GitOps 部署及微服务变更管理

使用 Argo CD 进行 GitOps 部署及微服务变更管理

1. Argo CD 简介与登录

在之前,我们创建了 Helm 图表,它为我们将微服务部署到 Kubernetes 集群提供了更便捷的方式。Helm 具备向 Kubernetes 集群进行部署的能力,我们已经有足够的条件将航班信息服务部署到暂存环境中。然而,目前的部署方式非常手动,每次部署都需要使用 Helm CLI,并且我们还需要跟踪已部署服务的当前状态和版本,以便在部署仓库更新时确定是否需要进行新的部署。

Argo CD 是一个 GitOps 部署工具,它将 Git 仓库作为工作负载和服务所需部署状态的来源。当它检查我们指定的仓库时,会判断我们定义的目标状态是否与环境中的运行状态匹配。如果不匹配,Argo CD 可以“同步”部署,使其与我们在 Helm 图表中声明的内容一致。

在使用 Argo CD 之前,我们需要登录。具体步骤如下:
- 获取管理员密码 :Argo CD 将默认密码设置为其运行所在的 Kubernetes 对象的名称。运行以下 kubectl 命令查找 Argo CD Pod:

$ kubectl get pods -n "argocd" | grep argocd-server

例如,输出结果可能如下:

NAME                                READY     STATUS    RESTARTS   AGE
msur-argocd-server-c6d4ffcf-9z4c2   1/1       Running   0          51s

将 Pod 的名称复制下来,这将作为我们登录的密码。
- 设置端口转发 :为了访问登录页面并使用我们的凭证,需要设置端口转发规则。运行以下命令:

$ kubectl port-forward svc/msur-argocd-server 8443:443 -n "argocd"

输出结果可能如下:

Forwarding from 127.0.0.1:8443 -> 8080
Forwarding from [::1]:8443 -> 8080
  • 登录 Argo CD :现在可以在浏览器中访问 localhost:8443 。可能会收到一个警告,提示该网站不可信,这是正常的。让浏览器继续访问,你将看到登录屏幕。输入 admin 作为用户 ID,并使用之前记录的密码登录。如果登录成功,你将看到一个仪表盘屏幕。
2. 同步和部署微服务

在 Argo CD 中,需要部署的微服务或工作负载被称为应用程序。要部署航班信息微服务,我们需要创建一个新的“应用程序”,并使用引用我们之前创建的 Git 仓库中 Helm 包的值进行配置。具体步骤如下:
- 创建应用程序 :在仪表盘屏幕上点击“Create Application”或“New App”按钮。点击后,一个网页表单将从屏幕右侧滑入,需要填写该表单。在这里,我们定义应用程序的元数据和 Helm 包的位置。我们希望 Argo CD 从部署单仓库及其内部的 ms-flights 目录中获取 Helm 包。
使用以下表格中的值来设置航班信息微服务的部署:
| 部分 | 键 | 值 |
| — | — | — |
| 常规 | 应用程序名称 | flight-info |
| 常规 | 项目 | default |
| 常规 | 同步策略 | manual |
| 源 | 仓库 URL | YOUR_DEPLOYMENTS_REPOSITORY_URL(请替换为实际的部署仓库 URL) |
| 源 | 路径 | ms-flights |
| 目标 | 集群 | in-cluster (https://kubernetes.default.svc) |
| 目标 | 命名空间 | microservices |

填写完表单后,点击“Create”按钮。如果遇到任何问题,可以参考 Argo CD 文档获取设置应用程序的说明。

  • 同步应用程序 :如果成功创建了应用程序,Argo CD 将在仪表盘中列出 flight-info 应用程序。但此时应用程序尚未与部署声明同步,集群中的 flight-info 应用程序与我们包中的描述不匹配,因为 Argo CD 尚未实际进行部署。要完成部署,点击刚刚创建的 flight-info 应用程序,点击“Sync”按钮,然后在滑入的窗口中点击“Synchronize”按钮。
3. 测试航班服务

航班微服务现在已经在 AWS 托管的暂存环境中运行。为了使用请求消息测试该服务,我们需要访问 Traefik 的负载均衡器,它将把我们的请求路由到容器化服务。具体步骤如下:
- 获取负载均衡器地址 :运行以下 kubectl 命令获取负载均衡器的网络地址:

$ kubectl get svc ms-traefik-ingress

输出结果可能如下:

NAME                 TYPE           CLUSTER-IP       EXTERNAL-IP
ms-traefik-ingress   LoadBalancer   172.20.149.191   ab.elb.amazonaws.com

记录下 EXTERNAL-IP ,这是 Traefik 负载均衡器的地址。
- 发送测试请求 :使用 curl 发送测试请求消息到航班服务。运行以下 curl 命令(将 {TRAEFIK-EXTERNAL-IP} 替换为你的负载均衡器地址):

curl --header "Host: flightsvc.com" \
 {TRAEFIK-EXTERNAL-IP}/flights?flight_no=AA2532

如果一切顺利,你将以 JSON 格式的响应获得该航班的详细信息。你也可以使用专门的 API 测试工具(如 Postman 或 SoapUI)来获得更友好格式的响应消息。

4. 清理资源

为了避免为未使用的 AWS 资源付费,我们需要清理基础设施。使用本地 Terraform 客户端来拆除基础设施。确保你位于暂存 Terraform 文件所在的目录,并运行以下命令:

infra-staging-env $ terraform destroy

成功完成后,基于 Kubernetes 的暂存环境将被销毁。你可以使用 AWS CLI 或基于浏览器的 AWS 控制台检查资源是否已被销毁。

5. 微服务系统中的变更

在微服务系统中,变更应该是一个特性,而不是问题或错误。我们应该能够更改系统以使其更好,并从所构建的软件中获得更多价值。软件变更通常有外在驱动因素和内在驱动因素。

外在驱动因素
- 支持新产品发布
- 解决影响用户体验的逻辑错误
- 与新合作伙伴集成

内在驱动因素
- 拆分微服务以降低代码复杂度
- 重新部署基础设施以避免与基础设施代码出现偏差
- 优化 CI/CD 管道以更快地交付变更

为了从系统中获得最佳价值,我们需要同时规划和执行内在变更。采用持续改进思维的一个好方法是使用数据和测量来指导决策。

6. 以数据为导向

在软件开发中,过度设计和过早优化是常见问题。在微服务系统中也是如此,因此使用数据和测量来指导变更决策是个好主意。特别是对于内在改进,没有数据,我们只能猜测,可能会花费大量精力改进实际上不需要帮助的系统部分,而其他紧迫的问题区域可能会被忽视。

我们可以收集以下项目、设计和运行时指标,以更好地了解改进机会:
- 每个微服务的变更时间
- 每个微服务的变更频率
- 每个变更请求中更改的微服务数量
- 微服务中的代码行数(作为数据点,而非约束)
- 每个微服务的运行时延迟
- 微服务之间的依赖关系

这些分析指标可以让我们更全面地了解哪些地方可以进行改进,然后我们可以决定将精力投入到何处。当然,我们还需要平衡改进的可能性与变更带来的影响。

7. 变更的影响

软件变更可能会带来多种潜在影响,其中有四种对现代组织影响较大:
- 实施时间 :这是任何变更成本的核心部分,包括理解当前状态、进行所需更改、测试更改以及更新生产环境所需的时间。要更改的组件的可读性、可学习性和可维护性是影响实施时间的重要因素。
- 协调时间 :实施变更时,团队之间几乎总是需要进行某种形式的沟通。协调时间是实施时间的一部分,但值得单独强调。它可能包括获取资源访问权限、获得变更活动的许可和协议所花费的时间,以及在大型组织中工作产生的“组织摩擦”。协调时间通常与组织设计和结构有关。
- 停机时间 :停机时间是指系统或系统组件在进行变更时不可用的时间。过去,停机时间是软件变更过程中被接受的一部分,但现在技术团队面临着越来越大的压力,需要尽量减少变更所需的停机时间。在微服务系统中,通常追求“零停机”变更模型,即系统始终保持可用。
- 消费者影响 :这是一个常被忽视的影响,指变更对系统用户造成的成本。停机时间只是消费者影响的一种形式,即使在“零停机”模型中,也可能存在本可避免的高昂影响。例如,对基础设施模块的更改可能会对微服务开发团队产生广泛影响,对接口的更改可能会破坏使用该接口的每个组件的代码。

软件架构在变更的成本和影响中起着重要作用,而变更的应用方式也是其中的一部分。微服务架构、云基础设施和 DevOps 实践推动了一些先进的实践,下面介绍三种部署模式。

8. 三种部署模式
8.1 蓝绿部署

在蓝绿部署中,会维护两个并行的环境。一个环境处于活动状态并接收流量,另一个环境处于空闲状态。变更应用到空闲环境,准备好后,将流量路由到已更改的环境。两个环境交换角色,空闲环境变为活动环境,活动环境变为空闲环境,为下一次变更做准备。

这种部署模式的优点是可以在生产环境中安全地进行更改,切换流量意味着无需在活动系统中重复更改。该模式的关键是两个环境在活动和空闲之间互换角色,而环境的实际颜色并不重要。它可以大大减少停机时间,甚至实现零停机模型。但维护两个环境需要谨慎处理数据库等持久系统,持久的、不断变化的数据需要进行同步、复制或完全在蓝绿模型之外进行维护。

8.2 金丝雀部署

金丝雀部署与蓝绿部署类似,但不是维护两个完整的环境,而是并行发布两个组件。在这种模式中,新发布的版本就像“煤矿中的金丝雀”,能提前警示危险。例如,要对一个 Web 应用程序进行金丝雀部署,会在原 Web 应用程序继续运行的同时发布一个新的金丝雀版本。

与蓝绿模式一样,金丝雀部署需要流量管理和路由逻辑。部署应用程序的新版本后,部分流量会被路由到新版本。到达金丝雀版本的流量可以是总负载的一定百分比,也可以基于唯一的标头或特殊标识符。随着时间的推移,更多的流量会被路由到金丝雀版本,直到它最终晋升为正式生产状态。

金丝雀部署的优点是更细粒度,我们可以专注于较小的、有边界的变更,并在运行的系统中进行这些变更。但如果部署的金丝雀版本影响到系统的其他部分,可能会导致问题。例如,如果金丝雀部署以新的方式改变了共享系统资源,即使只处理 1% 的流量也可能产生灾难性影响。在为独立部署而设计的系统中,金丝雀模式可以很好地工作。

8.3 多版本部署

多版本部署模式将用户和客户端视为变更过程的一部分,即并行运行多个版本。前面提到的蓝绿部署和金丝雀部署模式也会临时并行运行实例(有时称为扩展和收缩模式),但在这两种情况下,通常会私下运行新旧实例,不与外界共享详细信息。而多版本部署模式则考虑了用户和客户端在变更过程中的参与。

以下是这三种部署模式的对比表格:
| 部署模式 | 环境数量 | 流量切换方式 | 优点 | 缺点 |
| — | — | — | — | — |
| 蓝绿部署 | 2 个并行环境 | 直接切换 | 安全更改,可实现零停机 | 需处理持久系统同步 |
| 金丝雀部署 | 并行发布组件 | 逐步增加流量 | 细粒度变更,提前发现问题 | 可能影响其他部分 |
| 多版本部署 | 并行运行多个版本 | 按需分配流量 | 考虑用户参与 | 管理复杂度较高 |

通过上述对 Argo CD 的使用和微服务系统变更管理的介绍,我们可以更高效地部署和管理微服务系统,同时更好地应对系统中的各种变更。

使用 Argo CD 进行 GitOps 部署及微服务变更管理

9. 部署模式的选择与应用场景

不同的部署模式适用于不同的场景,我们需要根据具体的需求和系统特点来选择合适的部署模式。以下是一个简单的决策流程图:

graph TD;
    A[是否需要零停机部署?] -->|是| B[是否可以维护两个完整环境?];
    A -->|否| C[是否需要细粒度变更测试?];
    B -->|是| D[蓝绿部署];
    B -->|否| C;
    C -->|是| E[金丝雀部署];
    C -->|否| F[多版本部署];
  • 蓝绿部署的应用场景 :当系统对停机时间非常敏感,且有足够的资源来维护两个完整的环境时,蓝绿部署是一个不错的选择。例如,对于一些大型的电商网站,在进行重大功能更新时,为了避免影响用户体验,可以采用蓝绿部署,确保在更新过程中用户始终能够正常访问网站。
  • 金丝雀部署的应用场景 :如果我们需要对新功能进行小规模的测试,以验证其稳定性和性能,金丝雀部署就非常合适。比如,在推出一个新的推荐算法时,可以先将少量流量导向新算法,观察用户的反馈和系统的运行情况,再决定是否全面推广。
  • 多版本部署的应用场景 :当系统需要同时支持不同版本的客户端或用户时,多版本部署是必要的。例如,某些软件可能有不同版本的 API,为了保证旧版本的客户端仍然能够正常使用,就需要并行运行多个版本的服务。
10. 持续改进与变更管理流程

为了更好地管理微服务系统中的变更,我们可以建立一个持续改进的变更管理流程。以下是一个简单的流程说明:

  1. 数据收集与分析 :定期收集系统的各项指标,如微服务的变更时间、变更频率、运行时延迟等。使用数据分析工具对这些指标进行深入分析,找出系统中存在的问题和改进的机会。
  2. 变更决策 :根据数据分析的结果,制定变更计划。考虑变更的成本、影响范围和预期收益,选择合适的部署模式。
  3. 变更实施 :按照变更计划进行部署,使用 Argo CD 等工具确保变更的顺利进行。在部署过程中,密切监控系统的运行状态,及时发现并解决问题。
  4. 验证与反馈 :部署完成后,对系统进行全面的测试和验证,确保变更达到了预期的效果。收集用户的反馈意见,评估变更对用户的影响。
  5. 持续优化 :根据验证和反馈的结果,对系统进行进一步的优化和调整。将成功的变更经验纳入到系统的标准流程中,不断提高系统的稳定性和性能。
11. 示例:使用金丝雀部署优化航班服务

假设我们要对航班服务进行一次优化,提高其响应速度。我们可以采用金丝雀部署的方式,具体步骤如下:

  1. 准备金丝雀版本 :在代码仓库中创建一个新的分支,对航班服务的代码进行优化。将优化后的代码打包成 Docker 镜像,并推送到镜像仓库。
  2. 配置 Argo CD 应用程序 :在 Argo CD 中创建一个新的应用程序,指向金丝雀版本的代码仓库。设置同步策略为手动,确保我们可以控制部署的时机。
  3. 设置流量路由 :使用 Traefik 等负载均衡器,将少量流量(如 10%)导向金丝雀版本的航班服务。可以通过设置路由规则,根据用户的 IP 地址或请求头来决定流量的分配。
  4. 监控与评估 :密切监控金丝雀版本的运行状态,收集各项指标,如响应时间、错误率等。与旧版本进行对比,评估优化的效果。
  5. 逐步扩大流量 :如果金丝雀版本运行稳定,且性能得到了明显提升,可以逐步增加导向金丝雀版本的流量,直到全部流量都切换到新的版本。
  6. 清理与合并 :部署完成后,删除金丝雀版本的代码分支和相关资源。将优化后的代码合并到主分支,确保后续的部署都使用新的版本。
12. 总结

通过使用 Argo CD 进行 GitOps 部署,我们可以实现微服务的自动化部署和同步,提高部署的效率和可靠性。同时,了解微服务系统中的变更类型、影响和部署模式,能够帮助我们更好地管理系统的变更,降低变更成本,提高系统的稳定性和性能。

在实际应用中,我们应该以数据为导向,根据系统的实际情况选择合适的部署模式和变更管理策略。持续收集和分析系统的指标,不断优化系统的架构和流程,以适应不断变化的业务需求。通过建立一个完善的变更管理体系,我们可以确保微服务系统始终保持高效、稳定的运行。

总之,微服务系统的成功不仅仅取决于技术的选择,更在于对变更的有效管理和持续改进。希望这些知识和实践经验能够帮助你更好地构建和管理微服务系统。

该数据集通过合成方式模拟了多种发动机在运行过程中的传感器监测数据,旨在构建一个用于机械系统故障检测的基准资源,特别适用于汽车领域的诊断分析。数据按固定时间间隔采集,涵盖了发动机性能指标、异常状态以及工作模式等多维度信息。 时间戳:数据类型为日期时间,记录了每个数据点的采集时刻。序列起始于2024年12月24日10:00,并以5分钟为间隔持续生成,体现了对发动机运行状态的连续监测。 温度(摄氏度):以浮点数形式记录发动机的温度读数。其数值范围通常处于60至120摄氏度之间,反映了发动机在常规工况下的典型温度区间。 转速(转/分钟):以浮点数表示发动机曲轴的旋转速度。该参数在1000至4000转/分钟的范围内随机生成,符合多数发动机在正常运转时的转速特征。 燃油效率(公里/升):浮点型变量,用于衡量发动机的燃料利用效能,即每升燃料所能支持的行驶里程。其取值范围设定在15至30公里/升之间。 振动_X、振动_Y、振动_Z:这三个浮点数列分别记录了发动机在三维空间坐标系中各轴向的振动强度。测量值标准化至0到1的标度,较高的数值通常暗示存在异常振动,可能与潜在的机械故障相关。 扭矩(牛·米):以浮点数表征发动机输出的旋转力矩,数值区间为50至200牛·米,体现了发动机的负载能力。 功率输出(千瓦):浮点型变量,描述发动机单位时间内做功的速率,取值范围为20至100千瓦。 故障状态:整型分类变量,用于标识发动机的异常程度,共分为四个等级:0代表正常状态,1表示轻微故障,2对应中等故障,3指示严重故障。该列作为分类任务的目标变量,支持基于传感器数据预测故障等级。 运行模式:字符串类型变量,描述发动机当前的工作状态,主要包括:怠速(发动机运转但无负载)、巡航(发动机在常规负载下平稳运行)、重载(发动机承受高负荷或高压工况)。 数据集整体包含1000条记录,每条记录对应特定时刻的发动机性能快照。其中故障状态涵盖从正常到严重故障的四级分类,有助于训练模型实现故障预测与诊断。所有数据均为合成生成,旨在模拟真实的发动机性能变化与典型故障场景,所包含的温度、转速、燃油效率、振动、扭矩及功率输出等关键传感指标,均为影响发动机故障判定的重要因素。 资源来源于网络分享,仅用于学习交流使用,请勿用于商业,如有侵权请联系我删除!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值