• kubernets之控制器之间的协作以及网络


    一  创建一个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通信需要一个三层网络,一般借助网络插件,将不同节点之间的网络打通,之后的流程就是单个节点之间的通信

  • 相关阅读:
    java线程实现和集合类综合问题
    软件体系结构风格总结
    java如何实现对象的克隆
    24小时实现盲打(程序员快速入门)
    测试面向对象软件时,设计集成测试用例的方法
    对白盒测试的一些理解
    对于工程建模需要画的图的分析及体会
    在软件开发的早期阶段为什么要进行可行性研究?应该从哪些方面研究目标系统的可行性?
    谭静第一周任务
    陈林艳第一周任务
  • 原文地址:https://www.cnblogs.com/wxm-pythoncoder/p/14271243.html
Copyright © 2020-2023  润新知