1. kubernetes
  2. https://draveness.me/understanding-kubernetes
  3. http://kubernetes.kansea.com/docs/
  4. master/node:
  5.  
  6. masterAPI ServerSchedulerController-Manager
  7. nodekubelet(集群代理)、docker(容器引擎)、kube-proxy //API Server把任务编排后由Scheduler调度,调度的结果就有kubelet执行
  8.  
  9. PodLabelLabel Selector    //为了统一管理在同一个集群上大量的资源,尤其像pod这样的资源,需要为pod添加一些元数据信息,而Label是其中一种 K:V格式的元数据
  10.  
  11. Labelkey=value //在 K:V 上有一定的限制
  12. Label Selector   //定义完Label后就可以使用Label Selector根据定义过的条件挑选符合条件的pod资源
  13.  
  14. Kubernetes是一个集群,将多台主机的资源整合为一个大的资源池,并进行统一对外提供存储、计算等能力的集群。
  15. 这个集群就是将多台主机上安装上kubernetes的相关应用程序,并通过这个应用程序协同工作,将多个主机当作一个主机来使用。
  16. kubernetes集群中,主机是分角色的。一个或一组节点是主节点(两到三个),各node节点中每一个节点都有来贡献一些计算或存储能力。各node节点就是为了运行容器。
  17.  
  18. 用户如何在集群中创建、启动容器呢?
  19. 客户端把创建、启动容器的请求先发给集群中的mastermaster中有一个调度器(scheduler)去分析各node节点现有可用资源状态,从中找一个最适合运行用户请求的容器的节点,然后master把这个请求调度到节点上。由被选中节点本地的docker或其他容器引擎负责把这个容器启动起来。要启动这个容器就需要镜像,镜像一般是在docker hub这样的registry当中。所以node负责启动容器时先检查本地是否有镜像,如果本地没有就需要到docker hub中下载,然后在node上启动。kubernetes cluster自身可能并没有托管所需要依赖的每一个容器镜像,就需要到registry下载。同时registry自身也可以是一个容器,因此registry也可以托管在kubernetes集群中运行。
  20. 接受客户端请求的只能是kubernetes cluster,而提供服务让客户端远程访问一般需要一个套接字,所以kubernetes clustermaster上的一个组件称为API SERVERAPI SERVER负责接收、解析和处理请求的,如果用户的请求是要创建一个容器,这个容器不应该运行在master上,而应该运行在node上。选择哪一个node更合适,就需要调度器来分析了。调度器会观测每一个node上总共可用的计算和存储资源,并根据用户所请求创建的这个容器所需要的最低资源量(CPU、内存等)来评估哪个节点最合适。注意资源请求的维度不是一个,比如至少用到的CPU或者内存,因此kubernetes设计了一个两级调度的模式,第一步先做预选,即评估每一个node,测量哪些node是符合容器运行需求(必须总共10个点节点只有3符合),第二步是优选,从符合需求的node中再选出一个最佳适配的node。至于哪个node最佳,取决于调度算法中优选算法来决定。
  21. kubernetes有一堆控制器的应用程序,负责监控管理的每一个容器是否正常运行,一旦发现不健康,控制器就向master发请求,调度器就会在其他node中挑一个合适的node,并在此node上重新启动挂掉的容器。控制器需要在本地不停的loop(循环),即进行周期性探测。
  22. 控制器管理器(control mananger):负责监控每一个控制器是否健康,如果控制器不健康了,有控制器管理器确保它是健康的。为了确保控制器管理器是健康的,就要求控制器管理器是冗余的,因为master是多个节点的,所以可以确保控制器管理器是冗余的。
  23.  
  24. Pod
  25.  
  26. K8S上最小运行的单元不是容器,而是podkubernetes并不直接调度容器的运行,而是调度podpod可以理解为容器的外壳,为容器做了一层抽象的封装。podkubernets系统上最小的调度的逻辑单元,pod内部主要就是用来放容器的。
  27. pod的工作特点: 将多个容器联合起来加入到同一个网络名称空间去。kubernetes做了一个逻辑组件pod,在pod内部运行容器,一个pod内部可以运行多个容器。多个容器共享同一个底层的网络名称空间:netutsipc,另外三个:usermntpid是互相隔离的。因此一个pod内的多个容器(容器是为了运行程序)就共享同一个主机名、同一个网络等,因此程序对外就更像是一个虚拟机,pod就是模拟传统的虚拟机的(用同一个地址对外通信,容器之间的通信是使用lo的)。
  28. 另外同一个pod内部的多个容器还共享第二种资源:存储卷。假如定义一个存储卷,让pod中第一个容器可以访问,那么第二个容器可以共享挂载同一个存储卷。可以说存储卷不再属于容器,而是属于pod,就像虚拟机的磁盘。
  29. 调度器调度的是pod,各node主要是为了运行pod。一般一个pod中运行一个容器,如果容器之间联系特别紧密,可以在一个pod中运行多个容器。如果同一pod中放置多个容器的话,那么有一个容器是主容器,其他容器是为了辅助主容器中的应用程序完成更多功能。比如主容器中运行的是nginx,另外想要收集日志,那么就可以在辅助容器中运行收集日志的应用程序。
  30. 为了方便控制器对pod的管理、实现pod的识别,如果一个pod宕机,新建一个同样功能的pod就不是同一个名字,无法使用pod进行识别唯一,就需要在pod上附加一些元数据,有标签(Label)和标签选择器(Label Selector)
  31.  
  32. node
  33. nodekubernetes集群的工作节点,负责运行由master指派的的各种任务,最核心的任务就是以pod的形式去运行容器的。理论上将node可以是任何形式的设备,只要有cpu、内存、存储空间等可以安装kuberneters cluster的代理程序,那么就可以作为整个kubernetes cluster的一个部分进行工作。
  1. 2kubernetes基础概念
  2.  
  3. Pod
  4.  
  5. 自助式Pod  //pod被创建后,仍然要提交给API Server,由API Server接收后借助于调度器将此pod调度至指定的node节点,由node启动此pod。而后如果此pod中的容器出现故障,需要重启容器,就由kubelet来完成,如果node故障,pod就会消失,建议使用控制器管理的pod。
  6. 控制器管理的Pod  
  7. Replication Controller:副本控制器(简称RC)
  8. ReplicaSet:副本集控制器
  9. Deployment
  10. StatefulSet
  11. DaemonSet
  12. JobCtonjob
  13.  
  14. ReplicationController:副本控制器,功能:实现启动pod副本和滚动更新
  15. 启动副本:当启动一个pod时,如果pod不够使用,就可以再启动一个,而RC就是专门控制同一类pod对象的各种副本。一旦副本数量少了,RC就会自动增加一个,多了          就减去一个。比如pod调度到第三个node后,这个node宕机了,那么RC就会发现少了一个pod副本,RC就会重新请求API Server创建一个新的pod              API Server借助于Scheduler调度,会找另一个nodepod再启动起来。
  16. RC实现滚动更新:比如更新了镜像,就需要把pod中的容器更新为新的版本的镜像,可以做滚动更新。
  17. 有两种方式:1、先关闭其中一个pod做更新,启动后再关闭另一个;
  18. 2、先创建一个新版本的pod,这时pod就会超出定义的数量,可以在更新过程中临时超出pod的数量。创建一个新版本的pod,去掉一个老版本的pod就可以了。同时也支持滚动更新的逆反,即回滚到老版本。
  19. 下面是实现一种特定的应用管理,是确保不同类型的pod资源符合用户所期望的方式进行运行的:
  20. ReplicaSet:副本集控制器,这个控制器是不直接使用的,而是有一个声明式更新的控制器(Deployment)来进行管理
  21. Deployment:只能管理无状态的应用,支持二级控制器,HPA
  22. HPA:(HorizontalPodAutoscaler)水平Pod自动伸缩控制器,比如对应的控制器下有两个pod在运行,如果流量访问大了,原有的两个pod不足以承载访问量,就需要添加资源,那么加多少资源?HPA就可以自动判断了,且可以自动监控、自动扩展。
  23. StatefulSet:有状态副本集,管理有状态应用
  24. DaemonSet:如果需要在每一个node上运行一个副本,不是随意运行就是用DaemonSet
  25. Job:运行作业,比如对一大堆数据集进行清理,就会临时启动一个pod,清理完pod就会结束,这种pod就不需要一直处于一种运行状态,就把这种运行为job。但如果还没有清理完,这个任务挂掉了,还需要把它重启起来。
  26. Cronjob:周期性运行作业
  27.  
  28. service   
  29. http://kubernetes.kansea.com/docs/user-guide/services/
  30. 什么是服务发现:
  31. pod是有生命周期的,一个pod随时可能消失,另一个pod随时也可能被添加进来。所以无论使用主机名还是IP地址,都无法使用固定的手段访问pod,这里就需要使用服务发现机制。K8S为每一组提供同类服务的pod和客户端之间添加了一层中间层,中间层是固定的,称为service,只要不被删除,它的地址和名称就是固定的,所以客户端访问服务时只需要指向服务(即service)时就行,service会把请求代理到后端的pod之上。当客户端需要访问某个服务时,客户端是不用发现服务的,客户端只需要在配置文件写明这个服务(即service)的IP地址和名称。一旦pod消失,只要新建一个pod就可以,这个新的pod立即会被service关联进来。
  32. service如何实现关联pod
  33. service关联pod依靠固定的元数据--标签,因为service是靠标签选择器关联pod的。只要pod属于这个标签选择器,就立即可以被service挑中,并作为service的后端组件,servicepod动态关联后会探测podIP地址、端口,并把这些探测到的内容作为自己调度后端可用服务器主机的对象。因此客户端的请求到达service,然后由service代理至后端pod。注意客户端看到的地址都是service的。在k8sservice不是应用程序也不是实体组件,而是iptablesDNAT规则。DNAT规则中的serviceIP地址只出现在规则中,并没有绑定在网卡上,所以是无法ping通的。service作为k8s的对象,是有名称的,名称是可以被解析的,即把service的名称解析为serviceIP
  34. service名称可以被DNS解析为IP地址,而且是自动的。比如service的名称被修改,那么DNS中的解析记录的名称也会得到相应的修改。service的地址只能手动修改,修改后会自动触发DNS中的解析记录的。客户端访问某一服务时,可直接访问服务的名称,而后由集群中专用的DNS服务负责解析,这里解析的是service的地址。因此这个访问依然是由service替代客户端实现的,这里是端口代理,由DNAT来实现。对于多目标资源,iptables已经把负载均衡的功能交由ipvs来实现。但是由于service后端的pod可能是有多个,k8s就把iptables规则进一步改为ipvs规则,即每创建一个service就相当于生成一条ipvs规则,不过是nat模型的ipvs
  35.  
  36.  
  37. k8s基本组件
  38. 首先是pod,由于生命周期不固定,所以为它做了一个抽象层-->service;另外如果pod一旦出现故障,就需要控制器能够把pod重建;service和控制器都是通过标签和标签选择器来关联pod资源的。每一个service要想基于名称被客户端访问,要基于DNS服务(DNS域名解析),这个DNS服务本身也是一个pod,这个pod也需要service来控制。另外每一个pod在运行时使用了多少资源、是否故障、接受多少用户访问都是需要监控的。
  39.  
  40.  
  41.  
  42.  
  43. k8s的网络模型和通信
  44. flannel是什么  https://www.huweihuang.com/kubernetes-notes/network/flannel/flannel-introduction.html
  45. kubernetes网络模型  https://www.huweihuang.com/kubernetes-notes/network/kubernetes-network.html
  46. 默认的节点间数据通信方式是UDP转发,在FlannelGitHub页面有如下的一张原理图:
  47.  
  48.  
  49. k8s的网络模型
  50. k8s中要求有三种网络:
  51. 第一种是各pod运行在一个网络中;
  52. 第二种是service运行在另外一种网络,podservice是不在同一网段的。pod地址是配置在pod内部的网络名称空间上,是可以ping通的,service的地址是虚拟的,只存在于iptables或者ipvs的规则当中;
  53. 第三种是各节点都有自己的地址,节点的网段是一个网络。
  54. 以上三种网络分别称为pod网络、集群网络(service网络)和节点网络。请求到来先到达节点网络,由节点网络代理至集群网络,再由集群网络代为代理至pod网络。
  55.  
  56. k8s中三类通信   https://blog.csdn.net/weixin_29115985/article/details/78963125
  57. 1、同一个pod内的多个容器间通信是依靠lo
  58. 2、各pod间的通信:Overlay Network(叠加网络),通过隧道的方式来转发二层报文,使得pod间虽然跨主机,但好像工作在一个二层网络上,可以转发对方的二层报文或者隧道转发对方的三层报文,实现叠加网络。
  59. 3podservice之间的通信:是通过kube-proxypod有自己的网络,service也有自己的网络,两者如何通信?另外各pod客户端可以直接配置service名称和地址进行访问,那么pod如何可达service?由于serviceIP是主机上iptables规则中的地址,某一容器在试图访问某一service地址时,会把请求送给service上的网关(每一个宿主机都应该有相应的iptables规则,只要创建了service,这个service就会反映到集群中的每一个节点上,每一个node上都应该有相关的iptables或者ipvs规则),所以一个容器试图访问service地址时,就会把请求送给service上的网关(一般是docker0桥的地址),然后docker0桥再通过检查iptables规则表就可以知道下一级的serviceIP
  60. service随时可能变动,service中的pod也会变动,所以service规则中目标地址也会发生变化,那么如何改变所有节点上iptables或者ipvs规则呢?
  61. 这就需要专门的组件kube-proxy,在每个node节点上都存在,运行为node节点的守护进程。kube-proxy随时负责与API-server进行通信,因为每一个pod发生变化后,结果需要保存在API-server,然后API-server中的结果发生变化后就会生成一个通知事件,这个事件可以被任何关联的组件所接收到,比如kube-proxykube-proxy一旦发现某一service中的pod的地址发生改变,那么由kube-proxy就会在本地把新的地址反映在iptables或者ipvs规则中。所以service的管理是靠kube-proxy来实现的,创建service后,service的实现要靠kube-proxy来实现,即kube-proxy在每一个节点上创建成规则,每一个service的变动也需要kube-proxy转换反映到规则上。
  62. API-server需要存储集群中各对象的状态信息,存储在哪里呢?那么各master需要一个共享存储,即etcdetcd是一个键值存储数据库存储系统,etcd需要做高可用。
  63. 整个API-server集群大概有三类节点组成,第一类是API-master,第二类是etcd,第三类是大量的node。彼此之间的通信是http或者https
  64. 一共需要5CA
  65. etcd集群之间的通信使用https协议,需要一套CA
  66. API-server(k8s客户端)与etcd(k8s后端)之间的通信使用https协议(API-serveretcd的客户端),需要一套CA
  67. API-server为了向真正客户端提供服务需要一套CA
  68. API-server需要与各node通信,因为各node上有kubeletkube-proxy两个组件:
  69. (1)API-serverkubelet通信是https协议,需要一套CA
  70. (2)API-serverkube-proxy通信是https协议,需要一套CA
  71.           
  72. 整个 API-server 简化后可以分为三类集群:API-server集群、etcd集群、nodes集群
  73. 彼此之间都是http或者https协议通信,然后在node节点上运行podpodpod之间是需要通信的,同时pod内部的容器也是需要通信的,podservice要通信,pod与集群外的客户端要通信,所以就需要构建出多个网络;
  74. node节点自己之间的网络、service的网络(也叫集群网络)、pod自己的网络;
  75.  
  76. k8s集群的三种网络:
  77. 1、节点之间的网络
  78. 2、节点中有podpod之间可以通过叠加网络或者直接路由直接进行通信;
  79. 3service网络(集群网络):由kube-proxy来进行管控和生成,这样不同节点的podpod之间进行通信时,可以借助于固定的中间层(service网络)来实现;service网络的网段和pod的网段是不在同一个网段的;

1-2、kubernetes架构概述和kubernetes基础概念的更多相关文章

  1. kubernetes(k8s)容器编排工具基础概念

    Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controller-kubernetes 官网:https://ku ...

  2. 01-Devops核心要点及Kubernetes架构概述

    Brog 自动装箱,自动修复,水平扩展,服务发现和负载均衡,自动发布和回滚 密钥和配置管理,存储编排,批量处理执行

  3. k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题.   基于 Kubernetes 作为容器集群的管理平 ...

  4. 【转载】k8s入坑之路(2)kubernetes架构详解

    每个微服务通过 Docker 进行发布,随着业务的发展,系统中遍布着各种各样的容器.于是,容器的资源调度,部署运行,扩容缩容就是我们要面临的问题. 基于 Kubernetes 作为容器集群的管理平台被 ...

  5. K8s(一)----容器编排工具基础概念

    kubernetes(k8s)容器编排工具基础概念 Kubernetes (K8s): 中文社区:https://www.kubernetes.org.cn/replication-controlle ...

  6. Kubernetes基础概念及架构概述

    Kubernetes 架构 Kubernetes是一个全新的基于容器技术的分布式架构,虽然Kubernetes只有三年,但它是谷歌十几年以来大规模应用容器技术的经验积累和升华的一个重要发展成果.确切的 ...

  7. Kubernetes 学习笔记(一):基础概念

    个人笔记,仅本人查阅使用,不保证正确. 零.微服务 微服务架构专注于应用解耦合,通过将应用彻底地组件化和服务化,每个微服务只包含一个非常小的功能,比如权限管理.日志收集等等.由这一组微服务组合起来,提 ...

  8. linux运维、架构之路-Kubernetes集群部署

    一.kubernetes介绍        Kubernetes简称K8s,它是一个全新的基于容器技术的分布式架构领先方案.Kubernetes(k8s)是Google开源的容器集群管理系统(谷歌内部 ...

  9. 入门Kubernetes -基础概念

    一.Kubernetes概述 Kubernetes ,又称为 k8s(首字母为 k.首字母与尾字母之间有 8 个字符.尾字母为 s,所以简称 k8s)或者简称为 "kube" ,是 ...

随机推荐

  1. zabbix 3.2.2 server端(源码包)安装部署 (一)

    环境准备: 操作系统 CentOS 6.8 2.6.32-642.11.1.el6.x86_64 zabbix server 172.16.10.150 zabbix agent 172.16.10. ...

  2. imx6ull增加qt5 qtserialbus库

    meta-qt5库地址:https://code.qt.io/cgit/yocto/meta-qt5.git/   1.在fsl-release-yocto/sources/meta-qt5/reci ...

  3. PLSQL功能一览(1/2)

    用了Oracle几年了,除了PLSQL几乎就没用过别的工具.临时起义想看看PLSQL有哪些功能是我平时没注意的,别是一直有好办法,我却用着笨办法. 本文针对PLSQL12.0.7 1.登录以后使用My ...

  4. QTP(4)

    一.常见回放错误 1.The "XXX" XXX object was not found in the Object Repository.(在对象库中未找到对象) ...... ...

  5. 【NOIP2012】同余方程

    原题: 求关于xx的同余方程ax≡1(mod b)的最小正整数解. 裸题 当年被这题劝退,现在老子终于学会exgcd了哈哈哈哈哈哈哈哈 ax≡1(mod b) => ax=1+by => ...

  6. dfs序+RMQ求LCA详解

    首先安利自己倍增求LCA的博客,前置(算不上)知识在此. LCA有3种求法:倍增求lca(上面qwq),树链剖分求lca(什么时候会了树链剖分再说.),还有,标题. 是的你也来和我一起学习这个了qwq ...

  7. Linux命令手册man

    命令手册:manualman COMMANDman 2 read whatis COMMAND:查看命令有几个章节 man分章节:常见章节有8个,1:用户命令2:系统调用3:库用户4:特殊文件(设备文 ...

  8. 24.stark组件全部

    admin组件: 博客里面的图片的是在太难弄了,有大哥会弄给我贴一片博客,我一个一个加太累了,没有加 admin参考:https://www.cnblogs.com/yuanchenqi/articl ...

  9. jenkins汉化

    插件: Localization: Chinese (Simplified) locale plugin(或者是这个版本不一样,名字不一样) 可以直接安装这个插件,然后走最后一步设置即可. 由于安装失 ...

  10. Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法

    Laravel dingo,HTTP的请求头(accept)无法携带版本号的解决方法  2017年9月6日  原创分享  zencodex  使用 Laravel dingo 做api开发时,涉及 A ...