Kubernetes
是Google开源的容器集群管理系统,提供应用部署、维护、扩展机制等功能,利用Kubernetes
能方便地管理跨机器运行容器化得应用。真实的生产环境应用会包含多个容器,而这些容器还很可能会跨越多个服务器主机部署。Kubernetes
提供了为那些工作负载大规模部署容器的编排与管理能力。Kubernetes
编排让你能够构建多容器的应用服务,在集群上调度或伸缩这些容器,以及管理它们随时间变化的健康状态。
在了解 Kubernetes
之前,让我们先了解一个容器。因为如果不了解容器就没法聊容器编排
。
容器就是…一个你塞入所有材料的容器。“材料”是指你的应用代码、依赖库,以及直到内核的依赖关系。关键概念是隔离,把你的这些材料隔离出来,以便更好的控制他们。
容器提供了3种类型的隔离:
容器可以理解为节食的VM
,具有隔离性,但容器非常精简、体积小、启动快。VM
是在操作系统之上又安装了多个操作系统,VM
之间自然是隔离的。而容器是通过 Linux 的 cgroup
实现了VM那样的隔离性,并不需要安装操作系统。
Kubernetes
?容器挺好的,为什么需要 Kubernetes
这样的容器协调器呢?
如果你达到图中这个状态时,你就需要他了,有太多的容器需要管理了。
Q:
我前端容器在哪儿呢?有多少个在运行?
A:
很难说啊,快使用容器编排吧。
Q:
如何让我的前端容器与新创建的后端容器沟通?
A:
可以硬编码 IP,或者,使用容器编排。
Q:
如何滚动升级?
A:
你可以手动控制每一步,或者,使用容器编排。
Kubernetes
体系结构
每个Kubernetes
集群都有两种类型的节点:master
和 worker
。master
是控制和监控 worker
工作的这个集群的。
master
的构成etcd
: 作为数据库,所有 kubernetes
对象、当前状态、访问信息、集群配置信息 …,都存在这。API Server
: 暴露集群操作的端点,master
和 worker
上的组件都需要访问 api servrer
,以便完成自己的工作。Scheduler
: 调度程序,负责决定哪个工作由哪个机器干。Control Manager
: 控制管理器,监视集群的状态(通过调用API服务器来获取此数据)并采取措施将其置于预期状态。worker
的构成kubelet
: worker 节点的核心,与 master 的 api server 沟通,运行调度到本节点的容器。kube Proxy
: 使用 IP表/ IPVS 处理Pod的网络需求。Pod
: kubernetes 运行容器的主力,提供了容器间联网的能力。
一个 pod
中可以有多个容器,这些容器中的应用互相间都视为本地。pod
的网络接口提供了一个机制,使其可以与本节点或其他节点上的 pod
进行网络连接。
每个 pod
都会被指定一个 IP
,kube-proxy
将使用该IP
地址来路由流量,而且此IP
地址仅在群集中可见。
一个 pod
中挂载的数据卷可以被所有容器看到,例如,你的 APP 是一个图片上传应用,把图片保存在一个数据卷中,同一个 pod
中的其他容器可以监控这个数据卷,发现有新图片时,就开始处理,例如缩放多个尺寸的图片、上传到云存储。
Controller
控制器kubernetes
中有很多控制器,例如 ReplicaSet
, Replication Controllers
, Deployments
, StatefulSets
, Service
。他们都是控制 pod
的对象,我们来看几个重点
的控制器。
ReplicaSet
如果一个 pod
挂了,这个控制器就会得到通知,立马创建一个新的。
Deployment
提供了滚动升级的能力,扩展新的,缩减旧的。
Service
像一个负载均衡器一样,像相应节点分派包。
可以跨 worker 节点构建一个 pod 组
(通常是根据 pod 的标签)。
例如你的前端应用、后端应用,各自都有很多个实例在运行,前后端怎么沟通?
前端需要知道后端各个实例的访问地址,硬编码后端 IP
的方式显然不能用,那么就需要把后端实例组成一个 service
,前端只需要访问这个 service
,由 service
对其中的后端实例进行流量负载均衡转发。
Ingress
外部世界通过 Ingress
与集群中的所有服务沟通。
就像是一个网关,方便我们在一个地方统一设置安全策略、监控、记录日志。