DevOps平台两种实现模式
我们需要一个DevOps平台
要讨论DevOps平台的实现模式,似乎就必须讨论它们的概念定义。然而,当大家要讨论它们的定义时,就像在讨论薛定谔的猫。
A公司认为它不过是自动化执行Shell脚本的平台,有些人认为它是一场运动,另一些人认为它是一种文化,还有CTO认为它的本质就是流水线(Pipeline)。
显然不论哪种定义,你无法挑出毛病,但是它们又都无法使所有人都信服。
所以,我总是避免谈DevOps的定义。
那么在DevOps定义不清的情况下,怎么谈它的实现模式呢?
当一个名词的定义不清时,我们应该回归它的目的。 DevOps的目的是改进和缩短系统开发生命周期。DevOps实现该目的的手段是融合开发(Dev)与运维(Ops)。至于怎么融合,大家似乎没有达到一致的看法,毕竟家家有本难念的经。
总之,大家为了实现DevOps,大概率会从以下三个选项进行选择:
1. 自己开发一个DevOps平台;
2. 买一套现成的DevOps平台;
3. 直接使用云上的DevOps SaaS服务。
总之,就是要有一个平台!
DevOps平台的两种模式
由于大家对于DevOps的定义不清,所以,DevOps平台的功能的边界也就很模糊了。
但是,经过我的观察,不论它们使用了什么工具,包含了多少功能,是否包含界面,DevOps平台目前就两种实现模式:
1. 基于命令式的模式;
2. 基于声明式的模式。
命令式的DevOps平台
在手工运维和手工构建的阶段,人们都习惯将运维命令和构建命令一条条记录下来。
当要实现自动化的时候,人们很自然地想到要让DevOps平台自动化一条条命令的执行。
所以,人们在使用命令式的DevOps平台时,都是跟着平台的界面提示,一步步地增加命令(通常也称为命令节点)。最后完成一整条流水线。
命令式的DevOps平台为了让流水线支持更多的工具和命令,通常会通过运维开发人员对DevOps平台的命令节点进行扩展。
命令式DevOps平台,在用户的眼里就是一条条命令的流水线平台。这就好比你想要一台电脑,然后你跟电脑店的老板买了一堆的配件,自己拿回家,然后按照你的想法一个个配件的组装。
如果要在AWS云上部署一套简单的负载+机器,在命令式DevOps平台上的做法通常是:
• 步骤1. 配置并购买负载均衡器;
• 步骤2. 配置并购买机器;
• 步骤3. 配置安全组并绑定到机器上;
• 步骤4. 将机器挂载到负载均衡器中。
当然,命令式DevOps平台也知道当要部署的软件多的时候,用户操作起来很麻烦,所以,命令式DevOps平台也会提供一些模板操作来简化用户的操作。但是,用户通常会报怨模板不够灵活不能满足自己的需求。最终命令式DevOps平台都会实现用户自定义命令模板功能。
目前在国内的DevOps平台基本上就是这种实现模式。
声明式的DevOps平台
声明式的DevOps平台把大问题看出两个子问题:
1. 用户该如何描述他们想要的软件的最终状态;
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 不能使用 > < > < ! 等运算符,需要使用替代符号。 一、运算符 > 使用 $gt< 使用 $lt> 使用 $gte< 使用 $lte! 使用 $ne 例子:获…...

【Amazon】云上探索实验室—了解 AI 编程助手 Amazon Codewhisperer
文章目录 一、前言📢二、关于云上探索实验室🕹️三、领学员需要做什么?✴️四、领学员能获得什么?🔣五、学课通道入口👇1️⃣CSDN平台2️⃣网易云课堂3️⃣Skill Builder 平台 六、活动详情链接 一、前言&a…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
JAVA后端开发——多租户
数据隔离是多租户系统中的核心概念,确保一个租户(在这个系统中可能是一个公司或一个独立的客户)的数据对其他租户是不可见的。在 RuoYi 框架(您当前项目所使用的基础框架)中,这通常是通过在数据表中增加一个…...

Linux操作系统共享Windows操作系统的文件
目录 一、共享文件 二、挂载 一、共享文件 点击虚拟机选项-设置 点击选项,设置文件夹共享为总是启用,点击添加,可添加需要共享的文件夹 查询是否共享成功 ls /mnt/hgfs 如果显示Download(这是我共享的文件夹)&…...
「Java基本语法」变量的使用
变量定义 变量是程序中存储数据的容器,用于保存可变的数据值。在Java中,变量必须先声明后使用,声明时需指定变量的数据类型和变量名。 语法 数据类型 变量名 [ 初始值]; 示例:声明与初始化 public class VariableDemo {publi…...
ubuntu清理垃圾
windows和ubuntu 双系统,ubuntu 150GB,开发用,基本不装太多软件。但是磁盘基本用完。 1、查看home目录 sudo du -h -d 1 $HOME | grep -v K 上面的命令查看$HOME一级目录大小,发现 .cache 有26GB,.local 有几个GB&am…...
Springboot多数据源配置实践
Springboot多数据源配置实践 基本配置文件数据库配置Mapper包Model包Service包中业务代码Mapper XML文件在某些复杂的业务场景中,我们可能需要使用多个数据库来存储和管理不同类型的数据,而不是仅仅依赖于单一数据库。本技术文档将详细介绍如何在 Spring Boot 项目中进行多数…...

CCF 开源发展委员会 “开源高校行“ 暨红山开源 + OpenAtom openKylin 高校行活动在西安四所高校成功举办
点击蓝字 关注我们 CCF Opensource Development Committee CCF开源高校行 暨红山开源 openKylin 高校行 西安站 5 月 26 日至 28 日,CCF 开源发展委员会 "开源高校行" 暨红山开源 OpenAtom openKylin 高校行活动在西安四所高校(西安交通大学…...