K8S入门-原理篇

ronald8个月前职场1950

一. K8S总体架构及组件功能

    K8S总体架构图如下所示:

image-20210914154347765.png

    在K8S中,整个集群划分为控制节点和工作节点,其中控制节点分为:

    ·ETCD

        一个分布式的数据库,用于存储集群的状态;

    ·API服务器

        API服务器是集群内所有节点的通信枢纽,ETCD只和API 服务器通信,集群内其他组件通过和API server修改和获取集群状态;

    ·调度器

        调度器用于决定将Pod分配到哪个Node上执行,需要注意的是,调度器并不直接命令哪个Node运行指定的Pod,而是通过修改Pod的定义,再通过API Server命令控制器去执行对应的操作;

    ·控制器管理器

        控制器用于执行具体的部署工作;其中K8S含有多种控制管理器,如Deployment控制器、Replication控制器、Node控制器等,分别管理对应的资源;控制器之间是相互独立的,他们之间不直接通信,而是通过API server进行交互;

    而数据节点即接口K8S调度的节点,它的构成包括:

    ·kubelet

        负责对工作节点进行管理,包括:将这个node注册到K8S集群中、接收K8S控制面的调度运行指定的Pod、探测Pod的运行状态并在Pod失效时重新拉起Pod;

    ·kube-proxy

        主要负责代理运行在node上Pod的流量,在iptables模式下kube-proxy的功能集中为监听API Server获取集群内Pod信息,并修改对应的iptables的转发规则;

    ·容器运行时

        指的是运行容器的组件,类似docker这种。

    通过上面论述可见,控制面是K8S集群的大脑和核心,那么K8S的控制面如何保证高可用呢?

    首先是ETCD,其本身就是一个高可用的分布式数据库;

    API server,是一个无状态的proxy,支持平行扩展;

    调度器,在集群中是单点,但是是以主备形式部署;

    控制器管理器,控制器管理器也是单点形式存在,通过主备形式进行部署;另一方面,控制管理器被拆分为一系列的功能独立相互隔离的单资源管理器,简化了单节点的状态也弱化了单节点故障的影响。

二. K8S通信机制

    K8S节点通信分为:Pod内容器通信,本机内Pod之间通信以及跨机器的Pod通信,分别描述:

1. Pod内容器之间的通信

    Pod内的容器之间共享网络空间,其容器之间的通信和主机内进程内通信一样,直接使用localhost加上指定的端口号即可。

2. 本机内Pod之间通信

image-20210914163723694.png

    Pod被创建的时候,同时会创建一个veth-pair,veth-pair对的一端在Pod内虚拟化为Pod内的eth0,另一端在node的网络空间的虚拟网桥上,当Pod-1给Pod-2发包时,网络包会通过veth0发到网桥,网桥充当交换机的功能,发现目的地址在本机时,就直接转到本机上另一个veth-pair,进入到目的端Pod上。

    需要做到这一点,还需要满足一个条件,就是集群内的Pod需要IP唯一,这个就是CNI插件需要做的事情了;简单来说就是CNI插件会为集群内的每个node请求分配一个网段,这个网段会被存在ETCD中,然后在拉起Pod的时候为Pod分配网段内唯一的IP

3. 跨机器的Pod之间的通信

    对于Pod不在一台机器的情况,网桥查不到对应的Pod之后,就通过node上的网卡将包丢到网络上寻址到对应的node。

4. Deployment部署流程说明

image-20210914171323418.png

    如图所示,我们通过kubectl向k8s集群提交了一个deployment资源之后:

       1)deployment控制器通过监听API Server获取deployment资源的创建信息,通过API Server创建replicaSet;

        2)replicaSet控制器监听API Server获取到这个消息之后,创建Pod资源;

        3)调度器拿到拿到新建Pod资源信息,为Pod分配node,并把分配写过写入Pod资源信息通过API Server存起来;

        4)工作节点监听到自己所在node,需要创建一个pod,则告知容器运行时,容器运行时拉起Pod并运行对应容器,至此一个deployment创建流程执行完毕。

三. FAQ

1. 容器和虚拟机的区别

    说到容器,最经常比较的就是容器和虚拟机之间的区别,确实容器和虚拟机在使用起来感觉就是一个节点被虚拟出多个,每个用户使用其中一个虚拟节点,但是底层技术是不一样的,如下所示:

image-20210914201139551.png

    所谓虚拟机是在操作系统之上又虚拟出多个操作系统,不同虚拟机进程运行于不同操作系统之上,隔离性更强;而容器本质上是运用了Linux的namespace和cgroup机制,使得进程看起来像是独占系统,但本质上不同容器还是运营于同一个系统空间,相比于虚拟机容器技术隔离性较差,但是更加轻量。在实际现网运维过程中,是把一个物理机虚拟成多个虚拟机,然后虚拟机作为node供K8S调度并部署容器实例。

参考资料

    https://www.qikqiak.com/k8strain/k8s-basic/pod/

    http://docs.kubernetes.org.cn/683.html:kubectl命名表

    https://www.cnblogs.com/gdut1425/p/13046507.html:PV和PVC原理

    https://blog.csdn.net/qq_36807862/article/details/106068871:iptables vs ipvs

    http://dockone.io/article/4884:nodeport、ingress、loadbalance


标签: K8S

相关文章

K8S入门-概念篇(下)

K8S入门-概念篇(下)

一. volume    volume解决的是pod上不同容器之间共享文件的问题和容器文件持久化的问题;K8S提供了以下几类volume:1. hostPath    hostPath是一种通过pod所在node上的文件系统指定的文件或者目录实现文件共享,如下所示,先在Pod内定义一个volume,类型定义为hostP...

K8S入门-概念篇(上)

K8S入门-概念篇(上)

    认识到K8S的产生背景之后,我们开始进一步了解K8S,基于对K8S里面一些概念的了解之后,我们再去探讨K8S的一些原理:一. node    如前所述,K8S是一个容器编排平台,即容器的自动部署、扩展和管理;其最终的落点是把容器调度到一个运行他的节点上,在K8S中这个运行容器的节点就是node,但是需要注意的是...

K8S背景

    在深入了解K8S之前,我们先了解一下K8S产生的背景,看下是为了解决怎样的问题一步步衍生出K8S这样一套系统。一. 微服务化    随着需求的发展,单体应用的复杂度越来越高,大大增加了系统现网的运维成本,主要包括以下几个方面。    1. 模块耦合度提升,维护成本高&nb...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。