本文讲的是物理机上运行kubernetes【编者的话】本文介绍了作者在物理机上部署kubernetes时,对其各个组件的功能的深刻理解。作者认为虽然目前Google自动化了kubernetes部署,但如果想了解更多底层细节,最好还是自己在物理机上部署。
在物理机上部署kubernetes促使我更加深入地了解了更多底层细节,比如管理节点和工作节点之间的通信。Google容器引擎通过使用一个托管的kubernetes管理节点和屏蔽底层复杂细节,使得kubernetes的使用非常便捷,这确实是一个了不起的创举。
什么是kubernetes
kubernetes是谷歌开发的开源容器集群管理系统,它使容器集群应用的管理高度简单、自动化。Kubernetes(简称为k8s)与底层设施无关,可以运行在任何主流的云主机上,也可以是物理机。在Google Cloud上运行kubernetes非常方便,因为Google会为您管理k8s。我一直在Google容器引擎上试用Kubernetes,但为了更好地理解k8s架构,我决定在物理机上部署。kubernetes Master 架构
kubernetes集群由一个管理节点和多个工作节点组成。管理节点是外部可以直接访问的,可以通过它在工作节点上执行命令。下面列出的是运行在管理节点上的组件。ETCD
Etcd是一个开源的分布式键值对存储系统,是由CoreOS团队负责开发的。kubernetes使用etcd
来存储配置数据,集群里面的所有节点均可访问这些数据。配置数据包括服务发现相关的数据和集群状态相关的数据,这些数据在节点配置或者重新配置的时候会用到。
etcd
的主要特点之一是数据在分布式系统中被复制。用户可以停掉kubernetes集群中除了主节点(译者注:这个主节点不是k8s的主节点,而是etcd的主节点)之外的所有etcd。这种情况下,所有的数据请求都将由etcd主节点负责处理。这种情形也是可以接受的,因为只要保证etcd主节点可用,kubernetes就可以正常工作。
API Server
为了确保从外部可以访问集群,主节点上运行了API Server组件,这是整个集群的管理入口。同时,还负责维护etcd中的数据与集群状态的一致性。API Server的组件实现了RESTful接口,使得与其通信更加简单方便。Controller Manager
Controller Manager负责处理针对集群的管理请求,比如副本控制。当用户希望给集群设置某个状态,api server将这个期望的状态写入etcd,然后controller manager会获取到这个状态数据,最终执行一系列动作,将集群设置到用户所期望的状态。Scheduler
调度器负责将任务调度到合适的节点。调度器的目标就是依据某些规则,为待调度的Pod找到合适的节点,这些规则主要是根据Pod的资源请求和节点的资源进行匹配。Kubernetes Worker 架构
无论是kubernetes管理节点还是工作节点都有一个基本的要求-Docker。Docker负责拉取镜像和运行应用。为了让kubernetes能工作,每个worker节点必须属于某个专属子网。使用flannel
(CoreOS团队开发)就能够满足子网的要求。与此同时,为了使用
flannel
并且暴露合适的端口,必须修改一下Docker的配置。flannel需要部署在kubernetes所有woker节点上。
kubelet
Kubelet通过与API Server通信,感知(译者注:通过etcd的list-watch机制)etcd
中的配置数据的变化,来负责维护所在节点的Pod,容器,镜像,存储等对象。
kube-proxy
集群中的每个节点运行一个网络代理和一个负载均衡器。这个代理负责用户请求的负载均衡,并且将请求准确地转发到节点上的容器中。在Ubuntu上运行Kubernetes
为了在Ubuntu系统组成的集群上部署kubernetes,我重度依赖Docker的使用。etcd
和
flannel
运行在主机上的容器中,而不是直接运行在主机上。kubernetes集群必须的管理组件和工作组件也以容器形式运行在主机上。这使得安装是与平台无关的,并且拉起集群更加简单快捷。我通常使用
GitHub
上社区开发的脚本来部署,而不是自己开发。为了让集群拉起更加简单,我自己开发了一个
Ansible
role,在
GitHub
上可以获取。
在物理机上部署kubernetes促使我更加深入地了解了更多底层细节,比如管理节点和工作节点之间的通信。Google容器引擎通过使用一个托管的kubernetes管理节点和屏蔽底层复杂细节,使得kubernetes的使用非常便捷,这确实是一个了不起的创举。
下一步
通过Ansible,我已经可以在物理机上部署kubernetes。下一步,我将部署一个公网IP的负载均衡器,这样从外部就可以访问到kubernetes了。一旦负载均衡器部署成功,我将更新我的ansible脚本。欢迎来这 Twitter 或者 GitHub 与我交流。原文链接:Kubernetes on Bare Metal(翻译:付辉)
原文发布时间为:2017-03-10
本文作者:付辉
本文来自云栖社区合作伙伴Dockerone.io,了解相关信息可以关注Dockerone.io。
原文标题:物理机上运行kubernetes