一  创建一个deployment的时候整个kubernets集群的资源和事件的调用链

  1.1  创建一个deployment的资源,在提交的时候,集群中的调度器,控制器以及node节点上kubelet就已经通过监听各自资源类型的变化,如图所示

    • kubernets组件通过API服务器监听API对象

  

  1.2  观察本次创建资源的事件链

    当你将deployment的yaml文件通过kubectl提交给API服务器的时候,实际上kubectl会对API服务器发起一个HTTP的post请求,API服务器对请求进行鉴权,认证,准入,最终效验,最后写入etcd存储中,并且将结果返回给API服务器,整个事件链如图所示

  • 当客户端kubectl向API服务器发起创建一个deployment资源的时候
  • 集群里面所有监听了deployment资源的调度器会收到一个通知,其中在这里我们要说明的只是deployment同样也会收到通知
  • deployment调度器收到通知之后会去根据deployment的定义向API服务器发起创建RS
  • 彼时在集群中的RS控制器通过监听也收到了RS的创建,并创建了pod
  • 等待pod创建完成之后,调度器就会将其分配给工作节点,相应的工作节点通过订阅得知pod被调度自己的节点上
  • 于是kubelet会去拉取镜像,启动容器,并将结果反馈给API服务器

 1.3  观察集群事件

   控制平面以及kubelet在执行相关操作的时候都会向API服务器发送事件,发送事件是通过创建事件资源来实现的,每次使用kubectl describe来检查资源的时候就能看到相关的事件,也可以直接使用kubectl get events --watch

[root@node01 ~]# k get events --watch
NAME AGE
kubia-0.1659b586ea3d7158 0s
kubia-1.1659b586ec5d986a 0s
kubia-2.1659b586ed5fc952 0s
kubia.16591db959436c4c 0s
kubia-0.1659b58e5854386e 0s
kubia-0.1659b58e8bb8c852 0s
kubia-0.1659b58ee400e30f 0s

   了解运行中的pod都是些什么

    查看下pod中的容器状况

[root@node01 Chapter10]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9a96d4501bee luksa/kubia-pet "node app.js" 40 seconds ago Up 39 seconds k8s_kubia_kubia-1_default_82c80622-5566-11eb-ae9a-5254002a5691_0
1733975abffb k8s.gcr.io/pause:3.1 "/pause" 44 seconds ago Up 43 seconds k8s_POD_kubia-1_default_82c80622-5566-11eb-ae9a-5254002a5691_0
  • 从这里可以看到在一个容器起来之前就已经有了/pause容器起来
  • 这个容器看起来没有任何实质的作用,但是实际上还是有很大的意义的,它会将一个pod的所有容器组织在同一个命名空间里面
  • 实际上,这个基础容器的生命周期基本和pod保持一致,当pod里面的容器需要重启的时候,或者删除重新拉起的时候,需要和之前的容器在同一个命名空间里面,而这个基础容器使之成为可能,如果pod被删除,kubelet会重新去创建它,并包含基础容器以及该pod内部的所有容器

      

  1.4 了解pod中的网络

    kubernetes自身并不提供任何的网络插件,而是通过集群管理员或者CNI来配置pod之间的网络,集群的要求是,所有pod都应该在一个扁平的网络环境里面互相通信,换句话就是说pod之间的通信不能够过NAT。

  • pod到pod之间通信没有使用NAT网络
  • 同样的pod到主机上面的网络也是没有过NAT的
  • 但是pod与外部服务通信的时候,就会使用NAT地址转换,由于pod使用的是似有地址,所有会转化为主机的地址

  深入了解网络工作原理

  每个pod里面都会有个pause容器,每个pod里面的网络接口以及都会被存储在这个基础容器里面

    同一节点上pod之间如何通信

    • 每个节点上面都有都会有一个网络插件的网桥
    • 每个pod都有一个网卡对,一端在pod内部被改名为eth0,一端以vethxxx的形式到节点上

    • 同节点上面pod通信步骤是,podA的应用经由podA的网卡的eth0到节点端的一侧,之后到达网桥,再从网桥到达另一pod的node端,最后到另一个pod的容器的eth0进入容器应用

        

    不同的节点上面的node通信架构如图所示

       不同节点之间的pod通信需要一个三层网络,一般借助网络插件,将不同节点之间的网络打通,之后的流程就是单个节点之间的通信

kubernets之控制器之间的协作以及网络的更多相关文章

  1. Salesforce视图与控制器之间的交互

    刚接触Salesforce,过程的确是比较艰难了,中文资料几乎没有,看英文资料学的效率却不高,不过看了一段时间的英文资料发现自己英语水平挺高不少啊,现在看都不用工具翻译,早知道就再次尝试报个6级,看下 ...

  2. AngularJS中控制器之间通信方法

    在同个angular应用的控制器之间进行通信可以有很多种不同的方式,本文主要讲两种: 基于scope继承的方式和基于event传播的方式 基于scope继承的方式 最简单的让控制器之间进行通信的方法是 ...

  3. angular 控制器之间的通信

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...

  4. iOS开发控制器之间传值的几种小方法

    在IOS开发中或面试中,经常会遇到,两个或者多个控制器之间传值的问题 ,总结的集中方法仅供参考! 问题 :将B控制器中的textField 输入内容,传到A控制器中的label上显示出来,如何传值? ...

  5. angular中控制器之间的通讯方式

    1, 利用作用域的继承方式 由于作用域的继承是基于js的原型继承方式,所以这里分为两种情况,当作用域上面的值为基本类型的时候,修改父作用域上面的值会 影响到子作用域,反之,修改子作用域只会影响子作用域 ...

  6. angular控制器之间的传值

    每个controller都会有自己的scope,所有的scope都是属于 $rootScope的子或者子的子... 那么问题就好解决了,通过 $rootScope.$broadcast 广播的事件每个 ...

  7. java多线程(七)-线程之间的 协作

    对于多线程之间的共享受限资源,我们是通过锁(互斥)的方式来进行保护的,从而避免发生受限资源被多个线程同时访问的问题.那么线程之间既然有互斥,那么也会有协作.线程之间的协作也是必不可少的,比如 盖个商场 ...

  8. angularJS--多个控制器之间的数据共享

    为了在控制器之间共享数据,需要在服务中添加一个用来储存用户名的方法.记住,服务在 应用的生命周期内是单例模式的,因此可以将用户名安全地储存在其中. <!DOCTYPE html> < ...

  9. angular开发控制器之间的通信

    一.指令与控制器之间通信,无非是以下几种方法: 基于scope继承的方式 基于event传播的方式 service的方式(单例模式) 二.基于scope继承的方式: 最简单的让控制器之间进行通信的方法 ...

随机推荐

  1. oracle归档空间不足的问题(rman删除归档日志)

    案例一:归档日志满,数据库用户无法登陆,业务异常   解决方案一(可以登录rman): rman target /   RMAN> crosscheck archivelog all;   RM ...

  2. <未解决的问题>crontab 定时弹框任务

    问题:crontab写别的定时脚本就可以执行(比如说每隔一分钟就创建一个txt文件),但是写shell就不知道为什么,反弹不了 但是开启Linux终端窗口单独执行bash shell时候,(不通过re ...

  3. python之解压序列并赋值给变量

    N个数量的序列(可迭代对象),赋值给N个变量. 字符串: 1 #!usr/bin/env python3 2 # -*- Coding=utf-8 -*- 3 4 ''' 5 解压序列(或者任何可迭代 ...

  4. JavaWeb基础总结:Servlet专题

    最近工作中有部分整改老接口的任务,大部分与Spring的拦截器,Tomcat相关,改到一些底层的代码发现,对基础J2EE的知识有些遗忘,需要频繁查阅,索性从头系统的整理一下Servlet和Filter ...

  5. AndroidSDK安装选项说明

    前言:本文的目的在于了解AndroidSDK相关安装选项,正确根据自身需要选择性安装,避免安装过多无用的东西导致硬盘爆满. 1. AndroidSDK安装选项说明,如上图. 2. 实际游戏打包使用到A ...

  6. java中邮件通知

    // 客户信息 Tkhxx tkhxx = new Tkhxx(); try { String msg = tkhxx.toString(); MailUtil.simpleMailSend(Mail ...

  7. C语言输入字符串

    首先强调一点,C语言没有字符串的概念!所谓的字符串实际上还是以数组形式保存的. 方法1  -- 通过"%s"输入 优点:简单明了,输入字符只要不大于数组长度都可以. #includ ...

  8. 常用的Git命令清单

    目录 名词解释 开卷必读 一. 新建代码库 二.配置 三. 忽略某个文件的改动 四. 增加/删除文件 五. 代码提交 六. 分支 七. 标签 八. 查看信息 九. 远程同步 十. 撤销 十一. Git ...

  9. 2018年第九届蓝桥杯B组(201806-----递增三元组)

    给定三个整数数组 A = [A1, A2, - AN], B = [B1, B2, - BN], C = [C1, C2, - CN], 请你统计有多少个三元组(i, j, k) 满足: 1 < ...

  10. Termux键盘配置

    通过编辑~/.termux/termux.properties配置 extra-keys = [\ ['ESC', 'CTRL', '&', '$', '!', '%', '<', '& ...