【K8s网络】确定最佳网络选项

参考:https://docs.projectcalico.org/networking/determine-best-networking

Calico 灵活的模块化架构支持广泛的部署选项,因此您可以选择适合您特定环境和需求的最佳网络方法。 这包括使用各种 CNI 和 IPAM 插件以及底层网络类型在非覆盖或覆盖模式下运行的能力,有或没有 BGP。

相关概念

Kubernetes 网络基础

Kubernetes 网络模型定义了一个“扁平”网络,其中:

  • 每个 pod 都有自己的 IP 地址。
  • 任何节点上的 Pod 都可以在没有 NAT 的情况下与所有其他节点上的所有 Pod 通信。

这创建了一个干净的、向后兼容的模型,从端口分配、命名、服务发现、负载平衡、应用程序配置和迁移的角度来看,Pod 可以像 VM 或物理主机一样对待。 可以使用网络策略来定义网络分段,以限制这些基本网络功能内的流量。

在这个模型中,有很大的灵活性来支持不同的网络方法和环境。 网络具体如何实施的细节取决于所使用的 CNI、网络和云提供商插件的组合。

CNI插件

CNI(容器网络接口)是一个标准 API,它允许不同的网络实现接入 Kubernetes。 每当创建或销毁 Pod 时,Kubernetes 都会调用 API。 有两种类型的 CNI 插件:

  • CNI 网络插件:负责向/从 Kubernetes pod 网络添加或删除 pod。这包括创建/删除每个 pod 的网络接口以及将其连接/断开连接到网络实现的其余部分。
  • CNI IPAM 插件:负责在创建或删除 Pod 时为其分配和释放 IP 地址。根据插件的不同,这可能包括为每个节点分配一个或多个 IP 地址 (CIDR) 范围,或从底层公共云网络获取 IP 地址以分配给 pod。

覆盖网络

覆盖网络是分层在另一个网络之上的网络。 在 Kubernetes 的上下文中,覆盖网络可用于处理底层网络之上的节点之间的 Pod 到 Pod 流量,该网络不知道 Pod IP 地址或哪些 Pod 正在哪些节点上运行。 覆盖网络的工作原理是将底层网络不知道如何处理的网络数据包(例如使用 pod IP 地址)封装在底层网络知道如何处理的外部数据包中(例如节点 IP 地址)。 用于封装的两种常见网络协议是 VXLAN 和 IP-in-IP。

使用覆盖网络的主要优点是它减少了对底层网络的依赖。 例如,您可以在几乎任何底层网络之上运行 VXLAN 覆盖,而无需与底层网络集成或对底层网络进行任何更改。

使用覆盖网络的主要缺点是:

  • 轻微的性能影响。 封装数据包的过程占用少量 CPU,数据包中用于编码封装(VXLAN 或 IP-in-IP 标头)的额外字节减少了可以发送的内部数据包的最大大小,从而可以意味着需要为相同数量的总数据发送更多数据包。
  • Pod IP 地址在集群外部不可路由。

跨子网(Cross-subnet)覆盖

除了标准的 VXLAN 或 IP-in-IP 覆盖之外,Calico 还支持 VXLAN 和 IP-in-IP 的“跨子网”模式。 在这种模式下,在每个子网中,底层网络充当 L2 网络。 在单个子网内发送的数据包不会被封装,因此您可以获得非覆盖网络的性能。 跨子网发送的数据包被封装,就像普通的覆盖网络一样,减少对底层网络的依赖(无需与底层网络集成或对底层网络进行任何更改)。

就像标准覆盖网络一样,底层网络不知道 pod IP 地址,并且 pod IP 地址在集群外部不可路由。

集群外的 Pod IP 可路由性

不同 Kubernetes 网络实现的一个重要区别特征是 pod IP 地址是否可以跨更广泛的网络在集群外部路由。

不可路由

如果 pod IP 地址在集群外不可路由,那么当 pod 尝试与集群外的 IP 地址建立网络连接时,Kubernetes 使用一种称为 SNAT(源网络地址转换)的技术来更改源 IP从 pod 的 IP 地址到托管 pod 的节点的 IP 地址。 连接上的任何返回数据包都会自动映射回 pod IP 地址。 因此 pod 不知道 SNAT 正在发生,连接的目的地将节点视为连接的源,底层更广泛的网络永远不会看到 pod IP 地址。

对于相反方向的连接,集群外的东西需要连接到 pod,这只能通过 Kubernetes 服务或 Kubernetes 入口完成。 集群之外的任何东西都不能直接连接到 pod IP 地址,因为更广泛的网络不知道如何将数据包路由到 pod IP 地址。

可路由

如果 pod IP 地址可以在集群外路由,那么 pod 可以在没有 SNAT 的情况下连接到外部世界,并且外部世界可以直接连接到 pod,而无需通过 Kubernetes 服务或 Kubernetes 入口。

可在集群外路由的 pod IP 地址的优点是:

  • 避免出站连接的 SNAT 对于与现有的更广泛的安全要求进行集成可能是必不可少的。 它还可以简化调试和操作日志的可理解性。
  • 如果您有专门的工作负载,这意味着某些 pod 需要直接访问,而无需通过 Kubernetes 服务或 Kubernetes 入口,那么可路由的 pod IP 在操作上比使用主机网络 pod 的替代方案更简单。

可在集群外路由的 pod IP 地址的主要缺点是 pod IP 在更广泛的网络中必须是唯一的。 因此,例如,如果运行多个集群,您将需要为每个集群中的 pod 使用不同的 IP 地址范围 (CIDR)。 在大规模运行时,或者如果现有企业对 IP 地址空间有其他重大需求,这反过来又会导致 IP 地址范围耗尽挑战。

什么决定可路由性?

如果您为集群使用覆盖网络,则 pod IP 通常无法在集群外路由。

如果您没有使用覆盖网络,那么 pod IP 是否可在集群外路由取决于正在使用 CNI 插件、云提供商集成或(对于本地)BGP 对等物理网络的组合。

BGP

BGP(边界网关协议)是一种基于标准的网络协议,用于跨网络共享路由。 它是互联网的基本构建块之一,具有出色的扩展特性。

Calico 内置了对 BGP 的支持。 在本地部署中,这允许 Calico 与物理网络(通常是 Top 或 Rack 路由器)对等交换路由,形成一个非覆盖网络,其中 pod IP 地址可在更广泛的网络中路由,就像附加的任何其他工作负载一样到网络。

关于 Calico 网络

Calico 用于网络的灵活模块化架构包括以下内容。

Calico CNI 网络插件

Calico CNI 网络插件使用一对虚拟以太网设备(veth 对)将 pod 连接到主机网络命名空间的 L3 路由。 这种 L3 架构避免了许多其他 Kubernetes 网络解决方案中具有的额外 L2 桥接器的不必要的复杂性和性能开销。

Calico CNI IPAM 插件

Calico CNI IPAM 插件从一个或多个可配置的 IP 地址范围中为 pod 分配 IP 地址,根据需要为每个节点动态分配小块 IP。 与许多其他 CNI IPAM 插件(包括在许多网络解决方案中使用的主机本地 IPAM 插件)相比,结果是更有效地使用 IP 地址空间。

叠加网络模式

Calico 可以提供 VXLAN 或 IP-in-IP 覆盖网络,包括仅跨子网模式。

非重叠网络模式

Calico 可以提供在任何底层 L2 网络或 L3 网络之上运行的非覆盖网络,该网络是具有适当云提供商集成的公共云网络或具有 BGP 能力的网络(通常是具有标准 Top-of 的本地网络) -机架路由器)。

网络策略执行

Calico 的网络策略执行引擎实现了 Kubernetes 网络策略的全部功能,以及 Calico 网络策略的扩展功能。 这与 Calico 的内置网络模式或任何其他 Calico 兼容的网络插件和云提供商集成结合使用。

Calico 兼容的 CNI 插件

Host local IPAM

主机本地CNI IPAM插件是一个常用的IP地址管理CNI插件,它为每个节点分配一个固定大小的IP地址范围(CIDR),然后从该范围内分配pod IP地址。 默认地址范围大小为 256 个 IP 地址 (a /24),但其中两个 IP 地址保留用于特殊用途,未分配给 pod。 主机本地 CNI IPAM 插件的简单性使其易于理解,但与 Calico CNI IPAM 插件相比,IP 地址空间使用效率较低。

Flannel

Flannel 使用从主机本地 IPAM CNI 插件获得的静态每节点 CIDR 路由 pod 流量。 Flannel 提供了许多网络后端,但主要与其 VXLAN 覆盖后端一起使用。 Calico CNI 和 Calico 网络策略可以与 flannel 和主机本地 IPAM 插件相结合,以提供具有策略执行功能的 VXLAN 网络。 这种组合有时被称为“Canal”。

注意 :Calico 现在内置了对 VXLAN 的支持,为了简单起见,我们通常建议优先使用 Calico+Flannel 组合。

原文地址:https://www.cnblogs.com/varden/p/15117147.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读942次。kube-controller-manager 和 kubelet 是异步工作的,这意味着延迟可能包括任何的网络延迟、apiserver 的延迟、etcd 延迟,一个节点上的负载引起的延迟等等。当 Kubernetes 中 Node 节点出现状态异常的情况下,节点上的 Pod 会被重新调度到其他节点上去,但是有的时候我们会发现节点 Down 掉以后,Pod 并不会立即触发重新调度,这实际上就是和 Kubelet 的状态更新机制密切相关的,Kubernetes 提供了一些参数配置来触发重新调度的时间。_node-monitor-period
文章浏览阅读3.8k次。上篇文章详细介绍了弹性云混部的落地历程,弹性云是滴滴内部提供给网约车等核心服务的容器平台,其基于 k8s 实现了对海量 node 的管理和 pod 的调度。本文重点介绍弹性云的调度能力,分为以下部分:调度链路图:介绍当前弹性云调度体系链路,对架构体系有一个初步的认知k8s 调度能力的运用:整体介绍弹性云现在用到的 k8s 调度能力和对其的增强k8s 版本的升级:介绍到从 k8s 1.12 到 1...._滴滴机房 腾讯
文章浏览阅读897次。对于cpu来说,这种分配方式并不会有太大问题,因为cpu可以灵活调度,numa调度时我们只计算绑定了numa cpu的pod是可以接受的,但是对于内存来说,numa node上申请了的内存无法做到随时迁移,这就会导致调度器视角numa node的mem资源足够,但是等到pod真正使用时,由于没有绑定numa node的pod申请的内存,导致numa node的mem资源不足,造成swap中断或者远端内存申请,这会对绑定mem的pod来带来性能损耗。忽略了没有绑定numa node的pod资源。_kubectl numa
文章浏览阅读796次,点赞17次,收藏15次。只要在Service定义中设置了ClusterIp:None,就定义了一个HeadLess Service, 它与普通的Service关键区别在于它没有ClusterIp地址,如果解析HeadLess Service的DNS域名,则会返回该Service对应的全部Pod的EndPoint列表,这就意味着客户端是直接与后端的pod建立了TCP/IP链接进行通信的。一个Label是一个键值对。注解:属于资源对象的元数据,可以被理解为一种特殊的标签,不过更多的是与程序挂钩,通常用于实现资源对象属性的自定义扩展。
文章浏览阅读763次。但是此时如果配置成 NONE, 租户创建成功了,但是无法创建资源文件,也就是无法上传文件,可能 dolphinscheduler 团队就想着将文件上传到 hdfs,暂不支持本地。需要将 resource.storage.type 置为 NONE, 因为我之前用的 1.3.6 版本的时候,即使资源文件存在本地文件也需要配置成 hdfs。_[error] 2023-10-24 18:10:43.762 +0800 org.apache.dolphinscheduler.api.servic
文章浏览阅读2.7k次,点赞2次,收藏13次。公司使用的是交老的k8s版本(1.16),由于老版本的K8s对于现在很多新特性不支持,所以需要升级到新版本。目前2023年7月11日最新版本的k8s是v1.27.3。通过参考官方文档进行k8s部署工作。其中涉及到操作系统配置、防火墙配置、私有镜像仓库等。_k8s最新版本
文章浏览阅读1.8w次,点赞14次,收藏27次。能节省你在kubeadm init 时遇到问题的排错时间⌚️。整合了网上大佬
文章浏览阅读1.1k次,点赞2次,收藏7次。具体操作步骤可以参考之前的教程,建议是先安装一台,然后克隆虚拟机,这样速度快。注意:在克隆时记得修改Mac地址、IP地址、UUID和主机名。(最后别忘了保存下快照~)_部署k8s集群
文章浏览阅读863次,点赞23次,收藏16次。当部署完 Kubernetes,便拥有了一个完整的集群。一组工作机器,称为节点, 会运行容器化应用程序。每个集群至少有一个工作节点。工作节点会 托管Pod ,而 Pod 就是作为应用负载的组件。控制平面管理集群中的工作节点和Pod。说人话版本:集群:cluster,多个几点被组织到一起共同为系统提供服务过程称之为集群。本质上是将承载同一个软件服务节点组织到一起,称之为该软件(服务)的集群,当然集群中的节点身份地位是不一样的。k8s集群也是如此,他也是多个节点组成。
文章浏览阅读943次。Rancher是一个开源的企业级多集群Kubernetes管理平台,实现了Kubernetes集群在混合云+本地数据中心的集中部署与管理,以确保集群的安全性,加速企业数字化转型。Rancher 1.0版本在2016年就已发布,时至今日,Rancher已经成长为企业在生产环境中运行容器和Kubernetes的首要选择。_rancher管理k8s
文章浏览阅读742次,点赞2次,收藏3次。本篇来讲解如何在centos下安装部署高可用k8s集群。_kubeadm ha keepalived + nginx
文章浏览阅读1.9k次,点赞21次,收藏25次。那么这个空间设置成内存的2倍大小。点击IPv4设置--手动--添加--设置ip--设置DNS服务器,最后点击--“保存”;首先选中--“本地标准磁盘”,存储配置--自定义分区,点击--“完成”;在--主机名--设置主机名:(例如k8s-master01),点击--点击+,设置--挂载点/boot--期望容量,点击--添加挂载点;点击--+--挂载点swap--期望容量,点击--“添加挂载点”;默认选择--亚洲--上海,并调整日期和时间,点击--“完成”;设备类型--确认--LVM,卷组--选择“修改”;_euler 服务器搭建
文章浏览阅读1k次。在1.25版本的k8s集群中部署gpu-manage时,虽然显示gpu节点上gpu-manage的pod实例都是running状态,但是给pod申领。既可以用源码的Makefile自动编译打包成新的镜像,但是源码的。说明gpu-manager和容器运行时接口通信失败了。编译后的镜像在1.25版本的k8s中可以正常使用。,但是在k8s1.23版本之后,接口路径已经改为。资源时,却始终找不到有资源的节点。,另外有一些依赖需要国际上的支持。可以看到这里用的运行时接口是。查看节点的详情时,返回的。_launch gpu manager 报错 can't create container runtime manager: context dead
文章浏览阅读1k次,点赞18次,收藏16次。SelfLink:API的资源对象之一,表示资源对象在集群当中自身的一个连结,self-Link是一个唯一的标识号,可以用于标识k8s集群当中的每个资源的对象。容器里使用的配置,在provisioner当中定义好环境变量,传给容器,storageclass的名称,NFS服务器的地址,NFS的目录。NFS的provisionner的客户端以pod的方式运行在集群当中,监听k8s集群当中PV的请求,然后动态的创建于NFS相关的PV。命名为 nfs-client-provisioner-clusterrole。
文章浏览阅读6.3k次,点赞2次,收藏20次。k8s证书过期解决方案之替换证书_k8s证书过期如何更换
文章浏览阅读1k次。KMS,Key Management Service,即密钥管理服务,在K8S集群中,以驱动和插件的形式启用对Secret,Configmap进行加密。以保护敏感数据
文章浏览阅读888次。exporter对于云服务的监控还是很不完美,毕竟每家都有自己的护城河。自动发现多实例这样的借助consul 阿波罗这样的会简单一些。aws可以借助cloudwatch这样的导入模板到grafana中。还是希望能将类似腾讯云云监控中的这些指标采集到prometheus中,但是这过程应该还很遥远grafana出图 prometheus查询语法这些东西有时间的好好研究一下。报警有必要进行分级别,收敛配置一下!_command: - "-redis.password-file=/redis_passwd.json
文章浏览阅读1k次。可以在此处(https://cloud.google.com/kubernetes-engine/docs/how-to/kube-dns)和此处(https://www.digitalocean.com/community/tutorials/an-introduction-to-the-kubernetes-dns-service)找到更多的详细信息。-or-ipvs/)和此处(https://arthurchiao.art/blog/cracking-k8s-node-proxy/)。_k8s默认命名空间
文章浏览阅读4.9k次,点赞11次,收藏32次。如果运行runc命令时提示:runc: error while loading shared libraries: libseccomp.so.2: cannot open shared object file: No such file or directory,则表明runc没有找到libseccomp,需要检查libseccomp是否安装,本次安装默认就可以查询到。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。所有主机均需要操作。_kubernetes 1.28
文章浏览阅读3.6w次,点赞118次,收藏144次。Canal 提供了网络功能,使得 Kubernetes 集群中的 Pod 可以相互通信,并与集群外部的服务进行通信。它通过网络插件的方式,为每个 Pod 分配唯一的 IP 地址,并管理网络流量的路由和转发。此外,Canal 还支持网络策略,用于定义 Pod 之间的通信规则和安全策略。Canal 基于 Calico 和 Flannel 项目,结合了二者的优点。它使用 Calico 的数据平面,提供高性能的网络转发和安全特性,同时使用 Flannel 的控制平面,实现 IP 地址管理和网络策略的配置。_k8s canal