一、简介

  1、什么是Kubernetes

    简称K8s,用8代替8个字符“ubernerte”而成的速写,K8s是一个开源的容器编排平台,它是一个跨主机集群的开源容器调度平台,用于管理云平台中多个主机上的容器化的应用,它可以自动化应用容器的部署、扩展、的操作,k8s的目标是让部署容器化的应用简单并且高效,构建一个软件和工具的生态系统,以减轻企业在公有云或私有云运行应用程序的负担,;K8s提供了应用部署、规划,更新,维护的一种机制。

    K8s项目由Google公司在2014年启动,Kubernetes建立在google公司超过十余年阿运维经验基础之上,Google所有的应用都运行在容器上,再与社区中最好的想法和实践相结合,也许它是现在最受欢迎的容器平台。

  2、使用K8s可以快速高效响应客户的需求:

    快速、可预测地部署您的应用程序

    拥有即使扩展应用程序的能力

    不影响现有业务的情况下,无缝地发布新功能

    优化了硬件资源,降低成本

  3、K8s具有如下特点:

    便捷性:无论公有云、私有云、混合云还是多云架构都全面支持

    可扩展性:它是模块化、可插拔、可挂载、可组合,支持各种形式的扩展

    自修复:它可以自保持应用状态、可自重启、自复制、自缩放的,通过声明式语法提供了强大的自修复能力

  4、三个时代说明,K8s为什么如此有用

    传统部署时代:早期,组织都是再物理服务器上运行应用程序,无法位物理服务器中的应用定义资源边界,着会导致资源分配问题。比如,如果再物理服务器上运行多个应用程序,可能会出现一个应用占用大部分资源,其他应用程序的性能就将下降,解决方案往往是在不同服务器上运行每个应用程序,但这并没有随着资源利用不足而扩展资源,并且维护诸多物理服务器成本也很高。

    虚拟化部署时代:为了解决上面提到的资源分配问题,引入了虚拟化,它允许在单个物理服务器的CPU上允许多个虚拟机(VM)。虚拟化允许应用程序在VM之间隔离,并提供安全级别,因为一个应用程序的信息不能被另一个应用程序自由访问。

            虚拟化可以更好的利用物理服务器中资源,并可以实现更好的可伸缩性,因为可以轻松地添加或更新应用程序,降低硬件成本等等。借助虚拟化,您可以将一组物理资源呈现位一组一次性虚拟机。

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

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

  5、补充使用容器的好处

    敏捷的应用程序创建和部署:与使用VM镜像相比,容器镜像创建的简便性和效率更高。

    持续的开发,集成和部署:通过快速简单的回滚(镜像不可更改),提供可靠且频繁的容器镜像构建和部署。 

    开发和运营的关注点分离:在构建/发布时,而不时在部署时创建应用程序容器镜像,从而将应用程序与基础架构分离。

    可观察性不仅可以显示操作系统级别的信息和指标,还可以显示应用程序的运行状况和其他信号。

    跨开发,测试和生成环境一致性:在便捷式计算机上与在云中相同的运行。

    云和操作系统分发的可移植性:可在Ubuntu,RHEL,coreOS,本地,google kubernetes engine和其他任何地方运行。

    松散耦合,分布式,弹性,解放的微服务:应用程序被分解成较小的独立部分,并且可以动态部署和管理,而不时在一台大型单机上运行的整体堆栈。

    资源隔离:可预测的应用程序性能。

    资源利用:高效率和高密度。

  6、K8s提供了哪些功能

    服务发现和负载均衡

      K8s可以使用DNS名称或使用其自己的IP地址公开容器。如果到容器的流量很高,K8s可以负载均衡分配流量,使部署稳定

    存储编排

      允许自动挂载选择的存储系统,例如本地存储,公有云提供商等。

    自动部署和回滚

      可以使用Kunbernetes描述已经部署容器的所需状态,并可以以控制速率将实际状态更改所需状态。比如可以自动化Kubernetes来位您的部署创建新容器,删除现有容器并将他们的所有资源用于新容器

    自动包装

      一个Kubernetes集群,可以用于容器化任务,可以指定每个容器需要多少CPU和内存,使其充分利用资源。   

    自检

      Kubernetes可以重新启动失败的容器,替换容器,杀死对用户定义的运行状态检查没有响应的容器,并且在准备好服务之前不会将其通告给客户端

    加密管理

      Kubernetes允许存储和管理敏感信息,如密码,auth令牌和ssh密钥,可以部署和更新机密的应用程序配置,而无需重新构建容器镜像,也无需在堆栈配置中公开。

  7、kubernetes不是什么

    不是一个传统意义上包罗万象的Paas系统,它保留用户的自由选择,比如:

      不限制支持的应用程序类型,不限制应用程序框架,不限制支持的语言(java/python/ruby)支持多种多样的工作负载,包括无状态,有状态和数据处理工作负载。

      不提供内置服务的中间件(例如:消息中间件)、数据处理框架(例如:spark)、数据库(例如:mysql)和分布式存储(例如Ceph),这些应用可以允许在K8s上。

      没有提供点击即部署的服务市场。

      源代码到镜像都是开源的,它不部署源代码且不构建您的应用程序。持续集成,交付和部署(CI/CD)工作流取决各公司组织的文化和偏好。

      允许用户选择其他的日志记录,监控和告警系统,(它也提供一些集成作为概念证明)。

      不提供也不要求应用程序配置语言/系统,提供一个声明性API,可以通过任意形式的声明性规范。

      不提供也不采用任何全面的机器配置,维护,管理或自动修复系统。

     另外许多Paas系统运行在K8s上面,比如openshift,deis,eldarion,可以自定义自己的paas与自己选择的CI系统集成,或与K8s一起使用,将容器镜像部署到K8s上。

    由于K8s在应用级别而不是仅仅在硬件级别运行,因此它提供Paas产品通用的一些功能,如:部署、扩展、负载均衡、日志记录、监控等。但是K8s不是单一的,默认是可选和可插拔的。

    K8s也不仅仅是一个编排系统,它消除了编排的需要,编排代表工作流的执行为从A到B,然后到C,相反,K8s是包括一套独立、可组合的控制过程,通过声明式语法使其连续地朝向期望状态驱动当前状态,不需要告诉它具体的从A到C的过程,只需要告诉到C的状态即可,也不需要集中控制,这使得系统更易于使用,并且强大,更具有弹性和扩展性。

二、K8s架构

  1、整体架构

三、常见组件

    请见图示1:分别包含1、2、3、4

  1、master:

    Kubernetes管理节点

  2、apiserver:

    提供接口服务,用户通过apiserver来管理整个容器集群平台。API Server负责和Etcd交互(其他组件不会直接操作etcd,只有API Server这么做),整个Kubernetes集群的所有交互都是以API server为核心的。如:1、所有对集群进行的查询和管理都要通过API来进行;2、所有模块之间并不会互相调用,而是通过和API Server打交道来完成自己那部分的工作、API Server提供的验证和授权保证了整个集群的安全

  3、scheduler Kubernetes 调度服务:

  4、Replication Controllers 复制:

     保证pod的高可用

     Replication Controller是Kubernetes系统中最有用的功能,实现复制多个Pod副本,往往一个应用需要多个Pod来支撑,并且可以保证其复制的副本数,即使副本所调度分配的宿主机出现异常,通过Replication Controller 可以保证在其它宿主机启用同等数量的Pod。Replication Controller 可以通过repcon模板来创建多个Pod副本,同样也可以直接复制已存在Pod,需要通过Label selector来关联

    请见图示2:包含5、6、7、8

  5、minion:

    真正运行容器container的物理机。Kubernets中需要很多minion集群,来提供运算

  6、container:

    容器,可以运行服务和程序

  7、Pod:

    Kubernetes系统中,调度的最小颗粒不是单纯的容器,而是抽象成一个Pod,Pod是一个可以被创建、销毁、调度、管理的最小部署单元。pod中可以包括一个或一组容器。

      pod:豆荚的意思,如下图示理解pod及容器实例:

  8、Kube_prox 代理:

    做端口转发,相当于LVS-NAT模式中的复制调度器

    Proxy解决了同一宿主机,相同服务端口冲突的问题,还提供了对外服务的能力,Proxy后端使用了随机、轮询负载均衡算法。

  9、etcd:

    存储Kubernetes的配置信息,可以理解为K8s数据库,存储这K8s容器平台所有节点、pods、网络等信息

  10、services:

    services是Kunbernetes最外围的单元,通过虚拟一个访问IP及服务端口,可以访问我们定义好的Pod资源。目前的版本是通过iptables的nat转发来实现,钻发的目标端口为Kube_proxy生成的随机端口。

  11、Lables标签:

    Lables是用于区分Pod、Service、Replication Controller的key/value键值对,仅使用在Pod、Service、Replication Controller之间的关系识别,但对这些单元本身进行操作时得使用name标签。

  12、Deployment部署

      Kubernetes Deployment用于更新Pod和Replica Set(下一代的Replication Controller)的方法,可以在Deployment对象中只描述你所期望的理想专题(预期运行状态),Deployment控制器会将现在的实际状态转换成期望的状态。例如,将所有的webapp:v1.0.9升级成webapp:v1.1.0,只需要创建Deployment,Kubernetes会按照Deployment自动进行升级,通过Deployment可以用来创建新的资源

      Deployment可以帮我们实现无人值守的上学,大大降低我们上线的复杂和风险

  13、Kubelet命令

      Kubelet和Kube-proxy都运行在minion节点上

      Kube-proxy实现Kubernetes网络相关内容

      Kubelet命令管理pod、pod中容器机让其的镜像和卷等信息

  14、总结:各组件之间的关系

    1)、kubernetes由一个master和多个minion组成,master通过api提供服务接收kubectl的请求来调度管理集群,kubectl是k8s平台的一个管理命令

    2)、Replication controller定义了多个pod或者容器需要运行,如果当前集群中运行的pod或容器达不到配置的数量,replication controller会调度容器在多个minion上运行,保证集群中的pod数量

    3)、service则定义真实对外提供的服务,一个service会对应后端运行的多个container。

    4)、Kubernetes是一个管理平台,minion上的kube-proxy拥有提供真实服务公网IP,客户端访问K8S中提供的服务,是直接访问到kube-proxy上的。

    5)、在kubernetes中pod是一个基本单元,一个pod可以是提供相同功能的多个container,这些容器会被部署在同一个minion上,minion是运行Kubelet中容器的物理机,minion介绍master的指令创建pod或者容器。

作者 Qi, Asura

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注