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

原文地址:https://www.cnblogs.com/wxm-pythoncoder/p/14271243.html