Kubernetes 设计概要
(原文:https://github.com/GoogleCloudPlatform/kubernetes/blob/master/DESIGN.md)
概述
---------------------------------
* Kubernetes 构建于 Docker之上,是基于container集群的调度服务。用户在需要 container 时,会向 Kubernetes 发起请求,Kubernetes 会从worker节点中选取合适的container回应。
* 随着基于container的应用和系统逐渐扩张,已经出现很多便捷的container工具,它们的工作原理大同小异(Kubernetes也不例外)
* 更进一步看 Kubernetes 的架构时,我们更倾向将其作为 worker节点 和 service 的 master 来看
关键概念:Container Pod
---------------------------------
* 不同于 Docker 基于独立的 container,Kubernetes 是基于 pod
* pod 是一组 containers,被调度分配在同一个物理节点之上
* 除上之外,一个 pod 还拥有相同的 IP 、存储 和 端口映射
关键概念:Lables
---------------------------------
* pods 通过 labels 进行组织,每个pod都可以有多个lables(key=>value形式)
* label机制是 services 和 replicationControllers 工作的基础(其操作单元)
* label可以叠加,以集合的形式使用,
如:
有10个节点拥有label{tier=frontend,stack=prod},但想在replicationController 中分为两类
可以其中(假如)9个节点为{tier=frontend,stack=prod,canary=no}
另外1个节点为{tier=frontend,stack=prod,canary=yes}
则可在 replicationController 中分别控制
Kubernetes 节点
---------------------------------
* Kubernetes 节点上运行 Docker containers, Docker 负责管理下载镜像、运行 container 等细节
* Kubernetes
Kubelet
* Kubelet 是逻辑中继器,是 Compute Engine image 的一部分
* Kubelet 以 container 为单位,每个 conatiner manifest(manifest示例:https://developers.google.com/compute/docs/containers/container_vms#container_manifest)
为一个 YAML 文件,在其中描述了 pod 的属性
* Kubelet 包含一簇的 manifest,在其中描述了container/pod的工作机制,并且 Kubelet 要负责保证 containers 依照 manifest 的定义被启动和执行
* manifest 有以下提供方式
- File:通过命令行传入,每20秒检查一次
- HTTP endpoint:作为参数manifest,也是每20秒检查一次
- etcd server:Kubelet 可监察 etcd 上的指定文件,对manifest的更改可以更快的发现并同步
- HTTP server:Kubelet 提供了HTTP接口以提交manifest
Kubernetes Proxy
* 每个worker节点上运行了一个network proxy
* proxy 支持 TCP流转发 或 round-robin 转发
Kubernetes Master
---------------------------------
* etcd
- 稳定可靠地存储所有 master 的状态
* Kubernetes API Server
- pod:每个pod都在API层有表现
- service:service是proxy的配置单元,service会被命名,并指向一个或多个pod
- replicationController:一个复制controller 带有一个模板,并保证时刻都有一定数量的复制器在运行
- API提供的其他功能
-- 将pod调度到worker节点上,目前的调度器实现很简单
-- 维护pod和service配置的一致性
* Kubernetes Controller Manager Server
- repliationController 配置项不是必须的
- repliationController 是基于pod
- 为了更好的层次,repliationController 的逻辑实际由另一个server负责,这个新server会监测etcd对repliationController 的操作,然后用 Kubernetes API 去实施 repliation
Network Model
---------------------------------
* Kubernetes 扩展了 Docker 的网络模型,为使得每个 pod 在共享的网络中只有一个 IP,并能通过这个IP和其他物理机/container无障碍的通信