kubernetes 结构介绍
AndraT07
8年前
<h2>什么是 kubernetes?</h2> <p>kubernetes (经常被缩写成 k8s)是 google 开源的一套自动化容器管理平台,前身是 Borg,用于容器的部署、自动化调度和集群管理。目前 kubernetes 有以下的特性:</p> <ul> <li>容器的自动化部署</li> <li>自动化扩展或者缩容</li> <li>自动化应用/服务升级</li> <li>容器成组,对外提供服务,支持负载均衡</li> <li>服务的健康检查,自动重启</li> </ul> <p>因为容器本身就是可移植的,所以 kubernetes 容器集群也能跑在私有云、公有云或者混合云上面。</p> <p>kubernetes 让应用的集群管理变得简单,只要通过一行命令,就能快速搭建包含了前后端的完整系统集群。</p> <pre> kubectl create -f config-file.yml</pre> <h2>安装 kubernetes</h2> <h2>kubernetes 的概念</h2> <h3>Pods</h3> <p>kubernetes 中,最基本的管理单位是 pod 而不是 container。pod 由一个或者多个容器组成,一般运行着相同的应用。一个 pod 中的所有容器都必须运行在同一台机器上,共享网络空间(network namespace)和存储 (volume)。</p> <p>pod 可以近似类比传统模式下的主机:一些相关的应用组合起来,实现一个逻辑上的功能。</p> <p>记住:pod 不是持久的,也就是说在使用过程中会被删除和创建,只要保证 service (下文会介绍到)保持稳定就行。而持久化的功能可以通过共享的 volume 来实现,这样即使 pod 被不断删除创建也能保证数据的完整。</p> <h3>Replication Controllers</h3> <p>RC 保证在任意时刻都有指定数量的 pod 副本在运行。比如如果我们创建了一个 rc,指定某个 pod 运行 3 份:</p> <ul> <li>刚开始的时候,rc 发现集群中没有这个 pod,它会创建 3 个 pod</li> <li>当某个 pod 不响应或者被删除了,它会检测到这个变化,然后新建一个正常的 pod(替换错误状态的 pod),保证系统有 3 个 pod 在运行</li> <li>当错误的 pod 回复正常,或者用户又手动添加了几个 pod,rc 也会检测到,它会通过删除 pod 来保证只有 3 份副本在运行</li> </ul> <p><img src="https://simg.open-open.com/show/7af9fab5bac0b38c9a6f3514e53737db.gif"></p> <p>创建 replication controller 的时候,需要几个参数:</p> <ul> <li>pod 的模板:用来创建应用的 pod 模板,在需要的时候根据这个模板创建 pod</li> <li>replicas 副本数:要达到的目标状态,pod 需要运行几份</li> <li>label:需要监控的 pod 的标签,通过比较 replicas 变量的值和标签实际发现的 pod 数量确定是否在目标状态</li> </ul> <h3>Services</h3> <p>service,也就是服务,是实际环境中对外提供服务的业务抽象。一个服务后端可能有多个容器提供支持,但是对外通过服务这一层只有一个接口,通过转发用户的请求到后端的应用上来实现。这样做的好处是:对外隐藏了后端的细节,使得扩展和维护变得更容易。</p> <p>在 kubernetes 中,service 后面对应的是 pod,这种对应关系是通过 label 来匹配的。每个 service 会配置 label selector 对后端的 pod 进行选择,因此这种关系是动态的,pod 的添加和删除都会自动被关联进来。</p> <p>service 是单独存在的,不必和 pod 或者 replication controller 绑定。即使后端没有 pod,service 的存在也是合法的,当对应的 pod 出现时,会动态的绑定到 service 上。</p> <h3>Labels</h3> <p>labels 就是标签的意思,主要用于过滤 pod、service 或者 replication controller,尤其是当集群的规模比较大的时候。</p> <p>一个 label 就是一个键值对,用来表示用户自己定义的属性。给 pod 添加添加合理的标签会做到事半功倍的效果,增加可读性(通过 label 就能大致了解 pod 的功能)的同时也能方便查找对应的服务(service 和 replication controller 就是通过 label 来绑定后端 pod 的)。</p> <p>利用 label 能够把 service 和 pod 做到松耦合:两者都可以单独存在,并且这种绑定关系是动态的。</p> <h2>kubernetes 组件</h2> <p>kubernetes 整体上的框架是下面这样的,由多个不同的部分组成,下面将逐个讲解这些部分的功能。</p> <p><img src="https://simg.open-open.com/show/7786145ae8681304e3be7733ff8928e2.png"></p> <h3>kubectl</h3> <p>这是 kubernetes 提供的客户端程序,也是目前常用的和集群交互的方式。创建、查看、管理、删除、更新 pod、service、replication controller 都行,还有更多其他命令,可以查看帮助文档。</p> <h3>etcd 集群</h3> <p>etcd 是 kubernetes 存放集群状态和配置的地方,这是集群状态同步的关键,所有节点都是从 etcd 中获取集群中其他机器状态的;集群中所有容器的状态也是放在这里的。</p> <p>kubernetes 在 etcd 中存储的数据在 /registry 路径下,结构类似下面这样:</p> <pre> /registry/minions /registry/namespaces /registry/pods /registry/ranges /registry/serviceaccounts /registry/services /registry/controllers /registry/events</pre> <h3>Master 组件</h3> <p>kubernetes 是典型的 master-slave 模式,master 是整个集群的大脑,负责控制集群的方方面面。</p> <p>API server</p> <p>对外提供 kubernetes API,也就是 kubernetes 对外的统一入口。封装了 kubernetes 所有的逻辑,通过 RESTful 的方式供客户端使用,kubectl 就是最常用到的客户端程序。</p> <p>Scheduler</p> <p>调度器:实现容器调度的组件,调度算法可以由用户自己实现。Scheduler 会收集并分析当前系统中所有 slave 节点的负载情况,在调度的时候作为决策的重要依据。</p> <p>调度器监听 etcd 中 pods 目录的变化,当发现新的 pod 时,会利用调度算法把 pod 放到某个节点进行部署。可能的 scheduler 包括:</p> <ul> <li>random:随机调度算法</li> <li>round robin:轮询调度</li> </ul> <p>Controller Manager Server</p> <p>集群中其他功能都是在 controller manager 中实现的,每个部分负责一个独立功能的管理。例如:</p> <ul> <li>endpoints controller</li> <li>node controller</li> <li>replication controller</li> <li>service controller</li> <li>……</li> </ul> <h3>slave 组件</h3> <p>kubelet</p> <p>kubelet 是 slave 上核心的工作进程,负责容器和 pod 的实际管理工作(创建、删除等)以及和 master 通信,内容包括:</p> <ul> <li>负责容器的创建、停止、删除等具体工作,也包括镜像下载、 volume 管理</li> <li>从 etcd 中获取分配给自己的信息,根据其中的信息来控制容器以达到对应的目标状态</li> <li>接受来自 master 的请求,汇报本节点的信息</li> </ul> <p>kube-proxy</p> <p>正如名字提示的一样,kube-proxy 为 pod 提供代理服务,用来实现 kubernetes 的 service 机制。每个 service 都会被分配一个虚拟 ip,当应用访问到 service ip 和端口的时候,会先发送到 kube-proxy,然后才转发到机器上的容器服务。</p> <h2>参考资料</h2> <ul> <li><a href="http://www.open-open.com/lib/view/open1415082365190.html">kubernetes 系统架构简介</a></li> <li><a href="/misc/goto?guid=4959675301121201690" rel="nofollow,noindex">introduction to kubernetes</a></li> </ul> <p> </p> <p><a href="/misc/goto?guid=4959675301227512421">阅读原文</a></p> <p> </p>