Magnum Kuernetes源码分析(一)
Magnum版本说明
本文以magnum的mitaka版本代码为基础进行分析。
Magnum Kubernetes
Magnum主要支持的概念有bay,baymodel,node,pod,rc,service。其中Magnum可以创建kubernetes的bay,即kubernetes的集群。本文主要介绍的就是magnum中kubernetes bay的创建过程。
Kubernetes Bay创建流程
首先通过magnum-api发起创建bay的请求,api的入口函数在这里。
@expose.expose(Bay, body=Bay, status_code=201)
def post(self, bay):
"""Create a new bay.
:param bay: a bay within the request body.
"""
...
res_bay = pecan.request.rpcapi.bay_create(new_bay,
bay.bay_create_timeout)
# Set the HTTP Location Header
pecan.response.location = link.build_url('bays', res_bay.uuid)
return Bay.convert_with_links(res_bay)
接着通过rpc调用,将创建请求发送给magnum-conductor,从而调用了bay_conductor的bay_create函数进行处理。
def bay_create(self, context, bay, bay_create_timeout):
...
try:
# Generate certificate and set the cert reference to bay
cert_manager.generate_certificates_to_bay(bay) //为bay创建秘钥
created_stack = _create_stack(context, osc, bay, //驱动heat,为bay创建对应的stack
bay_create_timeout)
...
接着我们来分析创建stack的过程。
def _create_stack(context, osc, bay, bay_create_timeout):
template_path, heat_params = _extract_template_definition(context, bay) //获取模板文件的地址和参数
tpl_files, template = template_utils.get_template_contents(template_path) //获取模板文件内容和其他需要的文件
# Make sure no duplicate stack name
stack_name = '%s-%s' % (bay.name, short_id.generate_id()) //生成stack name
if bay_create_timeout:
heat_timeout = bay_create_timeout
elif bay_create_timeout == 0:
heat_timeout = None
else:
# no bay_create_timeout value was passed in to the request
# so falling back on configuration file value
heat_timeout = cfg.CONF.bay_heat.bay_create_timeout
fields = {
'stack_name': stack_name,
'parameters': heat_params,
'template': template,
'files': tpl_files,
'timeout_mins': heat_timeout
} //拼成heat的参数
created_stack = osc.heat().stacks.create(**fields) //驱动heat创建stack
return created_stack
kubernets的模板文件是kubecluster.yaml。这是一个heat的模板文件。下文主要对这个文件进行分析。
至此,一个bay就可以完整创建出来了。
kubernetes bay stack
kubecluster.yaml是一个标准的heat模板。heat模板的说明可以参看Heat Orchestration Template (HOT) Guide。
kubernetes中节点分为master和minion两个。
- master部署有etcd,kube-apiserver,kube-scheduler,kube-controllermanager。master主要负责对于集群的管理和kubernetes的数据存储。master支持多节点部署,通过LB实现etcd和kubernetes服务的高可用。master的数量在baymodel中定义。
- minion部署有kubelet,kube-proxy,flannel,docker-io。minion是实际创建容器的节点,也就是k8s中的minion。minion节点同样可以有多个。初始的数量在baymodel中定义。
从这个文件,可以看到创建一个kubernetes集群需要的资源。下文对各个resource进行一一分析。
resources:
fixed_network: //kubernetes集群的内网,所有创建出来的node,都会在该内网中
type: OS::Neutron::Net
properties:
name: private
fixed_subnet: //kubernetes集群的内网子网,所有创建出来的node,都会分配该子网的ip地址
type: OS::Neutron::Subnet
properties:
cidr: {get_param: fixed_network_cidr}
network: {get_resource: fixed_network}
dns_nameservers:
- {get_param: dns_nameserver}
extrouter: //对外的外网路由
type: OS::Neutron::Router
properties:
external_gateway_info:
network: {get_param: external_network}
extrouter_inside: //内网路由,连接外网
type: OS::Neutron::RouterInterface
properties:
router_id: {get_resource: extrouter}
subnet: {get_resource: fixed_subnet}
secgroup_base: //基础安全组
type: OS::Neutron::SecurityGroup
properties:
rules:
- protocol: icmp
- protocol: tcp
port_range_min: 22
port_range_max: 22
secgroup_kube_master: //供master使用的安全组
type: OS::Neutron::SecurityGroup
properties:
rules:
- protocol: tcp
port_range_min: 7080
port_range_max: 7080
- protocol: tcp
port_range_min: 8080
port_range_max: 8080
- protocol: tcp
port_range_min: 2379
port_range_max: 2379
- protocol: tcp
port_range_min: 2380
port_range_max: 2380
- protocol: tcp
port_range_min: 6443
port_range_max: 6443
- protocol: tcp
port_range_min: 30000
port_range_max: 32767
secgroup_kube_minion: //供minion使用的安全组
type: OS::Neutron::SecurityGroup
properties:
rules:
- protocol: icmp
- protocol: tcp
- protocol: udp
######################################################################
#
# load balancers.
#
api_monitor: //kube-api的负载均衡监控
type: OS::Neutron::HealthMonitor
properties:
type: TCP
delay: 5
max_retries: 5
timeout: 5
api_pool: //kube-api的负载均衡池
type: OS::Neutron::Pool
properties:
protocol: {get_param: loadbalancing_protocol}
monitors: [{get_resource: api_monitor}]
subnet: {get_resource: fixed_subnet}
lb_method: ROUND_ROBIN
vip:
protocol_port: {get_param: kubernetes_port}
api_pool_floating: //kube-api的浮动ip
type: OS::Neutron::FloatingIP
depends_on:
- extrouter_inside
properties:
floating_network: {get_param: external_network}
port_id: {get_attr: [api_pool, vip, port_id]}
etcd_monitor: //etcd的负载均衡监控
type: OS::Neutron::HealthMonitor
properties:
type: TCP
delay: 5
max_retries: 5
timeout: 5
etcd_pool: //etcd的负载均衡池
type: OS::Neutron::Pool
properties:
protocol: HTTP
monitors: [{get_resource: etcd_monitor}]
subnet: {get_resource: fixed_subnet}
lb_method: ROUND_ROBIN
vip:
protocol_port: 2379
######################################################################
#
# kubernetes masters. This is a resource group that will create
# <number_of_masters> masters.
#
kube_masters: //master资源组
type: OS::Heat::ResourceGroup
depends_on:
- extrouter_inside
properties:
count: {get_param: number_of_masters} //创建的master数量
resource_def:
type: kubemaster.yaml //创建master的模板
properties:
...
######################################################################
#
# kubernetes minions. This is an resource group that will initially
# create <number_of_minions> minions, and needs to be manually scaled.
#
kube_minions: //minion资源组
type: OS::Heat::ResourceGroup
depends_on:
- extrouter_inside
- kube_masters
properties:
count: {get_param: number_of_minions} //创建的minion数量
removal_policies: [{resource_list: {get_param: minions_to_remove}}]
resource_def:
type: kubeminion.yaml //创建minion的模板
properties:
...
每个master也是一个stack,它不仅仅包含一个虚拟机,还包括其他一些资源。master的模板在kubemaster.yaml进行了定义。同样,minion的模板在kubeminion.yaml进行了定义。后面再对这些文件进行分析。
Magnum Kuernetes源码分析(一)的更多相关文章
- Magnum Kuernetes源码分析(二)
Kubernetes Master Stack kubernetes master的stack的resources主要分为三个部分. master wait handle wait handle主要用 ...
- Magnum Kubernetes源码分析(一)
Magnum版本说明 本文以magnum的mitaka版本代码为基础进行分析. Magnum Kubernetes Magnum主要支持的概念有bay,baymodel,node,pod,rc,ser ...
- Magnum Kubernetes源码分析(二)
Kubernetes Master Stack kubernetes master的stack的resources主要分为三个部分. master wait handle wait handle主要用 ...
- ABP源码分析一:整体项目结构及目录
ABP是一套非常优秀的web应用程序架构,适合用来搭建集中式架构的web应用程序. 整个Abp的Infrastructure是以Abp这个package为核心模块(core)+15个模块(module ...
- HashMap与TreeMap源码分析
1. 引言 在红黑树--算法导论(15)中学习了红黑树的原理.本来打算自己来试着实现一下,然而在看了JDK(1.8.0)TreeMap的源码后恍然发现原来它就是利用红黑树实现的(很惭愧学了Ja ...
- nginx源码分析之网络初始化
nginx作为一个高性能的HTTP服务器,网络的处理是其核心,了解网络的初始化有助于加深对nginx网络处理的了解,本文主要通过nginx的源代码来分析其网络初始化. 从配置文件中读取初始化信息 与网 ...
- zookeeper源码分析之五服务端(集群leader)处理请求流程
leader的实现类为LeaderZooKeeperServer,它间接继承自标准ZookeeperServer.它规定了请求到达leader时需要经历的路径: PrepRequestProcesso ...
- zookeeper源码分析之四服务端(单机)处理请求流程
上文: zookeeper源码分析之一服务端启动过程 中,我们介绍了zookeeper服务器的启动过程,其中单机是ZookeeperServer启动,集群使用QuorumPeer启动,那么这次我们分析 ...
- zookeeper源码分析之三客户端发送请求流程
znode 可以被监控,包括这个目录节点中存储的数据的修改,子节点目录的变化等,一旦变化可以通知设置监控的客户端,这个功能是zookeeper对于应用最重要的特性,通过这个特性可以实现的功能包括配置的 ...
随机推荐
- 讲故事的人写的谈判手册——Leo锦书64
正如其名称所暗示这本书"谈判无处不在".从决定谈判的成功或失败的因素一个不同的观点,测量中详细给出的同一时间. 图书出版不错,这是阅读的样车.阅读收获压力较小的方式. 书能给读 ...
- Dojo仪表板
Dojo它提供了一个良好的仪表板显示器,的影响,如以下: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvR0lTU2hpWGlTaGVuZw==/font/ ...
- HDOJ 4416 Good Article Good sentence
题解转自:http://blog.csdn.net/dyx404514/article/details/8807440 2012杭州网络赛的一道题,后缀数组后缀自己主动机都行吧. 题目大意:给一个字符 ...
- Tomcat集群+Nginx+Redis服务搭建
由于公司新业务突然上来了,单个Tomcat实例已经不能满足业务发展的需要了,只能通过搭建集群来解决问题了.所以就出现了下面的内容: 1.Redis保存Session信息 为了保存Session信息在集 ...
- 提高C#编程水平的50个要点 你掌握了多少呢?
提高C#编程水平的50个要点,程序员都是追求极致的完美主义者,下面的这些注意点和要点,你都掌握运用了多少呢? 总是用属性(Property)来代替可访问的数据成员 在 readonly 和 const ...
- 前台框架的选择 EasyUI、DWZ、ligerui
EasyUI1.3.1+MVC4.0+EF5.0 番外篇 关于前台框架的选择 EasyUI.DWZ.ligerui 昨天发了EasyUI1.3.1+MVC4.0+EF5.0实战之一 开篇及布局控件介绍 ...
- 安装Windows7操作系统 - 初学者系列 - 学习者系列文章
Windows7是一款不错的操作系统,不过它的销量远没有XP那么大,但是不失为一款好的操作系统.下面就对Windows7操作系统的安装做下介绍. 1. 同样的,BIOS里设置光驱启动,把操作系统盘装 ...
- 安装SQL Server 2005 - 初学者系列 - 学习者系列文章
初学者阶段,建议从数据库为基础入手进行学习. 下面介绍微软的SQL Server 2005数据库的安装. 首先,从下列地址获取SQL Server 2005的安装程序. ed2k://|file|cs ...
- sql2005还原超长sql脚本,还原超大脚本文件
原文:sql2005还原超长sql脚本,还原超大脚本文件 从外网把数据库用导出脚本的方式导出来了,280M的样子,导是导出来了,但是在本机执行sql脚本的时候,直接就是out of memory,之前 ...
- Knockout简单用法
Knockout简单用法 在最近做的一个项目中,页面数据全部通过js ajax调用webapi接口获取,也就是说页面的数据全部使用javascript脚本填充,这就想到了使用一个MVVM模式的js框架 ...