本章目录

  1. k8s概述
  2. k8s系统架构
  3. k8s工作流程图

一  概述

  • k8s是什么

  k8s是谷歌公司基于内部容器管理系统borg开源出的一个容器集群管理工具,它是用go语言开发,提供了容器的应用部署,规划,更新,维护等功能。

    相信你读这篇文章之前,你已经有了docker基础。并且对k8s已经有个大概的理解,所以关于k8s的背景知识不做过多赘婿,下面我们直接上干货

二  系统架构

  • k8s系统架构

  学习新知识之前,一定要先对知识的整体框架有个大概的了解,为了更加生动形象的理解k8s框架,我在网上找了一张图(图片出处见水印),我们日后的

    学习也会按照架构图上的知识点一点一点的铺散开来

  

  下面我们将架构图逐一拆解

  1. k8s操作对象

  pod,service,replication  controller三种就是我们日常经常操作的三类对象,当然,在k8s中,不仅仅只有这几种类型的资源,还有namespace,secret,node,

  ingress,configmap等等

  下面我们简单的对这三种资源做下介绍

  • pod

  pod在英文中的意思是豆荚,我们可以把容器想象成一个个的豆子,pod就是包裹住这些豆子的豆荚

  

  Pod是K8s集群中所有业务类型的基础,也是k8s集群中可操作的最小单元。可以看作运行在K8s集群中的小机器人,不同类型的业务就需要不同类型的小机器人去执行。目前

  K8s中的业务主要可以分为长期伺服型(long-running) 、批处理型(batch)、节点后台支撑型(node-daemon)和有状态应用  型(stateful application);分别对应的小机

  器人控制器为Deployment、Job、DaemonSet和PetSet(现在不叫petset而叫statefulset)。

  • replication  controller

  RC是K8s集群中最早的保证Pod高可用的API对象。比如有这样一个场景,你要启动俩个或者更多相同功能的pod容器来提供服务,我们总不能手动的一个个的去启动这些pod,然

  后再去手动管理他吧?这种做法明显很low,k8s早已经为我们做好一个pod管理器,叫做replication controller,专门为我们管理那些带有副本的pod。replication controller通过监控

  运行中的Pod来保证集群中运行指定数目的Pod副本。指定的数目可以是多个也可以是1个;少于指定数目,RC就会启动运行新的Pod副本;多于指定数目,RC就会杀死多余的Pod

  副本,控制器在做这些操作的时候完全不用我们去人工参与,他已经自己为我们做好这一切。即使在指定数目为1的情况下,通过RC运行Pod也比直接运行Pod更明智,因为RC也可

  以发挥它高可用的能力,保证永远有1个Pod在运行。RC是K8s较早期的技术概念,只适用于长期伺服型的业务类型,比如控制pod提供高可用的Web服务。当前RS已经取代了历史

  版本的RC,RS是最新一代的RC控制器,他提供了更多的匹配模式,而且RS一般也不单独使用,而是作为deployment的理想化参数去使用

  • service

  service一种抽象的服务,RC、RS和Deployment只是保证了支撑服务的微服务Pod的数量,但是没有解决如何访问这些服务的问题。一个Pod

  只是一个运行服务的实例,随时可能在一个节点上停止,在另一个节点以一个新的IP启动一个新的Pod,因此不能以确定的IP和端口号提供服务。

  要稳定地提供服务需要服务发现和负载均衡能力。服务发现完成的工作,是针对客户端访问的服务,找到对应的的后端服务实例。在K8s集群中,

  客户端需要访问的服务就是Service对象。每个Service会对应一个集群内部有效的虚拟IP,集群内部通过虚拟IP访问一个服务。在K8s集群中微服

  务的负载均衡是由Kube-proxy实现的。Kube-proxy是K8s集群内部的负载均衡器。它是一个分布式代理服务器,在K8s的每个节点上都有一个;这

  一设计体现了它的伸缩性优势,需要访问服务的节点越多,提供负载均衡能力的Kube-proxy就越多,高可用节点也随之增多。与之相比,我们平时

  在服务器端做个反向代理做负载均衡,还要进一步解决反向代理的负载均衡和高可用问题。

  2. 功能组件

  在k8s集群中,共有俩部分,分为master节点与node节点,master节点还有node节点都对应一台实体服务器或者虚拟机

  上面的功能组建遗漏了俩个最重要的部分,所以我们给他补上

  

  针对以上组件,我们做一下简要说明

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

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

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

    flannel: 负责让不同机器上面pod跨节点进行网络通信

    etcd: 提供强一致型的数据库与服务发现,在k8s集群中,网络配置还有资源对象的信息都存储在ETCD中

三  工作流程

  

  上面的流程图意在通过yaml文件创建一个deployment资源,先画个图说一下pod,replicaset,deployment三者关系,不然下面的流程解释初学者看不懂

  

  因为deployment包含replicaset包含pod,所以创建deployment的时候会连续创建三种资源

  1、准备好一个包含应用程序的Deployment的yml文件,然后通过kubectl客户端工具发送给ApiServer,ApiServer接收到客户端的请求并将资源内容存储到数据库(etcd)中。

  2、deloyment Controlle监控apiserver状态发生了改变,知道了apiserver需要创建一个deployment资源

  3、deployment controller 根据apiserver的状态信息,想要去创建一个ReplicaSet,此时apiserver检测到了deployment controller的期望状态的变化,再次记录到数据库etcd中

  4、replicaset 监控到了apiserver状态发生了改变,知道了apiserver需要创建一个replicaset

  5、replicaset controller根据apiserver的状态信息,想要去创建一个pod,此时apiserver检测到了replicaset controller的期望状态的变化,再次记录到数据库etcd中,此时

       最低级别的pod的创建准备工作也完成,此时实际上pod,replicaset,deployment三种资源都没有实际被创建,刚才所说的创建类似于一种演习

  6、Scheduler再次检查数据库变化,发现尚未被分配到具体执行节点(node)的Pod

  7、根据一组相关规则将pod分配到可以运行它们的节点上,并更新数据库,记录pod分配情况。

  8、Kubelete监控数据库变化,此时kubelet知道自己该创建pod了,但是它本身并没有创建容器的功能,所以它通知了有创建容器功能的docker引擎,并把创建的约束信息

      (如镜像名称,镜像源等)传递给docker引擎

  9、docker引擎根据收到的信息开始拉取镜像,创建容器,此时,deployment才算真正创建成功

四  小结

  以上就是k8s的简单介绍,后续我们将更深入的讲解每一个组件与功能

  文中如有错误之处,请大家向我及时指出,谢谢

k8s-No.1-概述与架构的更多相关文章

  1. Kubernetes K8S之kube-prometheus概述与部署

    Kubernetes K8S之kube-prometheus概述与部署 主机配置规划 服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟) k8s-master CentOS7. ...

  2. TOGAF架构内容框架之概述及架构工作产品分类

    TOGAF架构内容框架之概述及架构工作产品分类 在TOGAF 9之前的版本中,TOGAF的重点主要集中在企业架构开发方法方面,用于指导其使用者如何在各自的组织中对企业架构进行创建和维护,而对于企业架构 ...

  3. 大型互联网架构概述 关于架构的架构目标 典型实现 DNS CDN LB WEB APP SOA MQ CACHE STORAGE

    大型互联网架构概述 目录 架构目标 典型实现 DNS CDN LB WEB APP SOA MQ CACHE STORAGE 本文旨在简单介绍大型互联网的架构和核心组件实现原理. 理论上讲,从安装配置 ...

  4. 阿里P8架构师深度概述分布式架构

    简介 作为一名架构师,我们要专业,要能看懂代码,及时光着臂膀去机房,也能独挡一面!及时同事搞不定问题,或者撂挑子,你也能给老大一个坚定的眼神:不怕,有我在!还能在会议室上滔滔不绝,如若无人,让不懂技术 ...

  5. Java 异常(一) 异常概述及其架构

    Java 异常(一) 异常概述及其架构 一.异常概述 (一).概述 Java异常是Java提供的一种识别及响应错误的一致性机制.异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常 ...

  6. 基于k8s的集群稳定架构-转载

    基于k8s的集群稳定架构-转载 前言 我司的集群时刻处于崩溃的边缘,通过近三个月的掌握,发现我司的集群不稳定的原因有以下几点: 1.发版流程不稳定 2.缺少监控平台[最重要的原因] 3.缺少日志系统 ...

  7. 001-docker概述、架构、window安装、基本测试

    一.概述 Docker 是一个开源的应用容器引擎,基于 Go 语言 并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中,然后发布到任何流 ...

  8. 基于k8s的集群稳定架构

    前言 我司的集群时刻处于崩溃的边缘,通过近三个月的掌握,发现我司的集群不稳定的原因有以下几点: 1.发版流程不稳定 2.缺少监控平台[最重要的原因] 3.缺少日志系统 4.极度缺少有关操作文档 5.请 ...

  9. 企业架构研究总结(29)——TOGAF架构内容框架之概述及架构工作产品分类

    在TOGAF 9之前的版本中,TOGAF的重点主要集中在企业架构开发方法方面,用于指导其使用者如何在各自的组织中对企业架构进行创建和维护,而对于企业架构的具体内容并没有相关的论述,因而针对早期TOGA ...

  10. kubernetes-整体概述和架构

    1.Kubernetes是什么 Kubernetes是一个轻便的和可扩展的开源平台,用于管理容器化应用和服务.通过Kubernetes能够进行应用的自动化部署和扩缩容.在Kubernetes中,会将组 ...

随机推荐

  1. C++设计模式——模板方法模式

    模板方法模式 在GOF的<设计模式:可复用面向对象软件的基础>一书中对模板方法模式是这样说的:定义一个操作中的算法骨架,而将一些步骤延迟到子类中.TemplateMethod使得子类可以不 ...

  2. 【原创】运维基础之Zabbix(1)简介、安装、使用

    zabbix 4 官方:https://www.zabbix.com/ 一 简介 Monitor anythingSolutions for any kind of IT infrastructure ...

  3. [C][变量作用域]语句块

    概述 C语言作用域有点类似于链式结构,就是下层能访问上层声明的变量,但是上层则不能访问下层声明的变量: #include <stdio.h> #define TRUE 1 int main ...

  4. java集合(list,set,map)

    集合 集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使用. ...

  5. docker报错:Failed to restart docker.service: Unit not found.

    前言:我之前安装好docker了,但是关机重启后,发现docker就没了 报错:Failed to restart docker.service: Unit not found.   解决方法: 1. ...

  6. linux服务器配置pyspider出现Could not run curl-config 的解决方式

    Downloading/unpacking pycurl (from pyspider) Downloading pycurl-7.19.5.1.tar.gz (142kB): 142kB downl ...

  7. 《学习之道》第八章孤军奋战or组队合作

    孤军奋战与组队合作:别再苦思冥想,拖延行为需要差别对待 对拖延我得提一个小建议,你要暂时把自己与那些会干扰你的人和事隔离开.自己到一个房间里去,或者去图书馆,这样就没什么事能让你分心了. 如果一门课让 ...

  8. 【数据库】MySql分割字符串

    上论坛时看到一个骨骼清奇的分割字符串算法. DROP TABLE IF EXISTS Tmp_AreaCode; CREATE TABLE Tmp_AreaCode( string ) )ENGINE ...

  9. python输出

    学习之前普及一个知识,在python2.X的版本中是不可以输入中文的,如果一定要输入中文就必须要在整段代码的最上面第一行备注一下:# _*_ coding:utf-8 _*_ print函数,这是一个 ...

  10. VScode查找替换常用正则表达式

    1.从字符串开始到结束,例如:<a href="#">测试</a> (<'.*?>) //匹配到整个a标签 (>'.*?<) //匹 ...