同步操作将从 腾讯蓝鲸智云/bk-bcs 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
Mesos是Apache下的开源分布式资源管理框架,它被称为是分布式系统的内核,其核心功能是集群资源的管理。在mesos提供的接口基础上,我们通过开发适合服务编排调度需求的mesos framework和mesos executor等功能模块,实现了BCS中基于mesos的容器的调度管理,并根据实际情况支持容器和进程进程混合编排。
基于mesos的调度管理的系统结构及概要说明如下:
在分布式系统中,一个业务通常由多个不同功能模块组成,我们把每一个功能模块称之为一个应用(application)。而在一个应用中,通常会部署多个功能相同的进程组以达到性能和可靠上等方面的保障,我们将一个进程组称之为一个taskgroup。而具体到进程组,通常由一个或者一个以上的具有紧密逻辑关系的进程(task)组成。 以上关系可以通过以下例子说明: 游戏服务中通常会包括gamesvr,snssvr,loginsvr等不同的application,其中每个application部署多个不同的实例(taskgroup),例如gamesvr-1, gamesvr-2等等。而每个gamesvr taskgroup内,由gamesvrd和connsvrd两个不同的进程(task)组成。 同一个taskgroup内的task通常部署在相同的主机,同时被创建,同时被销毁,每个task具有独自的启动命令和参数,环境变量,磁盘挂载,镜像,网络端口和资源占用配额等属性,并且运行在独立的容器(container)中,所以task是运行的最小单元,但通常taskgroup才是调度的最小单元,而application是用户部署时的操作对象。 实际使用中,用户通常是先定义好一个application(包括namespace,name,taskgroup的个数以及taskgroup和task的具体属性,这里不做详细说明),然后调用create,scale,update,delete等接口对application进行部署操作。scheduler在具体执行过程中,通常以taskgroup为粒度进行实际调度。
前面已经介绍了application及其与taskgroup,task对象的关系,当用户需要部署(以及更新,重新调度,扩容)一个application时,大体流程如下:
除了用户操作application时scheduler需要调度taskgroup实例,在application运行过程中的某些情况下,系统也需要自动触发重新调度taskgroup,如:
针对各种异常情况,我们支持各种异常情况下对运行的taskgroup实例进行重新调度,可以配置重新调度的时机,最大次数和间隔等,说明如下:
上面我们介绍了application的操作流程和taskgroup的重新调度流程,其核心逻辑是用户操作(也可能为系统自身触发的重新调度等操作)和mesos offer匹配的过程。我们在调度taskgroup时,除了对系统主机CPU,memory,disk,port等基本资源有要求外,通常还有各种不同的要求,例如需要部署(或者不部署)在指定的IDC和机型,需要在多个网段分散部署,一台主机最多n个实例等等,我们把这些和系统基本资源无关的要求称之为调度约束规则。 我们把约束抽象成属性,算法和参数(可选)三部分:
下面详细介绍约束属性,算法,参数以及约束组合。
属性通常是指mesos上报集群资源时主机的标签键值对,例如: IDC->上海南汇, InnerIP->172.10.1.23。主机属性可能来源于:
为了支持各种不同的属性和算法,约束参数支持以下几种类型:
一条约束规则的约束能力有限,我们支持多个约束条件的组合:
上面介绍到,一个application为一组具有相同功能的taskgroup实例组成,而不同application中的taskgroup通常情况下没有直接的关系。 很多业务存在运行过程中进行热更新的需求,这样,在某个阶段就会存在一个application的多个版本的实例共存的情况,他们既不是完全独立的application,也不能看成是完全相同的application,因此我们在application的基础上进一步封装了deployment的概念来实现这样的需求。 一个deployment可以将多个具有一定关系(通常是不同版本)的多个application进行关联,以方便实现滚动升级等操作。 deployment定义中自带有application的定义,创建一个deployment的时候会同时创建application,同时销毁deployment的时候也会同时销毁其下的application。 我们也支持定义一个deployment关联到当前已经运行的application而不是创建新的application,方便对application进行滚动升级等操作。 定义一个deployment之后,我们支持对其进行create(创建),delete(销毁),update(滚动升级),rollback(升级回滚),update-pause(暂停更新),update-resume(继续更新)等操作。对deployment进行操作的目的本质上是对其关联的application进行操作。 对于应用的滚动升级,通过deployment的操作,我们支持以下升级策略:
deployment的操作过程,内部实现是通过对application的create,scale up, scale down, delete等几个操作来实现的,只是触发方式由用户触发改为了系统自动触发,这里不再做详细说明。
对于有状态服务的容器化改造,可以基于application、service来实现。有状态服务一般会有如下特性:
"volumes": [{
"volume": {
"hostPath": "/data/host/path",
"mountPath": "/container/path",
"readOnly": false
},
"name": "test-vol"
}],
此种方式可以将持久化存储的数据以挂载目录的方式存储到物理机相应目录下,容器重新调度数据依然存在。
service
{
"apiVersion": "v4",
"kind": "service",
"metadata": {
"name": "consul-svc",
"namespace": "test",
"labels": {
"BCSGROUP": "external",
"consul_svc": "consul_svc"
}
},
"spec": {
"selector": {
"podname": "consul"
},
"ports": [{
"name": "svc_port",
"protocol": "tcp",
"servicePort": 8300
}]
}
}
application
{
"apiVersion": "v4",
"kind": "application",
"updatePolicy": {
"updateDelay": 10,
"MaxRetries": 10,
"maxFailovers": 10,
"action": ""
},
"restartPolicy": {
"policy": "OnFailure",
"interval": 5,
"backoff": 10
},
"killPolicy": {
"gracePeriod": 5
},
"constraint": {},
"metadata": {
"labels": {
"podname": "consul"
},
"name": "consul",
"namespace": "test"
},
"spec": {
"instance": 3,
"template": {
"spec": {
"containers": [{
"command": "/bin/sh",
"args": [
"-c",
"mkdir /tls && sleep 3 && exec /bin/consul agent -data-dir=/consul/data -config-dir=/consul/config -server -join consul-0.consul-svc.test.svc -join consul-1.consul-svc.test.svc -join consul-2.consul-svc.test.svc -bootstrap-expect 3 -bind ${BCS_NODE_IP}"
],
"parameters": [],
"type": "MESOS",
"env": [],
"image": "consul:latest",
"imagePullPolicy": "IfNotPresent",
"privileged": false,
"ports": [{
"hostPort": 8300,
"name": "svc_port",
"protocol": "TCP"
}],
"parameters": [],
"healthChecks": [],
"resources": {
"limits": {
"cpu": "2",
"memory": "1024"
}
},
"volumes": [{
"volume": {
"hostPath": "/data/consul/data",
"mountPath": "/consul/data",
"readOnly": false
},
"name": "consul-data"
},
{
"volume": {
"hostPath": "/data/consul/config",
"mountPath": "/consul/config",
"readOnly": false
},
"name": "consul-config"
}
],
"secrets": [],
"configmaps": []
}],
"networkMode": "HOST",
"networkType": "CNM"
}
}
}
}
上面是一个将有状态服务consul部署到容器当中的示例,需要创建application、service两部分资源描述文件,实例间的服务发现使用域名方式:consul-{INDEX}.consul-svc.test.svc; 针对consul中需要持久化存储的数据使用挂载目录的方式存储到物理机目录/data/consul/data。
业务的容器化改造是一个先部分容器化,逐步转向全部容器化的过程,bcs支持进程&容器混合编排调度,进而降低了业务容器化改造的成本。 针对非容器的部署方案可以使用process、service来描述业务服务。
如下是使用进程的方式部署mongodb service
{
"apiVersion": "v4",
"kind": "service",
"metadata": {
"name": "service-mongodb",
"namespace": "test",
"labels": {
"BCSGROUP": "external",
"mongodb_svc": "mongodb_svc"
}
},
"spec": {
"selector": {
"mongodb": "mongodb"
},
"ports": [{
"name": "svc_port",
"protocol": "tcp",
"servicePort": 27017
}]
}
}
process
{
"apiVersion": "v4",
"kind": "process",
"restartPolicy": {
"policy": "OnFailure",
"interval": 5,
"backoff": 10,
"maxtimes": 10
},
"killPolicy": {
"gracePeriod": 10
},
"metadata": {
"labels": {
"mongodb": "mongodb"
},
"name": "mongodb",
"namespace": "test"
},
"spec": {
"instance": 1,
"template": {
"spec": {
"processes": [{
"procName": "mongod",
"user": "root",
"workPath": "${work_base_dir}/${namespace}.${processname}.${instanceid}/mongodb",
"pidFile": "${work_base_dir}/${namespace}.${processname}.${instanceid}/mongodb/mongodb.pid",
"ports": [{
"hostPort": 27017,
"name": "svc_port",
"protocol": "TCP"
}],
"uris": [{
"value": "http://xxxxxx/mongodb-v1.tar.gz",
"pullPolicy": "IfNotPresent",
"outputDir": "${work_base_dir}/${namespace}.${processname}.${instanceid}"
}],
"startCmd": "./start.sh",
"startGracePeriod": 2,
"stopCmd": "./stop.sh",
"healthChecks": [],
"resources": {
"limits": {
"cpu": "2",
"memory": "500"
}
},
"env": [{
"name": "hostip",
"value": "${hostip}"
},
{
"name": "work_dir",
"value": "${work_base_dir}/${namespace}.${processname}.${instanceid}/mongodb"
},
{
"name": "pid_file",
"value": "${work_base_dir}/${namespace}.${processname}.${instanceid}/mongodb/mongodb.pid"
},
{
"name": "namespace",
"value": "${namespace}"
},
{
"name": "processname",
"value": "${processname}"
},
{
"name": "instanceid",
"value": "${instanceid}"
}
],
"secrets": [],
"configmaps": []
}]
}
}
},
"constraint": {}
}
详情请参考:process文档
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。