全球领先的云管理服务提供商

思普智云的管理团队都对云有深刻的理解,从搭建到运营和咨询,团队成员分工明确,始终致力于为客户提供专业的技术支持和服务。

容器服务之Kubernetes介绍

发布时间:2019-01-07 15:07:36

         Kubernetes,简称K8s。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效,Kubernetes提供了应用部署,规划,更新,维护的一种机制。

         传统应用通过脚本或者插件来安装。这种方式的缺点是应用的运行、配置、生命周期等与当前的系统绑定,对于应用的升级更新、回滚等操作不便。也可以通过创建虚拟机来实现某些功能,但是虚拟机非常重,移植性比较差。在这种情况下,容器技术就顺应而生。

        容器之间相互隔离,每个容器都有自己的文件系统,容器之间不会相互影响,能区分计算资源。容器资源占用少、利用率高、部署快,每个应用可以被打包成一个容器镜像,应用与容器的一对一关系也使容器具有更大的优势。每个应用不需要与其他应用堆栈组合,也不需要依赖于生产环境基础结构,这使得从研发到测试、生产能提供一致的环境,容器比虚拟机更轻量、更便于监控和管理。

什么是Kubernetes?

        Kubernetes(k8s)是一个用于容器集群的自动化部署、扩容以及运维的开源平台。使用Kubernetes可以:

        自动化容器的部署和复制

        随时扩展或收缩容器规模

        将容器组织成组,并且提供容器间的负载均衡

        很容易地升级应用程序容器的新版本

        提供容器弹性,如果容器失效就替换它,等等...

Kubernetes特点:  

       可扩展: 模块化, 插件化, 可挂载, 可组合

       自愈: 自动布置,自动重启,自动复制,自动扩展

       可移植: 支持公有云,私有云,混合云,多重云(multi-cloud)

 

Kubernetes架构设计

         Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。下面这张图是Kubernetes的架构图。

   

Kubernetes节点

         在这张系统架构图中,我们把服务分为运行在工作节点上的服务和组成集群级别控制板的服务。

         Kubernetes节点有运行应用容器必备的服务,而这些都是受Master的控制。

         每次个节点上当然都要运行Docker。Docker来负责所有具体的映像下载和容器运行。

Kubernetes主要由以下几个核心组件组成:

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

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

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

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

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

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

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

除了核心组件,还有一些推荐的Add-ons:

        kube-dns负责为整个集群提供DNS服务

        Ingress Controller为服务提供外网入口

        Heapster提供资源监控

        Dashboard提供GUI

        Federation提供跨可用区的集群

        Fluentd-elasticsearch提供集群日志采集、存储与查询

   

分层架构

        Kubernetes设计理念和功能其实就是一个类似Linux的分层架构,如下图所示:

  • 核心层:Kubernetes最核心的功能,对外提供API构建高层的应用,对内提供插件式应用执行环境

  • 应用层:部署(无状态应用、有状态应用、批处理任务、集群应用等)和路由(服务发现、DNS解析等)

  • 管理层:系统度量(如基础设施、容器和网络的度量),自动化(如自动扩展、动态Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)

  • 接口层:kubectl命令行工具、客户端SDK以及集群联邦

  • 生态系统:在接口层之上的庞大容器集群管理调度的生态系统,可以划分为两个范畴

  • Kubernetes外部:日志、监控、配置管理、CI、CD、Workflow、FaaS、OTS应用、ChatOps等

  • Kubernetes内部:CRI、CNI、CVI、镜像仓库、Cloud Provider、集群自身的配置和管理等

 

为什么 Kubernetes 是一个平台?

         Kubernetes 提供了很多的功能,总会有新的场景受益于新特性。它可以简化应用程序的工作流,加快开发速度。被大家认可的应用编排通常需要有较强的自动化能力。这就是为什么 Kubernetes 被设计作为构建组件和工具的生态系统平台,以便更轻松地部署、扩展和管理应用程序。

         Label允许用户按照自己的方式组织管理对应的资源。注解使用户能够以自定义的描述信息来修饰资源,以适用于自己的工作流,并为管理工具提供检查点状态的简单方法。

         此外,Kubernetes 控制面 (Control Plane) 是构建在相同的APIs上面,开发人员和用户都可以用。用户可以编写自己的控制器,调度器等等,如果这么做,根据新加的自定义API ,可以扩展当前的通用CLI命令行工具。

        这种设计使得许多其他系统可以构建在 Kubernetes 之上。

Kubernetes 不是什么:

        Kubernetes不是一个传统的,包罗一切的PaaS系统。我们保留用户的选择,这一点非常重要。

Kubernetes不限制支持应用的种类。它不限制应用框架,或者支持的运行时语言,也不去区分 “apps” 或者“services”。 Kubernetes致力于支持不同负载应用,包括有状态、无状态、数据处理类型的应用。只要这个应用可以在容器里运行,那么它就可以在Kubernetes上很多地运行。

Kubernetes不提供中间件(如message buses),数据处理框架(如Spark),数据库(如Mysql),或者集群存储系统(如Ceph)。但这些应用都可以运行于Kubernetes。

Kubernetes没有一个点击即可用的应用市场。

Kubernetes不部署源码不编译应用。持续集成的 (CI)工作流方面,不同的用户有不同的需求和偏好,因此,我们提供分层的 CI工作流,但并不定义它应该怎么做。

Kubernetes允许用户选择自己的日志、监控和报警系统。

Kubernetes不提供可理解的应用配置语言(e.g., jsonnet).

Kubernetes不提供或者任何综合的机器配置,维护,管理或者自愈系统。

         另一方面,大量的Paas系统都可以运行在Kubernetes上,比如Openshift, Deis, 和Gondor。你可以构建自己的Paas平台,CI集成。

        因为Kubernetes运行在应用而非硬件层面,它提供了普通的Paas平台提供的一些通用功能,比如部署,扩展,负载均衡,日志,监控等。然而,Kubernetes并非一个庞然大物,这些功能是可选的。

         另外,Kubernetes不仅仅是一个“编排系统”;它消弥了编排的需要。“编排”的定义是指执行一个预定的工作流:先做A,之后B,然后C。相反地,Kubernetes是由一系列独立的、可组合的驱使当前状态走向预想状态的控制进程组成的。怎么样从A到C并不重要:达到目的就好。当然也是需要中心控制的;方法更像排舞的过程。这让这个系统更加好用更加强大、健壮、 有弹性且可扩展。