• k8s之Calico


     

    一、calico基本实现图

     

    calico的基本组件有etcd、felix、BGP Client、BIDR(bgp route reflector).

    Etcd:分布式键值存储,主要负责网络元数据一致性。

    Felix:跑在每个节点上,主要负责配置路由及 ACLs(包过滤技术)等信息来确保 endpoint 的连通状态。

    BIDR(bgp route reflector)主要负责把 Felix 写入 kernel 的路由信息分发到当前 Calico 网络

     

    二、Calico的工作流程

    对于控制平面,Felix会监听ECTD中心的存储,从中获取事件,比如说用户在这台机器上一个pod。接着会在这台机器上创建出一个pod,并将其网卡、IP、MAC都设置好,然后在内核的路由表里面写一条,注明这个IP应该到这张网卡。绿色部分是一个标准的路由程序,它会从内核里面获取哪一些IP的路由发生了变化,然后通过标准BGP的路由协议扩散到整个其他的宿主机上,让外界都知道这个IP在这里,你们路由的时候得到这里来。

     

    Pod的ip是由cni分配

    Kube-controller-manager为每个节点分配一个podCIDR。从podCIDR中的子网值中为节点上的Pod分配IP地址。由于所有节点上的podCIDR是不相交的子网,因此它允许为每个pod分配唯一的IP地址。Kubernetes集群管理员可配置和安装kubelet,容器运行时,网络提供商代理,并在每个节点上分发CNI插件。网络提供商代理启动时,将生成CNI配置。在节点上调度Pod后,kubelet会调用CRI插件来创建Pod。如果是Containerd,则Containered CRI插件会调用CNI配置中指定的CNI插件来配置Pod网络。这些都会使Pod获得IP地址。

     

    当容器通过calico进行跨主机通信时,其网络通信模型如下图所示:

     

     

    三、Calico在kubernetes中的工作

     

    calico包括如下重要组件:calico/node,Typha,Felix,etcd,BGP Client,BGP Route Reflector。

    calico/node:把Felix,calico client,confd,Bird封装成统一的组件作为统一入口,同时负责给其他的组件做环境的初始化和条件准备。

    Felix:主要负责路由配置以及ACLS规则的配置以及下发,它存在在每个node节点上。

    etcd:存储各个节点分配的子网信息,可以与kubernetes共用;

    BGPClient(BGPD), 主要负责把 Felix写入 kernel的路由信息分发到当前 Calico网络,确保 workload间的通信的有效性;

    BGPRoute Reflector(BIRD), 大规模部署时使用,在各个节点之间不是mesh模式,通过一个或者多个 BGPRoute Reflector 来完成集中式的路由分发;当etcd中有新的规则加入时,Route Reflector 就会将新的记录同步。

    Typha:在节点数比较多的情况下,Felix可通过Typha直接和Etcd进行数据交互,不

    kube-apiserver,既降低其压力。生产环境中实例数建议在3~20之间,随着节点数的增加,按照每个Typha对应200节点计算。

     

    calico-kube-controllers的Deployment,部署一个Calico Kubernetes控制器。quay.io/calico/kube-controllers容器包含以下控制器:

    l policy controller:监视网络策略和编程Calico策略,它会把Kubernetes的network policies同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听NetworkPolicy事件。 用户在k8s集群中设置了Pod的Network Policy之后,calico-kube-controllers就会自动通知各个Node上的calico-node服务,在宿主机上设置相应的iptables规则,完成Pod间网络访问策略的设置。

    l namespace controller:监视命名空间和编程Calico配置文件,它会把Kubernetes的namespace label变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听Namespace事件。

    l serviceaccount controller:监视服务帐户和编程Calico配置文件,它会把Kubernetes的service account变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听ServiceAccount事件。

    l workloadendpoint controller:监视pod标签的更改并更新Calico工作负载中的endpoints配置,它会把Kubernetes的pod label变化同步到Calico datastore中,该控制器需要有访问Kubernetes API的只读权限,以监听Pod事件。

    l node controller:监视删除Kubernetes nodes节点的操作并从Calico中也删除相应的数据,该控制器需要有访问Kubernetes API的只读权限,以监听Node事件。

     

    参考:https://www.jianshu.com/p/54ad345c5516

              https://www.kubernetes.org.cn/4960.html

       https://blog.csdn.net/ccy19910925/article/details/82423452

    ---当才华撑不起你的野心的时候,请努力!---跑起来。
  • 相关阅读:
    集合关系运算 交、差、并集
    字符串 数字 列表 元祖 字典 的不同分类and集合的概念
    我的python之路6(基础练习)
    我的python之路6(整理)
    编写Linux下socket协议TCP和UDP的Client Server程序
    linux添加新用户
    HTML5怎样在网页中使用摄像头功能 时间:2013-04-10 19:56 来源:18素材
    boost 同步定时器
    C++的multiple definition of *** first defined here错误
    TCP与UDP的区别,以及它们各自的定义
  • 原文地址:https://www.cnblogs.com/gaoyuechen/p/16791775.html
Copyright © 2020-2023  润新知