• Kubernetes-基本概念


    1 Kubernetes介绍

    单词:Kubernetes这个单词起源于希腊语,意为舵手或领航员,K8S即为缩写,其中8代表了“ubernete“这8个字符。
    来源:K8S前身是Google的Borg系统,2014年6月开源,2015年7月 K8S v1.0正式发布;

    1.1 概念

      Kubernetes(K8S)是一个软件系统,允许用户在其系统上部署和管理容器化的应用。
      Kubernetes是一种容器集群的管理系统,提供应用部署、维护、扩展机制等功能。
      K8S是2014年由Google公司启动;
      Kubernetes (K8s) is an open-source system for automating deployment, scaling, and management of containerized applications.

    From:https://kubernetes.io/

      K8S是一个全新的基于容器技术的分布式架构领先方案,属于Borg的一个开源版本,是大规模集群管理系统,基于容器技术,目的是实现资源管理的自动化,以及跨多个数据中心的资源利用率的最大化。
      K8S是一个开放的开发平台,不局限于一种语言,没有限定任何编程接口,可以用Java、Go、C++或者Python编写服务,这些都可以被映射为K8S的服务,并通过标准的TCP通信协议进行交互。
      K8S也是一个完备的分布式系统支撑平台,具备集群管理能力,包括多层次的安全防护和准入机制、多租户应用支撑能力、透明的服务注册和服务发现机制、内建的智能负载均衡器、强大的故障发现和自我修复能力、服务滚动升级和在线扩容能力、可扩展的资源自动调度机制,以及多粒度的资源配额管理能力。

    1.2 主要功能

    1) 完备的集群管理:能管理成百上千的容器。
    2)故障发现和自我修复:发现容器挂了,可以重新启动容器,来保障服务的正常运行。
    3)服务发现和负载均衡:通过服务发现去发现容器,如Service资源,它是对外提供一个固定的地址。
    4)服务滚动升级:容器存在不同的版本,可以通过一个一个的去将容器升级到需要的版本。
    5)弹性伸缩和在线扩容能力:弹性伸缩是一种后台自动的扩容和缩容(比如K8S监控容器的cpu负载较高,会去增加一些容器),在线扩容是人工交互的一种扩容,人为的通过K8S增加容器的个数去扩容。

    2 Kubernetes核心功能

    K8S简介系统图

    by Kubernetes in Action

      整个系统由一个主节点+多个工作节点组成,开发者把一个应用列表提交到主节点,K8S将其部署到集群的工作节点,开发者和系统管理员无需关注部署到哪个工作节点。

    3 节点类型

    • 主节点:承载着K8s控制和管理整个集群系统的控制面板;负责管理集群,提供集群的资源数据访问入口。
    • 工作节点:运行用户实际部署的应用;
      K8S架构图

    3.1 控制面板(master)

      控制面板用于控制集群并使它工作。其组件持有并控制集群状态,但应用程序的运行是由工作节点完成。

    • API Server:用户及其他组件都需要与之通信,其提供了资源操作的唯一入口,并提供认证、授权、访问控制、API注册和发现等机制;
    • etcd:一个可靠的分布式数据存储,可以持久化存储集群配置,保存整个集群的状态;
    • Controller Manager:负责维护集群的状态,如故障检测、自动扩展、滚动更新等;
    • Scheduler:负责资源的调度;(为应用的每个可部署组件分配一个工作节点)

    3.2 工作节点

      工作节点是运行容器化应用的机器,node是K8S集群架构中运行pod的服务节点。其中pod是K8S调度的最小颗粒,不是单纯的容器,是一个或多个容器的组合,是抽象成一个pod,pod 是一个可以被构建、销毁、调度、管理的最小的部署单元。

    • Kubelet:负责维护容器的生命周期,与API服务器通信,并管理它所在节点的容器;
    • Container runtime:负责镜像管理以及Pod和容器的真正运行,如docker等容器类型;
    • Kube-proxy:负责组件之间的服务发现和负载均衡网络流量;

    3.3 工作流程

    1、准备包含应用程序的Deployment的yml文件,然后通过kubectl客户端工具发送给ApiServer。
    2、ApiServer接收到客户端的请求并将资源内容存储到数据库(etcd)中。
    3、Controller组件(包括scheduler、replication、endpoint)监控资源变化并作出反应。
    4、ReplicaSet检查数据库变化,创建期望数量的pod实例。
    5、Scheduler再次检查数据库变化,发现尚未被分配到具体执行节点(node)的Pod,然后根据一组相关规则将pod分配到可以运行它们的节点上,并更新数据库,记录pod分配情况。
    6、Kubelete监控数据库变化,管理后续pod的生命周期,发现被分配到它所在的节点上运行的那些pod。如果找到新pod,则会在该节点上运行这个新pod。
    7、kube-proxy运行在集群各个主机上,管理网络通信,如服务发现、负载均衡。当有数据发送到主机时,将其路由到正确的pod或容器。对于从主机上发出的数据,它可以基于请求地址发现远程服务器,并将数据正确路由,在某些情况下会使用轮循调度算法(Round-robin)将请求发送到集群中的多个实例。

    4 Kubernetes运行应用

    在K8s中运行应用
    1)将应用打包进一个或多个容器镜像;
    2)将镜像推送到镜像仓库中;
    3)将应用的描述发布到Kubernetes API服务器;
    4)在向K8s提交描述符之后,将把每个pod的指定副本数量调度到可用的工作节点上;
    5)节点上的Kubelets将告知Docker从镜像仓库中拉取容器镜像并运行容器;
    6)应用程序运行后,K8s就不断地确认应用程序的部署状态始终与所提供的描述相匹配。

    故障处理
    1)如果运行的实例中挂了一个,如当前进程崩溃或停止响应,K8s将自动重启该实例;
    2)如果整个工作节点死亡或无法访问,则K8s将为在故障节点上运行的所有容器选择新节点,并在新节点上运行这些容器。

    5 Kubernetes优势

    1、 简化应用程序部署
      K8s将所有工作节点公开为一个部署平台,应用程序开发人员可自行部署应用程序,这些节点都是一组等待应用程序使用它们的计算资源,开发人员无需关注应用程序在何处运行,只需要这些资源足够即可。
    2、更好利用硬件
      通过使用容器,不再用将应用绑定到一个特定的集群节点上,而是允许应用程序在任何时间都在集群中自由迁移,K8s运行应用程序时,其根据应用程序的资源需求描述和每个节点的可用资源选择最合适的节点来运行应用程序。在集群上移动应用程序的能力,可以更好的利用底层基础设施。
    3、健康检查和自修复
      K8s监控应用程序组件和所运行的节点状态,当节点出现故障或不可访问时,K8s将自动调度其他节点来运行这些应用程序。便于运维团队更好的选择合适的时机去修复这些故障节点,而无需迁移应用程序。
    4、自动扩容
      K8s监控每个应用程序的使用资源情况,不断调整每个应用程序的运行实例数量,可以根据部署的应用程序的需要自动地将整个集群规模放大或缩小。
    5、简化应用部署
      对于开发人员,应用程序开发和生产流程中都运行在同一个环境中,有助于在开发阶段就发现bug而不会在生产流程中出现该bug。应用程序可以直接查询K8s API服务器从而获得该信息和其他信息。
    总结:
    1)K8s将整个数据中心暴露为用于运行应用程序的单个计算资源;
    2)开发人员可以通过K8s部署应用程序,而无需系统管理员的任何帮助;
    3)通过让K8s自动处理故障节点,自动调度新节点运行应用程序,系统管理员处理故障节点的时间不受限制;

    6 相关术语

    6.1 Pods

    Pod是在K8s集群中运行部署应用或服务的最小单元,它是可以支持多容器的。Pod的设计理念是支持多个容器在一个Pod中共享网络地址和文件系统。

    6.2 Service

    稳定地提供服务需要服务发现和负载均衡能力。

    6.3 Labels

    键值对,与某种资源关联以提供标识定位能力的属性。

    6.4 Deployment

    Deployment集成了上线部署、滚动升级、创建副本、暂停上线任务,恢复上线任务,回滚到以前某一个版本(成功/稳定)等功能。

    6.5 Volumes

    用于存储持久化数据,不同类型的Volume有不同的生命周期,其中Pv可以脱离Pod的生命周期存在从而可以支撑需要长久保存的数据。

    6.6 Kubernetes StatefulSet

    保持状态,包括稳定的网络标识,持久化卷;有序的启动、销毁和滚动升级。

  • 相关阅读:
    Java Mysql连接池配置和案例分析--超时异常和处理
    springmvc学习笔记--Interceptor机制和实践
    Apache HttpClient使用之阻塞陷阱
    springmvc学习笔记--REST API的异常处理
    基于redis的排行榜设计和实现
    MySQL修改root密码的方法总结
    Ubuntu 16.04下安装golang
    锁优化的手段总结
    Java内存溢出问题总结
    GC日志时间分析
  • 原文地址:https://www.cnblogs.com/Andya/p/12402870.html
Copyright © 2020-2023  润新知