01:kubernetes基础

1.1kubernetes简介

    参考博客:https://www.kubernetes.org.cn/k8s

  1、kubernetes介绍

      1. Kubernetes是容器集群管理系统,是一个开源的平台

      2. 可以实现容器集群的自动化部署、自动扩缩容、维护等功能。

      3. 目标是促进完善组件和工具的生态系统,以减轻应用程序在公有云或私有云中运行的负担。

      作用:

        1)快速部署应用
        2)快速扩展应用
        3)无缝对接新的应用功能
        4)节省资源,优化硬件资源的使用

      举例:

        1)Kubernetes一个核心的特点就是能够自主的管理容器来保证云平台中的容器按照用户的期望状态运行着
        2)比如用户想让apache一直运行,用户不需要关心怎么去做,Kubernetes会自动去监控,然后去重启,新建,总之,让apache一直提供服务

  2、kubernetes作用

    1)自我修复

        1. 在节点故障时重新启动失败的容器,替换和重新部署,保证预期我们设置的副本的数量;

        2. 杀死健康检测失败的容器,并且在没有准备好之前是不会处理客户端请求的(不对外提供服务),保证线上服务不中断

    2)弹性伸缩(比如618活动,保证我们服务的快速缩容和扩容)

        1. 使用命令、UI或者基于CPU使用情况自动快速扩容和缩容应用的程序实例(容器的副本数)

        2. 保证应用业务高峰并发时的高可用性;

        3. 在业务低峰时期回收资源,以减小成本运行服务

    3)自动部署和回滚

        1. k8s 采用滚动更新的策略更新应用,一次更新一个Pod,而不是同时删除所有的pod

        2. 如果更新过程中出现问题,将回滚更改,确保升级不影响业务

    4)服务发现和负载均衡

        1. k8s为多个容器提供一个统一访问入口(内部IP地址和一个DNS名称),并且负载均衡关联的所有容器,使得用户无需考虑容器IP的问题

    5)机密数据(密码,证书)和配置管理

        1. k8s提供存储能力(可以把密码加密放在容器存储中)

        2. 管理机密数据和应用程序的配置,而不需要把敏感的数据暴露在镜像里,提高敏感数据的安全性

        3. 并且可以把一些常用的配置存储在k8s中,方便应用程序的使用

    6)存储编排

        1. 挂载外部的存储系统,无论是来自本地存储,公有云,还是网络存储(NFS《GlustFS,Ceph)

        2. 都作为集群资源的一部分使用,极大的提高存储使用灵活性

    7)批处理

        1. 提供一次性任务,定时任务,满足批量数据处理和分析的场景

  3、核心组件:Pod

      1. 在Kubenetes中,所有的容器均在Pod中运行,一个Pod可以承载一个或者多个相关的容器

      2. 同一个Pod中的容器会部署在同一个物理机器上并且能够共享资源

      3. 一个Pod也可以包含0个或者多个磁盘卷组(volumes),这些卷组将会以目录的形式提供给一个容器,或者被所有Pod中的容器共享

      4. 对于用户创建的每个Pod,系统会自动选择那个健康并且有足够容量的机器,然后创建类似容器的容器

      5. 当容器创建失败的时候,容器会被node agent自动的重启,这个node agent叫kubelet

1.2 Kubernetes 集群架构与组件

    官网地址:https://www.kubernetes.org.cn/kubernetes设计架构

    参考博客:https://www.cnblogs.com/Su-per-man/p/11101823.html

  1、Kubernetes中master核心组件

    1)etcd

        1. 是Kubernetes的存储状态的数据库(所有master的持续状态都存在etcd的一个实例中);

        2. 它是一个集群分布式数据库,它可以提供分布式数据的一致性。

    2)apiserver

        1. Kubernetes的核心组件是API Server,它是Kubernetes系统和Etcd直接对话的唯一组件

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

    3)controller manager

        1. controller manager 是通过API Server 进行协调的组件,绑定到单独的服务器Master上;

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

    4)scheduler

        1. scheduler是通过API Server 进行协调的组件,绑定到单独的服务器Master上;

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

  2、Kubernetes中Node核心组件

    1)kubelet(Node Agent)

        1. kubelet负责管理pods和它们上面的容器,images镜像、volumes、etc。

        2. Agent负责监视绑定到其节点的一组Pod,并确保这些Pod正常运行,并且能实时返回这些Pod的运行状态。

    2)Container runtime

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

    3)kube-proxy

        1. kube-proxy网络代理和负载均衡,负责为Service提供cluster内部的服务发现和负载均衡;

kube-dns负责为整个集群提供DNS服务
Ingress Controller为服务提供外网入口
Heapster提供资源监控
Dashboard提供GUI
Federation提供跨可用区的集群
Fluentd-elasticsearch提供集群日志采集、存储与查询
其他组件

    注: Kubernetes集群包含有节点代理kubelet和Master组件(APIs, scheduler, etc),一切都基于分布式的存储系统。

  3、k8s工作原理

      1. 我们通过kubectl向k8s Master发出指令。

      2. kubernetes Master主要是提供API Server、Scheduler、Controller组件,接收kubectl的命令

      3. kubernetes Master主从Node节点获取Node的资源信息,并发出调度任务。

      4. Node节点提供kubelet、kube-proxy,每个node节点都安装docker,是实际的执行者。

      5. kubernetes不负责网络,所以一般是用flannel或者weave。

      6. etcd负责服务发现和node信息存储。

      

  4、分层架构

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

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

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

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

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

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

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

 1.3 创建pod的流程

  1.用户提交创建Pod的请求,可以通过API Server的REST API ,也可用Kubectl命令行工具,支持Json和Yaml两种格式;

  2.API Server 处理用户请求,存储Pod数据到Etcd;

  3.Schedule通过和 API Server的watch机制,查看到新的pod,尝试为Pod绑定Node;

  4.过滤主机:调度器用一组规则过滤掉不符合要求的主机(比如Pod指定了所需要的资源,那么就要过滤掉资源不够的主机);

  5.主机打分:对第一步筛选出的符合要求的主机进行打分,在主机打分阶段,调度器会考虑一些整体优化策略

                      比如:把一个Replication Controller的副本分布到不同的主机上,使用最低负载的主机等;

  6.选择主机:选择打分最高的主机,进行binding操作,结果存储到Etcd中;

  7.kubelet根据调度结果执行Pod创建操作:

    1)绑定成功后,会启动container, docker run,

    2)scheduler会调用API Server的API在etcd中创建一个bound pod对象,描述在一个工作节点上绑定运行的所有pod信息。

    3)运行在每个工作节点上的kubelet也会定期与etcd同步bound pod信息

    4)一旦发现应该在该工作节点上运行的bound pod对象没有更新,则调用Docker API创建并启动pod内的容器。

     

 

 

 

 

 

 

 

 

 

 

 

 

 

11111111111111111

posted @ 2019-08-02 19:56  不做大哥好多年  阅读(377)  评论(0编辑  收藏  举报