当前位置: 首页 > news >正文

DevOps平台两种实现模式

9c1f540df0c358d80c80d6ee3827c249.jpeg

我们需要一个DevOps平台

要讨论DevOps平台的实现模式,似乎就必须讨论它们的概念定义。然而,当大家要讨论它们的定义时,就像在讨论薛定谔的猫。

A公司认为它不过是自动化执行Shell脚本的平台,有些人认为它是一场运动,另一些人认为它是一种文化,还有CTO认为它的本质就是流水线(Pipeline)。

显然不论哪种定义,你无法挑出毛病,但是它们又都无法使所有人都信服。

所以,我总是避免谈DevOps的定义。

那么在DevOps定义不清的情况下,怎么谈它的实现模式呢?

当一个名词的定义不清时,我们应该回归它的目的。 DevOps的目的是改进和缩短系统开发生命周期。DevOps实现该目的的手段是融合开发(Dev)与运维(Ops)。至于怎么融合,大家似乎没有达到一致的看法,毕竟家家有本难念的经。

总之,大家为了实现DevOps,大概率会从以下三个选项进行选择:

  1. 1. 自己开发一个DevOps平台;

  2. 2. 买一套现成的DevOps平台;

  3. 3. 直接使用云上的DevOps SaaS服务。

总之,就是要有一个平台!

DevOps平台的两种模式

由于大家对于DevOps的定义不清,所以,DevOps平台的功能的边界也就很模糊了。

但是,经过我的观察,不论它们使用了什么工具,包含了多少功能,是否包含界面,DevOps平台目前就两种实现模式:

  1. 1. 基于命令式的模式;

  2. 2. 基于声明式的模式。

命令式的DevOps平台

在手工运维和手工构建的阶段,人们都习惯将运维命令和构建命令一条条记录下来。

当要实现自动化的时候,人们很自然地想到要让DevOps平台自动化一条条命令的执行。

所以,人们在使用命令式的DevOps平台时,都是跟着平台的界面提示,一步步地增加命令(通常也称为命令节点)。最后完成一整条流水线。

命令式的DevOps平台为了让流水线支持更多的工具和命令,通常会通过运维开发人员对DevOps平台的命令节点进行扩展。

命令式DevOps平台,在用户的眼里就是一条条命令的流水线平台。这就好比你想要一台电脑,然后你跟电脑店的老板买了一堆的配件,自己拿回家,然后按照你的想法一个个配件的组装。

如果要在AWS云上部署一套简单的负载+机器,在命令式DevOps平台上的做法通常是:

  • • 步骤1. 配置并购买负载均衡器;

  • • 步骤2. 配置并购买机器;

  • • 步骤3. 配置安全组并绑定到机器上;

  • • 步骤4. 将机器挂载到负载均衡器中。

当然,命令式DevOps平台也知道当要部署的软件多的时候,用户操作起来很麻烦,所以,命令式DevOps平台也会提供一些模板操作来简化用户的操作。但是,用户通常会报怨模板不够灵活不能满足自己的需求。最终命令式DevOps平台都会实现用户自定义命令模板功能。

目前在国内的DevOps平台基本上就是这种实现模式。

声明式的DevOps平台

声明式的DevOps平台把大问题看出两个子问题:

  1. 1. 用户该如何描述他们想要的软件的最终状态;

  2. 2. 如何实现这个状态,即具体执行。

命令式DevOps平台同时将这两个问题扔给用户,而声明式的DevOps平台只让用户声明他们想要的最终状态,而具体执行的问题留给平台本身。

这就好比你只需要跟电脑店的老板说明你想到的电脑的配置和预算,电脑店的老板就按照行业里最高效的方式给你组装。

在用户的眼里,只要修改软件的最终状态的描述,声明式的DevOps平台就可以帮他们以最快的方式去实现。

这是命令式与声明式的最大区别。用户在命令式的平台下,通常很难知道整个软件的最终状态。就像你拿到部署文档,上面只告诉你要执行的一条条命令,最终状态是什么样,要等待执行完成才知道。

另一个很大的不同点是幂等性。用户可以在声明式的DevOps平台多次声明他想的最终状态,如果用户期望最终状态与实际状态一致,声明式DevOps平台就不会去执行。

如果要在AWS云上部署一套简单的负载+机器,以下以Terraform为声明式DevOps平台案例(不了解代码的可以跳过):

resource "aws_lb" "default" {name = "example-lb"subnets = aws_subnet.public.*.idsecurity_groups = [aws_security_group.lb.id]
}resource "aws_lb_target_group" "hello_world" {name = "example-target-group"vpc_id = aws_vpc.default.id...
}resource "aws_lb_listener" "hello_world" {load_balancer_arn = aws_lb.default.id...default_action {target_group_arn = aws_lb_target_group.hello_world.idtype = "forward"}
}  resource "aws_security_group" "hello_world_task" {name = "example-task-security-group"vpc_id = aws_vpc.default.idingress {...security_groups = [aws_security_group.lb.id]}...
}resource "aws_ecs_cluster" "main" {name = "example-cluster"
}resource "aws_ecs_service" "hello_world" {name = "hello-world-service"cluster = aws_ecs_cluster.main.idtask_definition = aws_ecs_task_definition.hello_world.arn desired_count = var.app_countnetwork_configuration {security_groups = [aws_security_group.hello_world_task.id]subnets = aws_subnet.private.*.id}load_balancer {target_group_arn = aws_lb_target_group.hello_world.id...}depends_on = [aws_lb_listener.hello_world]
}

以上是用户使用HCL语言描述期望的最终软件的状态。具体的执行交给Terraform和云厂商实现。

Terraform会根据HCL的描述决定哪些资源的创建可以并行,哪些已经创建了不需要再创建等。用户不再关心步骤1是先创建负载均衡,还是先创建EC2。

这在行业里另有一个名字:Infrastructure as Code。

的确,IaC是实现声明式DevOps平台的最低成本方式,你不需要另外开发界面。还有大量开源社区(Terraform的生态)工具给你使用,如:InfraCost(云成本diff工具,高级点叫FinOps)、Terratest(对Infra进行测试)等。

值得一提的是,对于多云的支持,命令式的DevOps平台通常需要通过各个云的SDK集成到自己的平台,这个开发成本非常大。

而使用类似Terraform这样的声明式的平台,多云原生就支持。

那么,声明式的DevOps是不是只能选择使用代码来描述软件的最终状态?其实并不是,声明式的DevOps平台也应该可以提供界面进行描述。

最后

作为用户,你倾向于使用哪种模式的DevOps平台呢?为什么?

往期好文推荐:

  • 探讨基础设施即代码所带来的挑战

  • Kubernetes包管理器Helm的本质

相关文章:

DevOps平台两种实现模式

我们需要一个DevOps平台 要讨论DevOps平台的实现模式,似乎就必须讨论它们的概念定义。然而,当大家要讨论它们的定义时,就像在讨论薛定谔的猫。 A公司认为它不过是自动化执行Shell脚本的平台,有些人认为它是一场运动,另…...

Java 简单实现一个 UDP 回显服务器

文章目录 UDP 服务端UDP 客户端实现效果UDP 服务端(实现字典功能)总结 UDP 服务端 package network;import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; import java.net.SocketException;public class UdpEchoServer {private Da…...

element ui中Select 选择器,自定义显示内容

正常情况下,下拉框选项展示内容,就是选择后展示的label内容 如图所示: 但是要想自定义选项内容,但是展示内容不是选项label的内容,可以在el-option标签内增加div进行自定义选项label展示,但选择后结果展示…...

机器视觉行业,日子不过了吗?都进入打折潮,双11只是一个借口,打广告出新招,日子不好过是真的

我就不上图了,大家注意各个机器视觉公司公众号,为什么打折?打广告也只是宣传手段,进入打折潮,内卷严重,价格战变成白刃战,肯定日子不好过了。...

【手动创建UIWindow Objective-C语言】

一、上节课,我们讲了控制器View的懒加载: 1.什么时候会调用这个懒加载呢,用我们直接,控制器self.view self.view的时候: 什么时候,调用它这个self.view, 就要去加载控制器的view, self.view 加载控制器的view 我们给大家演示过了,这个大家已经清楚了,我们给大家说…...

【学习辅助】Axure手机时间管理APP原型,告别手机控番茄任务模板

作品概况 页面数量:共 30 页 兼容软件:Axure RP 9/10,不支持低版本 应用领域:时间管理、系统工具 作品申明:页面内容仅用于功能演示,无实际功能 作品特色 本品为「手机时间管理」APP原型,…...

[PyTorch][chapter 62][强化学习-基本概念]

前言: 目录: 强化学习概念 马尔科夫决策 Bellman 方程 格子世界例子 一 强化学习 强化学习 必须在尝试之后,才能发现哪些行为会导致奖励的最大化。 当前的行为可能不仅仅会影响即时奖赏,还有影响下一步奖赏和所有奖赏 强…...

使用 Stable Diffusion Img2Img 生成、放大、模糊和增强

在线工具推荐: Three.js AI纹理开发包 - YOLO合成数据生成器 - GLTF/GLB在线编辑 - 3D模型格式在线转换 - 3D数字孪生场景编辑器 Stable Diffusion 2022.1 Img5Img 于 2 年发布,是一款革命性的深度学习模型,正在重新定义和推动照片级真实…...

【Git】第一篇:Git安装(centos)

git查看安装版本 以我自己的centos7.6为例,我们可以输入以下指令查看自己是否安装了git. git --version安装了的话就会显示自己安装的版本。 git 安装 安装很简单,一条命令即可 sudo yum install git -ygit 卸载 sudo yum remove git -y...

在uniapp中通过自定义事件使页面之间传递数据

在uniapp中,可以使用uni.$emit来在页面之间传递数据。uni.emit是一个事件触发器,可以在一个页面中触发一个自定义事件,并在其他页面中监听和处理这个事件。 // A页面 uni.$emit(dataChanged, { message: Hello from A page! });在接收数据的…...

【Windows Docker:安装nginx】

拉镜像 docker pull nginx运行初始镜像 docker run -d -p 80:80 --name nginx nginx拷贝文件 docker cp nginx:/etc/nginx/nginx.conf D:/dockerFile/nginx/nginx.conf docker cp nginx:/etc/nginx/conf.d D:/dockerFile/nginx/conf.d docker cp nginx:/usr/share/nginx/htm…...

ElasticSearch7.x - HTTP 操作 - 查询文档操作

查询索引下的所有文档 http://192.168.254.101:9200/shopping/_search 条件查询 请求路径上添加条件:http://192.168.254.101:9200/shopping/_search?q=category:小米 请求体上添加条件:http://192.168.254.101:9200/shopping/_search 请求体内容 {"query" :{&qu…...

基于opencv+tensorflow+神经网络的智能银行卡卡号识别系统——深度学习算法应用(含python、模型源码)+数据集(一)

目录 前言总体设计系统整体结构图系统流程图 运行环境Python环境TensorFlow 环境OpenCV环境 相关其它博客工程源代码下载其它资料下载 前言 本项目基于从网络获取的多种银行卡数据集,采用OpenCV库的函数进行图像处理,并通过神经网络进行模型训练。最终实…...

如何使用`open-uri`模块

首先,我们需要使用open-uri模块来打开网页,并使用Nokogiri模块来解析网页内容。然后,我们可以使用Nokogiri的css方法来选择我们想要的元素,例如标题,作者,内容等。最后,我们可以使用open-uri模块…...

activiti7审批驳回,控制变量无法覆盖,导致无限循环驳回,流程无法结束

项目开发过程中使用工作流,因此考虑使用activiti7做完工作流引擎。项目开发过程中,发现流程驳回时,再次执行流程,控制变量无法覆盖,导致无限循环驳回,流程无法结束。流程图如下图所示: 驳回控制…...

世界互联网大会|云轴科技ZStack受邀分享云原生超融合

11月8日至10日“世界互联网大会乌镇峰会”在浙江嘉兴的乌镇开幕,大会的主题为“建设包容、普惠、有韧性的数字世界——携手构建网络空间命运共同体”,全球各界代表就热点焦点问题展开讨论,反映产业各界对互联网发展的前瞻思考,引领…...

k8s ingress基础

一、ingress 简介 在k8s集群中,service和pod的ip为内网ip,仅集群内部才可以访问。如果外部应用想要直接访问集群内的服务,就需要把外部请求通过负载均衡转发到service上,然后再由kube-proxy组件将其转发给后端pod。一般service可…...

【网络奇缘】我和英特网再续前缘

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络的概念 计算机网络的功能 ⭐1.数据通信 ⭐2.资源共享 ⭐3.分布式处理 ⭐4.提高可靠性 ⭐…...

node插件MongoDB(四)—— 库mongoose 的条件控制(三)

文章目录 前言一、运算符二、逻辑运算1. $or 逻辑或2. $and 逻辑与 三、正则匹配 前言 在mongodb 不能使用 > < > < ! 等运算符&#xff0c;需要使用替代符号。 一、运算符 > 使用 $gt< 使用 $lt> 使用 $gte< 使用 $lte! 使用 $ne 例子&#xff1a;获…...

【Amazon】云上探索实验室—了解 AI 编程助手 Amazon Codewhisperer

文章目录 一、前言&#x1f4e2;二、关于云上探索实验室&#x1f579;️三、领学员需要做什么&#xff1f;✴️四、领学员能获得什么&#xff1f;&#x1f523;五、学课通道入口&#x1f447;1️⃣CSDN平台2️⃣网易云课堂3️⃣Skill Builder 平台 六、活动详情链接 一、前言&a…...

KubeSphere 容器平台高可用:环境搭建与可视化操作指南

Linux_k8s篇 欢迎来到Linux的世界&#xff0c;看笔记好好学多敲多打&#xff0c;每个人都是大神&#xff01; 题目&#xff1a;KubeSphere 容器平台高可用&#xff1a;环境搭建与可视化操作指南 版本号: 1.0,0 作者: 老王要学习 日期: 2025.06.05 适用环境: Ubuntu22 文档说…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站&#xff0c;会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后&#xff0c;网站没有变化的情况。 不熟悉siteground主机的新手&#xff0c;遇到这个问题&#xff0c;就很抓狂&#xff0c;明明是哪都没操作错误&#x…...

ubuntu搭建nfs服务centos挂载访问

在Ubuntu上设置NFS服务器 在Ubuntu上&#xff0c;你可以使用apt包管理器来安装NFS服务器。打开终端并运行&#xff1a; sudo apt update sudo apt install nfs-kernel-server创建共享目录 创建一个目录用于共享&#xff0c;例如/shared&#xff1a; sudo mkdir /shared sud…...

MySQL 8.0 OCP 英文题库解析(十三)

Oracle 为庆祝 MySQL 30 周年&#xff0c;截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始&#xff0c;将英文题库免费公布出来&#xff0c;并进行解析&#xff0c;帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

Web 架构之 CDN 加速原理与落地实践

文章目录 一、思维导图二、正文内容&#xff08;一&#xff09;CDN 基础概念1. 定义2. 组成部分 &#xff08;二&#xff09;CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 &#xff08;三&#xff09;CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 &#xf…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA&#xff1a;通过低成本全身远程操作学习双手移动操作 传统模仿学习&#xff08;Imitation Learning&#xff09;缺点&#xff1a;聚焦与桌面操作&#xff0c;缺乏通用任务所需的移动性和灵活性 本论文优点&#xff1a;&#xff08;1&#xff09;在ALOHA…...

基于Java Swing的电子通讯录设计与实现:附系统托盘功能代码详解

JAVASQL电子通讯录带系统托盘 一、系统概述 本电子通讯录系统采用Java Swing开发桌面应用&#xff0c;结合SQLite数据库实现联系人管理功能&#xff0c;并集成系统托盘功能提升用户体验。系统支持联系人的增删改查、分组管理、搜索过滤等功能&#xff0c;同时可以最小化到系统…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...