云原生之深入解析Kubernetes Pod如何获取IP地址

这篇具有很好参考价值的文章主要介绍了云原生之深入解析Kubernetes Pod如何获取IP地址。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、背景

  • Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 IP 地址并可以使用该 IP 地址进行通信。很多人刚开始使用 Kubernetes 时,还不清楚如何为每个 Pod 分配 IP 地址。它们了解各种组件如何独立工作,但不清楚这些组件如何组合在一起使用。例如,它们了解什么是 CNI 插件,但是不知道它们是如何被调用的。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都获取 IP 地址。
  • 在 Kubernetes 中有多种网络设置方法,以及 container runtime 的各种选项。这篇文章将使用 Flannel 作为 network provider,并使用 Containered 作为 container runtime。

二、容器网络

① 同一主机上的容器
  • 在同一主机上运行的容器通过 IP 地址相互通信的方法之一是使用 Linux Bridge,即在 Kubernetes(和 Docker)世界中,创建 veth(虚拟以太网)设备。
  • 该 veth 设备的一端连接在容器网络命名空间,另一端连接到主机网络上的 Linux Bridge。
  • 同一主机上的所有容器都将这 veth pair 的一端连接到 Linux Bridge,它们可以通过 Bridge 使用 IP 地址相互通信。
  • Linux Bridge 也被分配了一个 IP 地址,它充当从目的地到不同节点的 Pod 流出流量的网关。

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

② 不同主机上的容器
  • 在不同主机上运行的容器可以通过其 IP 地址相互通信的方式之一是使用数据包封装(packet encapsulation)。Flannel 通过 vxlan 使用该功能,vxlan 将原始数据包封装在 UDP 数据包中并将其发送到目的地。
  • 在 Kubernetes 集群中,Flannel 会在每个节点上创建一个 vxlan 设备和一些路由表。每个发往不同主机上的容器的数据包都会通过 vxlan 设备,并封装在 UDP 数据包中。在目标位置,它会提取封装的数据包,然后将数据包路由到目的地 Pod。

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

三、CRI 和 CNI

  • CRI(容器运行时接口)是一个插件接口,允许 kubelet 使用不同的 container runtimes。各种 container runtimes 都实现了 CRI API,这使用户可以在 Kubernetes 安装中使用他们想要的 container runtimes。
  • CNI(容器网络接口)项目包含一个为 Linux 容器提供基于通用插件网络解决方案的规则。它由各种插件组成,这些插件在配置 Pod 网络时执行不同的功能。CNI 插件是遵循 CNI 规范的可执行文件。

四、为节点子网分配 Pod IP 地址

  • 如果要求所有 Pod 具有 IP 地址,那么就要确保整个集群中的所有 Pod 的 IP 地址是唯一的,这可以通过为每个节点分配一个唯一的子网来实现,即从子网中为 Pod 分配节点 IP 地址。
  • 节点 IPAM 控制器:当 nodeipam 传递给 kube-controller-manager 的 --controllers 命令行标志时,它将为每个节点分配来自集群 CIDR(集群网络的 IP 范围)的专用子网(podCIDR)。由于这些 podCIDR 是不相交的子网,因此它可以为每个 Pod 分配唯一的 IP 地址。
  • 当 Kubernetes 节点首次在集群上注册时,会被分配一个 podCIDR。要更改分配给集群中节点的 podCIDR,需要先注销节点,然后使用应用于 Kubernetes 控制平面的任何配置更改来重新注册节点。podCIDR 可以使用以下命令列出节点的名称:

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

五、Kubelet、Container Runtime 和 CNI 插件交互

  • 当在节点上调度 Pod 时,一启动 Pod 就会发生很多事情,这里仅关注与 Pod 配置网络有关的动态,一旦在节点上调度了 Pod,将配置网络并启动应用程序容器。

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • 每个 network provider 都有一个 CNI 插件,container runtime 会调用该插件,在 Pod 启动时配置网络。使用容器化作为 container runtime,容器化 CRI 插件将调用 CNI 插件。每个 network provider 都在每个 Kubernetes 节点上安装了一个代理,以配置 Pod 网络。安装 network provider agent 后,它会随 CNI 一起配置或者在节点上创建,CRI 插件会使用它来确定要调用哪个 CNI 插件。
  • CNI 配置文件的位置是可配置的,默认值为 /etc/cni/net.d/<config-file>,集群管理员需要在每个节点上交付 CNI 插件。CNI 插件的位置也是可配置的,默认值为 /opt/cni/bin。如果使用 containerd 作为 container runtime,则可以在 containerd config 部分下 [plugins."io.containerd.grpc.v1.cri".cni] 指定 CNI 配置和 CNI 插件的路径。
  • 将 Flannel 作为 network provider,这里简单介绍一下 Flannel 的设置。Flanneld 是 Flannel 守护程序,通常 install-cni 作为带有初始化容器的守护程序安装在 Kubernetes 集群上。install-cni 容器创建 CNI 配置文件在每个节点上 /etc/cni/net.d/10-flannel.conflist。Flanneld 创建一个 vxlan 设备,从 apiserver 获取网络元数据,并监控 Pod 上的更新。创建 Pod 时,它将在整个集群中为所有 Pod 分配路由,这些路由允许 Pod 通过 IP 地址相互连接。
  • Containerd CRI 插件和 CNI 插件之间的交互可以如下所示:

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • 如上所述,kubelet 调用 Containered CRI 插件创建容器,再调用 CNI 插件为容器配置网络,Network provider CNI 插件调用其他基本 CNI 插件来配置网络。

六、CNI 插件之间的交互

① Flannel CNI 插件
  • 当使用 Flannel 作为 network provider 时,Containered CRI 插件使用 CNI 配置文件,调用 Flannel CNI 插件:/etc/cni/net.d/10-flannel.conflist。

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • Fannel CNI 插件与 Flanneld 结合使用,当 Flanneld 启动时,它将从 apiserver 中获取 podCIDR 和其他与网络相关的详细信息,并将它们存储在文件中/run/flannel/subnet.env。

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • Flannel CNI 插件使用 /run/flannel/subnet.env 的信息来配置和调用 Bridge CNI 插件。
② Bridge CNI 插件
  • Flannel CNI 插件使用以下配置调用 Bridge CNI 插件:

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • 当 Bridge CNI 插件第一次调用时,它会创建一个 Linux Bridge "name": "cni0" 在配置文件中,然后为每个 Pod 创建 veth pair,其一端在容器的网络命名空间中,另一端连接到主机网络上的 Linux Bridge。使用 Bridge CNI 插件,主机上的所有容器都连接到主机网络上的 Linux Bridge。
  • 配置完 veth pair 后,Bridge 插件将调用主机本地 IPAM CNI 插件。我们可以在 CNI config 中配置要使用的 IPAM 插件,CRI 插件用于调用 Flannel CNI插件。
③ 主机本地 IPAM CNI 插件
  • Bridge CNI 插件使用以下配置调用主机本地 IPAM CNI 插件:

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节

  • 主机本地 IPAM(IP 地址管理)插件从中返回容器的 IP 地址,subnet将分配的 IP 本地存储在主机下dataDir指定的目录中/var/lib/cni/networks/<network-name=cni0>/<ip>/var/lib/cni/networks/<network-name=cni0>/<ip>文件包含 IP 分配到的容器 ID。
  • 调用时,主机本地 IPAM 插件返回以下有效负载:

tomcat如何获取pod地址不获取网段,Kubernetes,容器,CRI、CNI,插件,1024程序员节文章来源地址https://www.toymoban.com/news/detail-785033.html

七、总结

  • Kube-controller-manager 为每个节点分配一个 podCIDR。从 podCIDR 中的子网值为节点上的 Pod 分配了 IP 地址。由于所有节点上的 podCIDR 是不相交的子网,因此它允许为每个 pod 分配唯一的IP地址。
  • Kubernetes 集群管理员可配置和安装 kubelet、container runtime、network provider,并在每个节点上分发 CNI 插件。Network provider agent 启动时,将生成 CNI 配置。在节点上调度 Pod 后,kubelet 会调用 CRI 插件来创建 Pod。在容器情况下,容器的 CRI 插件调用 CNI 配置中指定的 CNI 插件来配置 Pod 网络。所有这些都会影响 Pod 获取 IP地址。

到了这里,关于云原生之深入解析Kubernetes Pod如何获取IP地址的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】kubernetes深入理解Pod对象:基本管理

    目录 一、Pod 基本概念 二、pod 常用命令 三、Pod 资源共享实现机制 3.1 共享网络 3.2 共享存储 四、Pod 状态管理 五、重启策略和健康检查 5.1 基本概念 5.1.1 重启策略 5.1.2 健康检查有以下三种类型: 5.1.3 支持以下三种检查方法: 5.2 示例讲解 5.2.1 就绪健康检查示例 六、Pod环境变

    2024年02月07日
    浏览(52)
  • 云原生之深入解析如何正确计算Kubernetes容器CPU使用率

    使用 Prometheus 配置 kubernetes 环境中 Container 的 CPU 使用率时,会经常遇到 CPU 使用超出 100%,现在来分析一下: container_spec_cpu_period:当对容器进行 CPU 限制时,CFS 调度的时间窗口,又称容器 CPU 的时钟周期通常是 100000 微秒 container_spec_cpu_quota:是指容器的使用 CPU 时间周期总量

    2024年02月10日
    浏览(70)
  • 云原生之深入解析如何调试Kubernetes集群中的网络延迟问题

    随着 Kubernetes 集群规模不断增长,对于服务延迟的要求越来越严苛,有时候观察到一些运行在 Kubernetes 平台上的服务正在面临偶发的延迟问题,这些断断续续的问题并不是由于应用本身的性能问题导致的。 慢慢发现,Kubernetes 集群上的应用产生的延迟问题看上去似乎是随机的

    2024年02月04日
    浏览(57)
  • 云原生之深入解析Kubernetes中Kubectl Top如何进行资源监控

    kubectl top 是基础命令,但是需要部署配套的组件才能获取到监控值: 1.8 以下:部署 heapter; 1.8 以上:部署 metric-server; kubectl top node:查看 node 的使用情况: kubectl top pod:查看 pod 的使用情况: 不指定 pod 名称,则显示命名空间下所有 pod,–containers 可以显示 pod 内所有的

    2024年02月10日
    浏览(56)
  • k8s pod获取ip地址过程

    在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能获取 IP 地址。 Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 IP 地址并可以使用该 IP 地址

    2024年02月08日
    浏览(44)
  • kubernetes|云原生| 如何优雅的重启和更新pod---pod生命周期管理实务

    kubernetes的管理维护的复杂性体现在了方方面面,例如,pod的管理,服务的管理,用户的管理(RBAC),网络的管理等等,因此,kubernetes安装部署完毕仅仅是万里长征的第一步,后面的运营和维护工作才是更为关键的东西。 那么,pod的生命周期是什么概念呢?这

    2024年02月04日
    浏览(56)
  • 【云原生|探索 Kubernetes 系列 5】简化 Kubernetes 的部署,深入解析其工作流程

    大家好,我是秋意零。 在前面 4 个章节中,我们充分了解了容器技术和 Kubernes 原生时代引擎的架构和设计思想,今天分享的主要内容是,探索 Kubernetes 部署,深入解析其工作流程 👿 简介 🏠 个人主页 : 秋意零 🧑 个人介绍 :在校期间参与众多云计算相关比赛,如:🌟

    2024年02月06日
    浏览(52)
  • 云原生之深入解析Airbnb的动态Kubernetes集群扩缩容

    Airbnb 基础设施的一个重要作用是保证我们的云能够根据需求上升或下降进行自动扩缩容,我们每天的流量波动都非常大,需要依靠动态扩缩容来保证服务的正常运行。为了支持扩缩容,Airbnb 使用了 Kubernetes 编排系统,并且使用了一种基于 Kubernetes 的服务配置接口。 现在来讨

    2024年02月06日
    浏览(68)
  • 云原生之深入解析Kubernetes CNI插件的选型和应用场景

    在学习容器网络的时候,肯定都听说过 Docker 的 bridge 网络、Vethpair、VxLAN 等术语,从 Docker 到 Kubernetes 后,学习 Flannel、Calico 等主流网络插件,分别代表了 Overlay 和 Underlay 的两种网络传输模式,也是很经典的两款 CNI 网络插件。那么,还有哪些好用的 CNI 插件呢 ? 先来看看 C

    2024年02月15日
    浏览(50)
  • k8s(Kubernetes)设置 pod,Deployment 域名自定义映射ip,hosts 解析 HostAliases

    直接 编辑修改 Deployment 最后内容如下,如需保存 按 esc 键,最后输入 :wq 保存退出,容器会自动重新生成新的

    2024年02月12日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包