常用知识点

目录

K8S的架构

K8S创建Pod资源对象的工作流程

K8S的三种网络

K8S的三种接口

VLAN和VXLAN的区别

flannel的三种模式

flannel的UDP模式

flannel的VXLAN模式

calico的IPIP模式

calico的BGP模式(本质就是通过路由规则来实现Pod之间的通信)

[flannel 与 calico 的区别](#flannel 与 calico 的区别)

service资源的4种类型

service的端口


K8S的架构

K8S有 master 和 worker node 两类节点

master节点(负责K8S集群的管理和资源调度等运维工作)

  • apiserver:是所有服务请求的统一访问入口,负责接收、验证和转发请求
  • controller-manager:控制器管理器,负责管理K8S各种资源对象的控制器;并通过apiserver监控整个K8S集群的资源状态,并确保资源始终处于预期的工作状态
  • scheduler:资源调度器,负责Pod资源的调度,通过调度算法(预选/优选策略)为待部署的Pod选择最适合的node节点
  • etcd:K8S集群的数据库,是一种键值对存储结构的分布式数据库,负责存储K8S集群所有配置和状态信息,仅apiserver拥有访问和读写权限

worker node节点(负责运行工作负载,即容器应用)

  • kubelet:接收apiserver的指令,创建和管理Pod及其容器的生命周期;定期收集节点的资源使用情况,并上报给apiserver
  • kube-proxy:负责实现Pod网络代理,维护网络规则和四层负载均衡
  • 容器运行时/容器引擎:运行容器

K8S创建Pod资源对象的工作流程

  1. 用户通过客户端发送创建Pod的请求给apiserver
  2. apiserver接收到请求并进行认证后,将请求信息存储到etcd中
  3. controller-manager通过list-watch监听到apiserver的指令后,会根据请求信息中的资料配置模板创建Pod资源
  4. scheduler也通过list-watch监听到apiserver的指令后,开始调度新创建的Pod,会根据调度算法的预选策略和优选策略选择出最适合的node节点来部署Pod
  5. node节点上的kubelet通过list-watch监听到apiserver的指令后,会在指定的节点上创建Pod,并管理其容器的生命周期
  6. 用户还可以通过apiserver在kube-proxy上配置相应的网络规则,实现Pod网络代理和负载均衡

K8S的三种网络

  • 节点网络(nodeIP):物理网卡的IP实现节点间的通信
  • Pod网络 (podIP):Pod与Pod之间可通过Pod的IP相互通信
  • Service网络 (clusterIP):在K8S集群内部可通过service资源的clusterIP实现对Pod集群的代理转发

K8S的三种接口

  • CRI 容器运行时接口 docker containerd podman cri-o
  • CSI 容器存储接口 nfs ceph oss s3
  • CNI 容器网络接口 flannel calico cilium

VLAN和VXLAN的区别

  1. 使用场景不同:VLAN主要用于在交换机上逻辑划分广播域,还可以配合STP生成树协议阻塞路径接口,从而避免产生环路和广播风暴,VXLAN用作于叠加网络,可以将数据帧封装成UDP报文,再通过网络层传输到其它网络,从而实现虚拟大二层网络的通信
  2. VXLAN支持更多的二层网络:VXLAN最多可支持 2^24 个;VLAN最多支持 2^12 个(4096-2)
  3. VXLAN可以防止物理交换机MAC表耗尽:VLAN需要在交换机的MAC表中记录MAC地址;VXLAN采用隧道机制,MAC地址不记录在交换机的MAC表中

flannel的三种模式

UDP

出现最早的模式,但是性能最差,基于flanneld应用程序实现数据包的封装/解封装(ip in udp

VXLAN

lannel的默认模式,也是推荐使用的模式,性能比UDP模式更好,基于内核实现数据帧的封装/解封装(mac in udp),且配置简单使用方便

HOST-GW

性能最好的模式,但是配置复杂,还不能跨网段通信

flannel的UDP模式

  1. 原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel0设备
  2. flanneld进程会监听flannel0设备收到的数据,并会将原始数据包封装到UDP报文里
  3. flanneld进程会根据在etcd中维护的路由表查到目标Pod所在的nodeIP,并对UDP报文封装nodeIP头部、MAC头部等,再通过节点网络发往目标node节点
  4. UDP报文通过8285端口送达到目标node节点的flanneld服务进程解封装获取原始数据包,数据包再根据本地路由通过flannel0发送到cni0网桥,再由cni0发送到目标Pod容器

flannel的VXLAN模式

  1. 原始数据包从源主机的Pod容器发出到cni0网桥接口,再由cni0转发到flannel.1设备
  2. flannel.1设备收到数据包后,在内核态给数据包添加以太网头部和VXLAN头部,再将此数据帧封装到UDP报文里
  3. flannel.1通过查询本机的 FDB 表获取目标节点的IP地址,再通过节点网络将UDP报文发往目标node节点
  4. UDP报文通过8472端口送达到目标node节点的flannel.1设备并在内核态解封装获取原始数据包,数据包再根据本地路由发送到cni0网桥,再由cni0发送到目标Pod容器

calico的IPIP模式

  1. 原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到tunl0设备
  2. tunl0设备收到数据包后,由内核将原始数据包封装到node节点网络的IP报文里,再根据Felix维护的路由规则通过节点网络发往目标node节点
  3. IP数据包到达目标节点的tunl0设备后,由内核解封装获取原始数据包,数据报文再根据本地路由经过 veth pair 设备发送到目标Pod容器

calico的BGP模式(本质就是通过路由规则来实现Pod之间的通信)

每个Pod都有一个 veth pair 设置,一端接入Pod,另一端接入宿主机网络空间,并设置了一条路由规则

这些路由规则都是 Felix 维护的,由 BIRD(BGP Client) 基于 BGP 动态路由协议分发给其它节点

1)原始数据包从源主机的Pod容器发出,经过 veth pair 设备送达到宿主机网络空间,再根据Felix维护的路由规则通过物理网卡发往目标node节点

2)目标node节点收到数据包后,会根据本地路由经过 veth pair 设备送达到目标 Pod 容器

flannel 与 calico 的区别

flannel: UDP VXLAN HOST-GW

  • 默认网段:10.244.0.0/16
  • 通常会采用VXLAN模式,由于用的是叠加网络、IP隧道方式传输数据,传输过程中需要额外的封包和解包,对性能有一点的影响。
  • flannel简单易用。但是不具备复杂的网络策略配置能力,性能方面表现一般。

calico: IPIP VXLAN BGP CrossSubnet(混合模式)

  • 默认网段:192.168.0.0/16
  • 使用IPIP或VXLAN模式可以实现跨网段通信,但是传输过程中需要额外的封包和解包,对性能有一点的影响。
  • 使用BGP模式会把每个节点看作成路由器,通过Felix、BIRD组件来维护和分发路由规则,可实现直接通过路由规则直接发送数据包到目标主机,传输中不需要额外的封包和解包,因此性能较好。但是不能跨网段通信。
  • calico性能较高,具有丰富的网络策略配置能力,还能固定IP,功能更全面。但是维护起来较为复杂。

总结:flannel适合规模较小,网络要求简单的K8S集群。calico适合规模较大,需要设置网络策略,固定 PodIP 的K8S集群。

service资源的4种类型

  • ClusterIP 默认的service资源类型,可提供clusterIP:port供K8S集群内部访问service关联的Pod端点
  • NodePort 会在每个node节点上都开启相同的端口,K8S集群外部/内部用户都可以通过nodeIP:nodePort来访问service关联的Pod端点
  • LoadBalancer 需要借助第三方的云负载均衡器,将请求分发到K8S集群的node节点上,再通过nodeIP:nodePort来访问service关联的Pod端点
  • ExternalName 相当于给一个外部服务地址(域名/IP)做映射,K8S集群内的Pod可以通过这个service访问相关的外部服务

service是通过 标签选择器 匹配Pod的标签,来自动发现Pod的端点(podIP:containerPort)

service的端口

  • port service的clusterIP使用的端口,只能在K8S集群内部被访问到。K8S集群内部的客户端可以通过clusterIP:port来访问service
  • nodePort NodePort类型的serivce使用的端口,会在每个node节点上都开启相同的端口,也就是nodeIP使用的端口(默认访问为 30000~32767)K8S集群外部/内部用户都可以通过nodeIP:nodePort来访问service
  • targetPort 映射Pod容器使用的端口,service会将发送给port或nodePort的请求转发给targetPort映射的Pod容器端口
相关推荐
沐杉53912 分钟前
青岛实训 8月21号 day33
linux·运维·服务器
椰椰椰耶2 小时前
【Linux】常用的命令
linux·运维·服务器
xiaojiesec3 小时前
第145天:内网安全-Linux权限维持&Rootkit后门&Strace监控&Alias别名&Cron定时任务
linux·运维·安全
安全在心中4 小时前
python-网页自动化(三)
运维·python·自动化
Slow4 小时前
自动化焊缝定义程序fe-safe
运维·python·自动化
爱吃龙利鱼4 小时前
web群集--nginx常见的几种负载均衡调度算法的配置过程和效果展示
运维·算法·nginx·云原生·负载均衡
冰 河6 小时前
《Nginx核心技术》第16章:实现Nginx的高可用负载均衡
运维·nginx·程序员·负载均衡·高可用
人工智障调包侠9 小时前
Linux 目录介绍
linux·运维·服务器
Java小白白同学11 小时前
Linux 硬盘扩容操作手册
linux·运维·服务器
大白菜和MySQL11 小时前
keepalived和lvs高可用集群
linux·运维·lvs