Kubernetes概念
简介
kubernetes是一个Google开源的容器编排系统,用于自动部署,扩展和管理容器化应用程序。
- 随处运行:支持公有云,私有云,混合云,物理机
- 以集群的方式运行、管理跨机器的容器,解决Docker跨机器容器之间的通讯问题。
- 可拓展:模块化,可插拔,支持钩子,可任意组合
- 自修复:自动重调度,自动重启,自动复制
主要概念:
- 容器组(Pod):被部署在单个节点上的,且包含一个或多个容器的容器组,Pod 是可以被创建,调度,是 Kubernetes 管理最小部署单元,同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来,这样,您就能更加轻松地在集群中移动容器。
- 节点(Node):一个节点是一个运行 Kubernetes 中的主机,虚拟机或物理主机。
- 管理节点 (Master Node):用于控制 Kubernetes 节点的计算机,所有任务分配都来自于此。
- 工作节点 (Minion Node):执行请求和分配任务的计算机,由 Kubernetes 主机负责对节点进行控制。
- 命名空间(Namespace):Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
- 部署(Deployment):Deployment 是新一代用于 Pod 管理的对象,与 Replication Controller 相比,它提供了更加完善的功能,使用起来更加简单方便。
- Replication Controllers:主要负责指定数量的 pod 在同一时间一起运行并保持平衡。解决Pod的线性扩容缩容问题。
- 服务(services):解决Pod的服务发现问题,服务为一组 Pod 提供单一稳定的名称和地址,服务可将工作定义与容器集分离,Kubernetes 服务代理会自动将服务请求分配到正确的容器集 — 无论这个容器集会移到集群中的哪个位置,即使它已被替换,也是如此。
- 标签(labels):逻辑上的标记。用来关联service、replication controller和pod.
- 卷(Volume):Pod中能够被多个容器访问的共享目录,其生命周期与Pod相同跟容器无关。
Kubernetes 中,所有的容器都运行在 Pod 中,一个 Pod 来容纳一个单独的容器,或者多个合作的容器。在后一种情况,Pod 中的容器被保证放置在同一个机器上,可以共享资源。一个 Pod 也能包含零个或者更多的的 volume,volume 是对一个容器私有的目录或者可以在 Pod 中的容器间共享。对于用户每个创建的 Pod,系统会找一个健康运转并且有足够的容量的机器,然后开始将相应的容器在那里启动。如果一个容器失败,它会被 Kubernetes 的 node agent 自动重启,这个 node agent 被称作 Kubelet。但是如果 Pod 或者他的机器出故障,它不会被自动转移或者重启,除非用户也定义了一个 Replication Controller。
Pod 的副本集合可以共同组成一整个应用,一个微服务,或者在一个多层应用的一层。一旦 Pod 创建好,系统会持续的监控他们的健康状态,和它们运行时所在的机器的健康状况。如果一个 Pod 因为软件问题或者所在机器故障出现问题,Replication 控制器会自动在健康的机器上创建一个新的 Pod。
Kubernetes 支持一种独特的网络模型。Kubernetes 鼓励用扁平的地址空间,并且不会动态的分配端口,而是采用让用户可以选择任意合适自己的端口。为了实现这点,它给每一个 Pod 分配了一个 IP 地址。
Kubernetes 提供了 Service 的抽象,其提供了一稳定的 IP 地址和 DNS 名字,来对应一组动态的 Pod,例如一组构成一个微服务的 Pod。这个 Pod 组是通过 Label 选择器来定义的,因为可以指定任何的 Pod 组。当一个运行在 Kubernetes Pod 里的容器连接到这个地址时,这个连接会被本地的代理转发(称作 kube proxy)。该代理运行在来源机器上,转发的目的地是一个相应的后端容器,确切的后端是通过 round-robin 的策略进行选择,以均衡负载。kube proxy 也会追踪后端的 Pod 组的动态变化,如当 Pod 被位于新机器上的新的 Pod 取代的时候,因而服务的 IP 和 DNS 名字不用改变。
每一个 Kubernetes 中的资源,如 Pod,都通过一个URI来被识别,并且有一个 UID。URI 中一个总要的组件是,对象的类型(如:Pod),对象的名字,和对象的 namespace(命名空间)。对于一个特定的对象类型,每一个名字在其命名空间都是独一无二的,在一个对象的名字没有带着命名空间的形式给出,那就是默认的命名空间,UID 在时间和空间的范围都是唯一的。
关于 Service 的更多说明:Service 是应用服务的抽象,通过 labels 为应用提供负载均衡和服务发现。匹配 labels 的 Pod IP 和端口列表组成 endpoints,由 kube-proxy 负责将服务 IP 负载均衡到这些 endpoints 上。
每个 Service 都会自动分配一个 cluster IP(仅在集群内部可访问的虚拟地址)和 DNS 名,其他容器可以通过该地址或 DNS 来访问服务,而不需要了解后端容器的运行。
总体结构
- Master组件:
- ApiServer:作为kubernetes系统的入口,封装了核心对象的增删改查操作。
- Scheduler:插件式的调度器,负责集群的资源调度,为新建的pod分配机器。
- Controller:负责管理各种控制器。如- - ReplicationController,
- EndPointController等。
- Node组件:
- kubelet:负责管控docker容器,如启动/停止、监控运行状态等。
- proxy:负责为pod提供代理。它会定期从etcd获取所有的service,并根据service信息创建代理。
- 公共组件:
- Etcd
- flannel