Fork me on GitHub

Kubernetes 概念整理

注:以下大部分内容来自网上摘录,以便后期查阅。


Kubernetes (通常称为 K8s) 是用于自动部署、扩展和管理容器化(containerized)应用程序的开源系统,是 Google 内部工具 Borg 的“开源版”。

Kubernetes 目前是公认的最先进的容器集群管理工具,在 1.0 版本发布后,Kubernetes 的发展速度更加迅猛,并且得到了容器生态圈厂商的全力支持,这包括coreos、rancher 等,诸多提供公有云服务的厂商在提供容器服务时也都基于 Kubernetes 做二次开发来提供基础设施层的支撑,比如华为。可以说 Kubernetes 也是 Docker 进军容器集群管理和服务编排领域最为强劲的竞争对手(Docker Swarm)。

Kubernetes 定义了一组构建块,它们可以共同提供部署、维护和扩展应用程序的机制。组成 Kubernetes 的组件设计为松耦合和可扩展的,这样可以满足多种不同的工作负载。可扩展性在很大程度上由 Kubernetes API 提供——它被作为扩展的内部组件以及 Kubernetes 上运行的容器等使用。

因为 Kubernetes 是由很多组件构成的一个系统,所以对于 Kubernetes 的安装部署来说,还是有些困难的,并且 Kubernetes 是 Google 开发的,有很多内部的依赖包都是需要穿墙访问的。

当然,也有快速安装的工具,比如 kubeadm,kubeadm 是 Kubernetes 官方提供的快速安装和初始化 Kubernetes 集群的工具,目前的还处于孵化开发状态,伴随 Kubernetes 每个版本的发布都会同步更新,当然,目前的 kubeadm 是不能用于生产环境的。

1. Kubernetes 架构图

2. Kubernetes 特点

Kubernetes 特点:

  • 简洁的:轻量级,简单,易上手
  • 可移植的:公有,私有,混合,多重云(multi-cloud)
  • 可扩展的: 模块化, 插件化, 可挂载, 可组合
  • 可自愈的: 自动布置, 自动重启, 自动复制

通俗来说:

  • 自动化容器的部署和复制
  • 随时扩展或收缩容器规模
  • 将容器组织成组,并且提供容器间的负载均衡
  • 很容易地升级应用程序容器的新版本
  • 提供容器弹性,如果容器失效就替换它

3. Kubernetes 术语

Kubernetes 术语:

  • 管理节点 (Master Node):用于控制 Kubernetes 节点的计算机,所有任务分配都来自于此。
  • 工作节点 (Minion Node):执行请求和分配任务的计算机,由 Kubernetes 主机负责对节点进行控制。
  • 命名空间(Namespace):Namespace 是对一组资源和对象的抽象集合,比如可以用来将系统内部的对象划分为不同的项目组或用户组。常见的 pods, services, replication controllers 和 deployments 等都是属于某一个 namespace 的(默认是 default),而 node, persistentVolumes 等则不属于任何 namespace。
  • 容器集 (Pod):被部署在单个节点上的,且包含一个或多个容器的容器组,Pod 是可以被创建,调度,并与 Kubernetes 管理最小部署单元,同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来,这样,您就能更加轻松地在集群中移动容器。
  • 部署(Deployment):Deployment 是新一代用于 Pod 管理的对象,与 Replication Controller 相比,它提供了更加完善的功能,使用起来更加简单方便。使用详情
  • 复制控制器 (Replication Controller):复制控制器管理 Pod 的生命周期,它们保证指定数量的 Pod 在任何给定的时间都在运行,他们通过创建或删除 Pod 做到这一点。
  • 服务 (Service):服务为一组 Pod 提供单一稳定的名称和地址,服务可将工作定义与容器集分离,Kubernetes 服务代理会自动将服务请求分配到正确的容器集 — 无论这个容器集会移到集群中的哪个位置,即使它已被替换,也是如此。
  • 标签(Lable):标签用于组织和选择基于键值对的对象组,它们被用于每一个 Kubernetes 组件。

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 来访问服务,而不需要了解后端容器的运行。

4. Kubernetes 组件

Kubernetes 组件:

  • kubectl:客户端命令行工具,将接受的命令格式化后发送给 kube-apiserver,作为整个系统的操作入口。
  • kube-apiserver:作为整个系统的控制入口,以 REST API 服务提供接口。
  • kube-controller-manager:用来执行整个系统中的后台任务,包括节点状态状况、Pod 个数、Pods 和 Service 的关联等。
  • kube-scheduler(将 Pod 调度到 Node 上):负责节点资源管理,接受来自 kube-apiserver 创建 Pods 任务,并分配到某个节点。
  • etcd:负责节点间的服务发现和配置共享。
  • kube-proxy:运行在每个计算节点上,负责 Pod 网络代理。定时从 etcd 获取到 Service 信息来做相应的策略。
  • kubelet:运行在每个计算节点上,作为 agent,接受分配该节点的 Pods 任务及管理容器,周期性获取容器状态,反馈给 kube-apiserver。
  • DNS:一个可选的DNS服务,用于为每个 Service 对象创建 DNS 记录,这样所有的 Pod 就可以通过 DNS 访问服务了。
  • flannel:Flannel 是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,需要另外下载部署。我们知道当我们启动 Docker 后会有一个用于和容器进行交互的 IP 地址,如果不去管理的话可能这个 IP 地址在各个机器上是一样的,并且仅限于在本机上进行通信,无法访问到其他机器上的 Docker 容器。Flannel 的目的就是为集群中的所有节点重新规划 IP 地址的使用规则,从而使得不同节点上的容器能够获得同属一个内网且不重复的 IP 地址,并让属于不同节点上的容器能够直接通过内网 IP 通信。

master 节点包含组件:

docker
etcd
kube-apiserver
kube-controller-manager
kubelet
kube-scheduler

minion 节点包含组件:

docker
kubelet
kube-proxy

参考资料:

posted @ 2018-02-05 15:48  田园里的蟋蟀  阅读(2947)  评论(0编辑  收藏  举报