请添加图片描述

什么是 Kubernetes

Kubernetes(也称为“k8s”或“kube” )是一个容器编排平台,用于调度以及自动部署、管理和扩展容器化应用。

Kubernetes 最初由 Google 工程师开发,后来于 2014 年开源。 它的前身是 Borg, 这是 Google 内部使用的一种容器编排平台。 Kubernetes 是希腊语,意为舵手或领航员,因此 Kubernetes 的徽标(链接位于 IBM 外部)为舵手。

为什么要用Kubernetes

传统时代: 早期,在物理服务器上运行应用程序。无法为物理服务器中的应用程序定义资源边界,这会导致资源分配问题。例如,如果多个应用程序在一台物理服务器上运行,则可能会出现一个应用程序占用大部分资源的情况,因此其他应用程序的性能会不佳。对此的解决方案是在不同的物理服务器上运行每个应用程序。但由于资源未得到充分利用,这并没有扩展,并且组织维护许多物理服务器的成本很高。

虚拟化时代: 作为解决方案,引入了虚拟化。它允许您在单个物理服务器的 CPU 上运行多个虚拟机 (VM)。虚拟化允许应用程序在 VM 之间隔离并提供一定级别的安全性,因为一个应用程序的信息不能被另一个应用程序自由访问。

虚拟化允许更好地利用物理服务器中的资源并允许更好的可扩展性,因为可以轻松添加或更新应用程序、降低硬件成本等等。通过虚拟化,您可以将一组物理资源呈现为一次性虚拟机集群。

每个 VM 都是一台完整的机器,在虚拟化硬件之上运行所有组件,包括其自己的操作系统。

容器时代:容器类似于虚拟机,但它们具有宽松的隔离特性,可以在应用程序之间共享操作系统(OS)。因此,容器被认为是轻量级的。与 VM 类似,容器有自己的文件系统、CPU、内存、进程空间等共享。由于它们与底层基础架构分离,因此它们可以跨云和操作系统分发进行移植。

容器之所以流行是因为它们提供了额外的好处,例如:

  • 敏捷的应用程序创建和部署:与使用 VM 镜像相比,容器镜像创建更容易和更高效。
    持续开发、集成和部署:提供可靠且频繁的容器镜像构建和部署以及快速高效的回滚(由于镜像的不变性)。
  • Dev 和 Ops 关注点分离:在构建/发布时间而不是部署时间创建应用程序容器映像,从而将应用程序与基础设施解耦。
  • 可观察性:不仅可以显示操作系统级别的信息和指标,还可以显示应用程序运行状况和其他信号。
  • 开发、测试和生产的环境一致性:在笔记本电脑上的运行方式与在云中的运行方式相同。
  • 云和操作系统分发可移植性:在 Ubuntu、RHEL、CoreOS、本地、主要公共云和其他任何地方运行。
  • 以应用程序为中心的管理:将抽象级别从在虚拟硬件上运行操作系统提高到使用逻辑资源在操作系统上运行应用程序。
  • 松散耦合、分布式、弹性、解放的微服务:应用程序被分解成更小的、独立的部分,可以动态部署和管理——而不是在一台大型单一用途机器上运行的单一堆栈。
  • 资源隔离:可预测的应用程序性能。
  • 资源利用:高效率、高密度。

容器是捆绑和运行应用程序的好方法。在生产环境中,您需要管理运行应用程序的容器并确保没有停机。例如,如果一个容器宕机,另一个容器需要启动。如果这种行为由系统处理会不会更容易?

这就是 Kubernetes 的救援方式!Kubernetes 为您提供了一个弹性运行分布式系统的框架。它负责应用程序的扩展和故障转移,提供部署模式等等。

Kubernetes 为您提供:

  • 服务发现和负载平衡 Kubernetes
    可以使用 DNS 名称或使用自己的 IP 地址公开容器。如果容器的流量很高,Kubernetes 能够负载均衡和分配网络流量,从而使部署稳定。
  • 存储编排 Kubernetes
    允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。
  • 自动推出和回滚
    您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 为您的部署创建新容器、删除现有容器并将其所有资源用于新容器。
  • 自动装箱
    您为 Kubernetes 提供了一组节点,可用于运行容器化任务。您告诉 Kubernetes 每个容器需要多少 CPU 和内存 (RAM)。Kubernetes 可以将容器安装到您的节点上,以充分利用您的资源。
  • 自我修复
    Kubernetes 会重启失败的容器、替换容器、杀死不响应用户定义的健康检查的容器,并且在它们准备好提供服务之前不会向客户端通告它们。
  • 密钥和配置管理
    Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 SSH 密钥。您可以部署和更新机密和应用程序配置,而无需重建容器映像,也无需在堆栈配置中公开机密。

Kubernetes 架构

Kubernetes 架构的主要组成部分包括以下内容:

  • 集群和节点(计算)
    集群是 Kubernetes 架构的构建块。集群由节点组成,每个集群表示单个计算主机(虚拟或物理机器)。

每个集群都包含多个工作节点,用于部署、运行和管理容器化应用,同时还包含一个主节点,用于控制和监视工作节点。

主节点运行调度程序服务,根据开发者设置的部署需求和可用计算能力,在部署容器时于部署位置自动执行该服务。每个工作节点都包含用于管理容器的工具(例如 Docker)和称为 Kubelet 的软件代理程序,用于接收并执行来自主节点的命令。

  • Pod 和部署(软件)
    Pod 是共享相同计算资源和相同网络的多组容器。它们也是 Kubernetes 的可扩展性单元: 如果 Pod 中的容器获得的流量超出了其处理能力范围,那么 Kubernetes 会将该 Pod 复制到集群中的其他节点。 因此,最好使 Pod 保持紧凑,使其仅包含必须共享资源的容器。

部署可控制容器化应用的创建和状态,并使其一直运行。它指定了应该在集群上运行的 Pod 副本数量。 如果 Pod 发生故障,那么部署将会创建新的 Pod。

Kubernetes专业术语

主机(Master): 用于控制 Kubernetes 节点的计算机。所有任务分配都来自于此。

节点(Node): 负责执行请求和所分配任务的计算机。由 Kubernetes 主机负责对节点进行控制。

容器集(Pod): 被部署在单个节点上的,且包含一个或多个容器的容器组。同一容器集中的所有容器共享同一个 IP 地址、IPC、主机名称及其它资源。容器集会将网络和存储从底层容器中抽象出来。这样,您就能更加轻松地在集群中移动容器。

复制控制器(Replication controller): 用于控制应在集群某处运行的完全相同的容器集副本数量。

服务(Service): 将工作内容与容器集分离。Kubernetes 服务代理会自动将服务请求分发到正确的容器集——无论这个容器集会移到集群中的哪个位置,甚至可以被替换掉。

Kubelet: 运行在节点上的服务,可读取容器清单(container manifest),确保指定的容器启动并运行。

kubectl: Kubernetes 的命令行配置工具。

Pod基础概念

pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes
中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于
暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等

pod的分类

  • 自主式Pod
    这种Pod本身是不能自我修复的,当Pod被创建后(不论是由你直接创建还是被其他Controller),都会被Kuberentes调度到集群的Node上。直到Pod的进程终止、被删掉、因为缺少资源而被驱逐、或者Node故障之前这个Pod都会一直保持在那个Node上。Pod不会自愈。如果Pod运行的Node故障,或者是调度器本身故障,这个Pod就会被删除。同样的,如果Pod所在Node缺少资源或者Pod处于维护状态,Pod也会被驱逐。
  • ●控制器管理的Pod
    Kubernetes使用更高级的称为Controller的抽象层,来管理Pod实例。Controller可 以创建和管理多个Pod,提供副本管理、滚动升级和集群级别的自愈能力。例如,如果一个Node故障,Controller就能自动将该节点上的Pod调度到其他健康的Node上。虽然可以直接使用Pod,但是在Kubernetes中通常是使用Controller来管理Pod的。

每个Pod都有一个特殊的被称为“根容器”的Pause容器。Pause容器对应的镜像属于Kubernetes平台的一部分,除了Pause容器,每个Pod还包含一个或者多个紧密相关的用户业务容器。

k8s核心组件

  • HPA
    HPA(HorizontalPodAutoscaler,水平pod自动伸缩控制器)
    HPA控制器可自动监控pod、自动进行扩展。

  • etcd保存了整个集群的状态;

  • apiserver提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;

  • controller manager负责维护集群的状态,比如故障检测、自动扩展、滚动更新等;

  • scheduler负责资源的调度,按照预定的调度策略将Pod调度到相应的机器上;

  • kubelet负责维护容器的生命周期,同时也负责Volume(CVI)和网络(CNI)的管理;

  • Container runtime负责镜像管理以及Pod和容器的真正运行(CRI);

  • kube-proxy负责为Service提供cluster内部的服务发现和负载均衡;

  • AddOns附件
    装完k8s后第一件事就需要在k8s集群上部署一个dns pod,以确保各service的名称能够被解析
    可以动态改变,包括动态创建、动态删除、动态修改
    比如把service的名称改了,dnspod会自动触发,将dns解析记录中的名称也给改掉;假如我们手动把service的ip地址给改了,改完以后会自动触发,将dns服务中的解析记录给改掉。
    如此一来,客户端去访问pod资源的时候可以直接访问service的名称,然后由集群中专用的dns服务来负责解析。
    这种pod是k8s自身的服务就需要用到的pod,所以我们把它称为基础性的系统架构级的pod对象,而且它们也被称为集群附件

Flannel

Flannel是CoreOS团队针对Kubernetes设计的一个网络规划实现,简单来说,它的功能有以下几点:

  • 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。

  • 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。

  • 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。

  • 路由信息一般存放到etcd:多个node上的Flanneld依赖一个etcd cluster来做集中配置服务,etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化

  • Flannel首先会在Node上创建一个名为flannel0的网桥(vxlan类型的设备),并且在每个Node上运行一个名为flanneld的代理.每个node上的flannel代理会从etcd上为当前node申请一个CIDR地址块用来给该node上的pod分配地址。

  • Flannel致力于给k8s集群中的nodes提供一个3层网络,他并不控制node中的容器是如何进行组网的,仅仅关心流量如何在node之间流转。

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐