zoukankan      html  css  js  c++  java
  • 一、Kubernetes概述

    一、Kubernetes概述

    1.1 容器编排工具

    支持应用程序的容器的部署和组织称为容器编排,这是通过容器编排工具完成的。一些流行的开源容器编排工具包括Kubernetes、Docker Swarm和LXC

    • docker官方编排工具
    docker compose    # 单机编排工具
    docker swarm      # 将多台 docker 提供的计算资源整合的接口,随后 docker compose 编排的时候只需要面向这个整合的接口进行编排就行,无论接口下有多少个主机。
    docker mechine    # 将一个主机初始化为一个能够加入 docker swarm 集群中的预置程序
    
    • Kubernetes
    目前最流行的容器编排工具,市场占有率最高
    

    1.2 Kubernetes

    kubernetes 是希腊语,翻译过来是:舵手的意思,它的原型是谷歌内部使用 Borg 集群管理系统,可以说是集结了 Borg 设计思想的精华,并且吸收了 Borg 系统中的经验和教训。

    它的目标不仅仅是一个编排系统,而是提供一个规范,可以让你来描述集群的架构,定义服务的最终状态,Kubernetes可以帮你将系统自动地达到和维持在这个状态。Kubernetes作为云原生应用的基石,相当于一个云操作系统,其重要性不言而喻。

    kubernetes 在 2014 年发布了第一个版本,目前开源并托管在 Github 上。

    https://github.com/Kubernetes
    

    目前,AWS、阿里云、微软云,目前已经原生支持 K8S ,目前已经可以让用户直接部署云原生的服务。

    • Kubernetes 特点
    - 可移植:支持公有云,私有云,混合云,多重云(multi-cloud)
    
    - 可扩展:模块化, 插件化, 可挂载, 可组合
    
    - 自动化:自动部署,自动重启,自动复制,自动伸缩/扩展
    
    • Kubernetes优势
    - 基于 Borg 系统,设计成熟,开源、且轻量级,简单易学、容易理解;
    
    - 模块化,可插拔,支持钩子,可任意组合,例如:网络组件 flannel,存储插件;
    
    - 故障发现(存活性探针)和自我修复能力(副本数量)、服务滚动升级(就绪探针)和在线扩容(副本数量)密钥和配置管理;
    
    - 可扩展的资源自动调度机制(多维度的水平自动扩容)、多粒度的资源配额管理能力(资源限制)。
    

    1.3 为什么使用Kubernetes

    由于 Kubernetes 是一个开源项目,您可以用它在任何地方运行您的容器化应用程序,而无需更换操作工具。Kubernetes 由志愿者组成的大型社区进行维护,并且在不断改进。此外,其他很多开源项目和供应商都在构建和维护与 Kubernetes 兼容的软件,您可以利用这些软件改进并扩展您的应用程序架构

    - 大规模运行应用程序
    Kubernetes 允许您定义复杂的容器化应用程序,并能跨服务器集群大规模运行这些应用程序
    - 无缝迁移应用程序
    借助 Kubernetes,可以使用相同的操作工具将容器化应用程序从本地开发机器无缝迁移到云中的生产部署。
    - 随处运行
    云服务上运行高度可用且可扩展的 Kubernetes 集群,同时保持与本地运行的 Kubernetes 部署完全兼容
    - 添加新功能
    Kubernetes 是一个开源项目,因此很容易为其添加新功能。由开发人员和企业组成的大型社区积极构建可以让 Kubernetes 实现更多功能的扩展、集成和插件
    

    1.4 Kubernetes 的工作原理

    Kubernetes 的具体工作原理就是根据可用计算资源和每个容器的资源要求,管理计算实例集群,并调度要在集群上运行的容器。在逻辑分组中运行的容器被称为 Pod,您可以将一个或多个容器作为一个 Pod 进行运行和扩展。

    Kubernetes 控制层面软件确定何时何地运行 Pod、管理流量路由选择,以及根据利用率或您定义的其他指标扩展 Pod。Kubernetes 可以根据资源需求自动在集群上启动 Pod,并在 Pod 或它们运行的实例出现故障时自动重启 Pod。每个 Pod 都会获得一个 IP 地址和一个 DNS 名称,Kubernetes 用它们来连接您的服务和外部流量

    awk参考

    二、架构和组件

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

    ![https://raw.githubusercontent.com/kubernetes/kubernetes/release-1.2/docs/design/architecture.png]

    同时Kubernetes 是一个集群,整合多台计算机的计算能力,它是一种有中心节点模式的集群,在 K8S 集群中主机分为两种角色:

    Master:集群的管理节点,有一个或者一组节点,一般 3 个足够了。
    nodes:提供计算资源的节点,就是运行容器的节点,可以扩展。
    

    2.1 Master组件

    Master组件提供K8S集群的管理控制中心,包含四个主要的组件:API Server、Controller、Scheduler 以及 etcd,如下图

    https://feisky.gitbooks.io/kubernetes/architecture/images/14791969222306.png

    • API Server:顾名思义是用来处理 API 操作的,Kubernetes 中所有的组件都会和 API Server 进行连接,组件与组件之间一般不进行独立的连接,都依赖于 API Server 进行消息的传送;
    • Controller:是控制器,它用来完成对集群状态的一些管理。比如刚刚我们提到的两个例子之中,第一个自动对容器进行修复、第二个自动进行水平扩张,都是由 Kubernetes 中的 Controller 来进行完成的;
    • Scheduler:是调度器,“调度器”顾名思义就是完成调度的操作,就是我们刚才介绍的第一个例子中,把一个用户提交的 Container,依据它对 CPU、对 memory 请求大小,找一台合适的节点,进行放置;
    • etcd:是一个分布式的一个存储系统,API Server 中所需要的这些原信息都被放置在 etcd 中,etcd 本身是一个高可用系统,通过 etcd 保证整个 Kubernetes 的 Master 组件的高可用性。

    2.2 node组件

    Kubernetes 的 Node 是真正运行业务负载的,每个业务负载会以 Pod 的形式运行。一个 Pod 中运行的一个或者多个容器,真正去运行这些 Pod 的组件的是叫做 kubelet,也就是 Node 上最为关键的组件,它通过 API Server 接收到所需要 Pod 运行的状态,然后提交到我们下面画的这个 Container Runtime 组件中

    节点组件运行在Node,提供Kubernetes运行时环境,以及维护Pod。

    • kubelet

    kubelet是主要的节点代理,它会监视已分配给节点的pod,具体功能:

    安装Pod所需的volume。
    
    下载Pod的Secrets。
    
    Pod中运行的 docker(或experimentally,rkt)容器。
    
    定期执行容器健康检查。
    
    Reports the status of the pod back to the rest of the system, by creating a *mirror pod* if necessary.
    
    Reports the status of the node back to the rest of the system.
    
    • kube-proxy
    [kube-proxy](https://kubernetes.io/docs/admin/kube-proxy)通过在主机上维护网络规则并执行连接转发来实现Kubernetes服务抽象。
    
    • docker
    docker用于运行容器。
    
    • RKT
    rkt运行容器,作为docker工具的替代方案。
    
    • supervisord
    supervisord是一个轻量级的监控系统,用于保障kubelet和docker运行
    
    • fluentd
    fluentd是一个守护进程,可提供
    

    cluster-level logging.。

    Kubernetes集群的图,所有的组件都绑在一起

    2.3 Kubernetes 的核心概念

    2.3.1 核心概念-Pod

    Pod 是 Kubernetes 的一个最小调度以及资源单元。用户可以通过 Kubernetes 的 Pod API 生产一个 Pod,让 Kubernetes 对这个 Pod 进行调度,也就是把它放在某一个 Kubernetes 管理的节点上运行起来。一个 Pod 简单来说是对一组容器的抽象,它里面会包含一个或多个容器

    2.3.2 核心概念-Volume

    Volume 就是卷的概念,它是用来管理 Kubernetes 存储的,是用来声明在 Pod 中的容器可以访问文件目录的,一个卷可以被挂载在 Pod 中一个或者多个容器的指定路径下面。

    而 Volume 本身是一个抽象的概念,一个 Volume 可以去支持多种的后端的存储。比如说 Kubernetes 的 Volume 就支持了很多存储插件,它可以支持本地的存储,可以支持分布式的存储,比如说像 ceph,GlusterFS ;它也可以支持云存储,比如说阿里云上的云盘、AWS 上的云盘、Google 上的云盘等等

    2.3.3 核心概念-Deployment

    Deployment 是在 Pod 这个抽象上更为上层的一个抽象,它可以定义一组 Pod 的副本数目、以及这个 Pod 的版本。一般大家用 Deployment 这个抽象来做应用的真正的管理,而 Pod 是组成 Deployment 最小的单元。

    Kubernetes 是通过 Controller,也就是我们刚才提到的控制器去维护 Deployment 中 Pod 的数目,它也会去帮助 Deployment 自动恢复失败的 Pod。

    比如说我可以定义一个 Deployment,这个 Deployment 里面需要两个 Pod,当一个 Pod 失败的时候,控制器就会监测到,它重新把 Deployment 中的 Pod 数目从一个恢复到两个,通过再去新生成一个 Pod。通过控制器,我们也会帮助完成发布的策略。比如说进行滚动升级,进行重新生成的升级,或者进行版本的回滚

    2.3.4 核心概念-Namespace

    Namespace 是用来做一个集群内部的逻辑隔离的,它包括鉴权、资源管理等。Kubernetes 的每个资源,比如刚才讲的 Pod、Deployment、Service 都属于一个 Namespace,同一个 Namespace 中的资源需要命名的唯一性,不同的 Namespace 中的资源可以重名。

    Namespace 一个用例,比如像在阿里巴巴,我们内部会有很多个 business units,在每一个 business units 之间,希望有一个视图上的隔离,并且在鉴权上也不一样,在 cuda 上面也不一样,我们就会用 Namespace 来去给每一个 BU 提供一个他所看到的这么一个看到的隔离的机制

    Kubernetes中文文档

    从零开始入门 K8s:详解 K8s 核心概念

  • 相关阅读:
    最长严格上升子序列
    01背包
    八数码难题
    跳石头
    立体图
    质因数分解 2012年NOIP全国联赛普及组
    多项式输出 2009年NOIP全国联赛普及组
    绕钉子的长绳子
    数星星
    进制转换
  • 原文地址:https://www.cnblogs.com/pansn/p/13220927.html
Copyright © 2011-2022 走看看