Kubernetes 手记(1)- Kubernetes 概述
一 Kubernetes 概述
1.1 容器编排工具
docker 官方编排工具
mesos IDC 操作系统
kubernetes
1.2 kubernetes
kubernetes 是希腊语,翻译过来是:舵手的意思,它的原型是谷歌内部使用 Borg 集群管理系统,可以说是集结了 Borg 设计思想的精华,并且吸收了 Borg 系统中的经验和教训。
它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes 可以帮你将系统自动地达到和维持在这个状态。Kubernetes 作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。
kubernetes 在 2014 年发布了第一个版本,目前开源并托管在 Github 上。
目前,AWS、阿里云、微软云,目前已经原生支持 K8S ,目前已经可以让用户直接部署云原生的服务。
有什么优势
1.3 环境架构
Kubernetes 是一个集群,整合多台计算机的计算能力,它是一种有中心节点模式的集群,在 K8S 集群中主机分为两种角色:
客户端创建启动容器的请求交给 Master ,Master 上有一个调度器它能分析各 nodes 节点上的资源状态,找一个最适合运行用户容器的节点,并在这个节点上使用 Docker 启动这个容器,node 节点的 Docker 在启动容器时候会首先检查本地有没有镜像,如果没有就从仓库中 pull 然后运行。
那么仓库可以运行为容器,所以也可以托管在 Kubernetes 之上,其实 Kubernetes 可以托管自身,即自托管。
ApiServer
kubernetes 接收用户创建容器等请求的是 Kubernetes Cluster,那么它对外提供服务的接口就是一个 API 接口 ,这个接口需要编程来访问,或者通过编写好的客户端程序来访问,Kubernetes Master 上有一个组件就是 ApiServer,来接收客端请求,解析客户端请求,其主要功能包括认证授权、数据校验以及集群状态变更,以及负责其他模块直接的相互通讯和数据交互,只有 api server 才能操作 etcd,其他模块想要获取数据需要通过 api server 提供的接口进行相关数据操作
Scheduler
scheduler watch apiserver,接受系统或用户请求是运行,如何要运行一个 pod,那么 Master 会使用调度器(scheduler)根据请求来分配一个能够运行容器的 nodes 节点,例如:根据用户对资源要求,CPU、内存、来评估哪个 nodes 最合适运行。
大概的过程就是:首先是预选,从 nodes 中挑选出符合用户容器运行要求的,然后在这些预选结果中进行优选,选出最佳的适配 node。
Controller(控制器)
如果运行容器的节点宕机或者容器本身运行出现问题,kubernetes 能够在其他节点再启动一个一模一样的容器,这就是 Kubernetes 提供的自愈能力。
控制器就实现了监控它所负责的每一个容器的健康状态,一旦发现不健康了,那么控制器会向 Master 发送请求,Master 会再次由调度器挑选出合适的节点再次运行这个容器。
它能持续性探测所管理的容器,一旦不健康,或不符合用户定义的健康状态,就会由它发起来请求,来保证容器向用户希望的健康状态迁徙。
而 Kubernets 支持众多的控制器,支持容器健康的控制器只是其中一种。
ControllerManager(制器管理器)
在 Master 内置组件中有一个控制器管理器,它负责监视着每一个控制器,如果控制器不健康无法工作,那么由控制器管理器来确保控制器的健康,由于 Master 有多个,所以具有冗余性。
Pod(原子调度单元,是容器的封装)
在 Kubernetes 上调度的原子单元,Kubernetes 不直接调度容器,而是 Pod,Pod 可以理解为容器的二次封装,可以由一个或者多个容器组成,多个容器共享同一个网络名称空间:NET、UTS、IPC。
同一个 POD 里的容器,还能共享同一个存储卷,存储卷可以属于 POD。
一般一个 POD 只运行一个容器,如果需要在 POD 放多个容器,那么一般有一个主容器,其他容器是为主容器提供服务的。
Node(工作节点)
提供计算资源的节点,就是运行 Pod 的主机,Kubenetes Cluster 统一管理所有的 node 节点的计算资源,当用户请求创建资源的时候,可以检查目前集群还有没有资源可以运行用户的容器,这实现了统一调度统一管理的一个平台。
Label(标签)
一个由 key = value
组成的标签,可以为 POD 打上一个标签。
Selecter(标签选择器)
集群中运行的众多 POD ,前面提到一个控制器可以管理若干个 POD ,那么控制器如何从集群中运行的所有 POD 中挑选出来自己需要管理的 POD 呢?
在创建一个 POD 的时候为 POD 打上一个标签,让程序可以通过这个标签来识别出来这个 POD,还可以用来区分一组相同功能的 POD,例如:创建四个 nginx pod,可以给每个 pod 加一个 K/V 类型的标签如:app=nginx,将来找出这四个 nginx pod,那么条件就是根据 拥有 key 为 app 的 pod 并且 value 为 nginx 来挑出这组 POD。
标签不是 POD 唯一具有的机制,其他的组件同样可以有标签。
1.4 架构和组件
Etcd
Master 节点负责维护集群的目标状态,上面运行的主控组件有
Node 节点实际负责实施,也就是运行 POD 的节点,上面运行的组件有
插件
DNS
其他
自己将手记发在:https://github.com/redhatxl/awesome-kubernetes-notes欢迎一键三连。
版权声明: 本文为 InfoQ 作者【雪雷】的原创文章。
原文链接:【http://xie.infoq.cn/article/80001d7d2536deff0ff635bc4】。文章转载请联系作者。
评论