0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Kubernetes Pod如何获取IP地址呢?

马哥Linux运维 来源:IT牛客 2023-07-21 10:00 次阅读

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 流出流量的网关。

0d28ff50-270e-11ee-962d-dac502259ad0.png

不同主机上的容器

在不同主机上运行的容器可以通过其 IP 地址相互通信的方式之一是使用数据包封装(packet encapsulation)。Flannel 通过 vxlan 使用该功能,vxlan 将原始数据包封装在 UDP 数据包中并将其发送到目的地。

在 Kubernetes 集群中,Flannel 会在每个节点上创建一个 vxlan 设备和一些路由表。每个发往不同主机上的容器的数据包都会通过 vxlan 设备,并封装在 UDP 数据包中。在目标位置,它会提取封装的数据包,然后将数据包路由到目的地 Pod。

0d40563c-270e-11ee-962d-dac502259ad0.png

注意:这只是配置容器之间网络的方法之一。

CRI CRI(容器运行时接口)是一个插件接口,允许 kubelet 使用不同的 container runtimes。各种 container runtimes 都实现了 CRI API,这使用户可以在 Kubernetes 安装中使用他们想要的 container runtimes。 CNI

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可以使用以下命令列出节点的名称:

0d4f688e-270e-11ee-962d-dac502259ad0.jpg

Kubelet、Container Runtime 和 CNI 插件交互

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

0d6bc416-270e-11ee-962d-dac502259ad0.png

参考:容器式 cri 插件架构 Container Runtime 与 CNI 插件的交互 每个 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/。集群管理员需要在每个节点上交付 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 插件之间的交互可以如下所示:

0d8475a6-270e-11ee-962d-dac502259ad0.png

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

CNI 插件之间的交互 有多种 CNI 插件可帮助配置主机上容器之间的网络,本文主要讨论以下 3 个插件。

Flannel CNI 插件

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

0db448c6-270e-11ee-962d-dac502259ad0.png

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

0dee6524-270e-11ee-962d-dac502259ad0.png

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

Bridge CNI 插件

Flannel CNI 插件使用以下配置调用 Bridge CNI 插件:

0e22c152-270e-11ee-962d-dac502259ad0.png

当 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 插件:

0e6de678-270e-11ee-962d-dac502259ad0.png

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

0e9b0aa4-270e-11ee-962d-dac502259ad0.png

总结

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地址。

链接:https://www.sohu.com/a/447358313_760387





审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26913
  • UDP协议
    +关注

    关注

    0

    文章

    67

    浏览量

    12576
  • 虚拟以太网
    +关注

    关注

    0

    文章

    2

    浏览量

    5731
  • CRI
    CRI
    +关注

    关注

    1

    文章

    16

    浏览量

    12159

原文标题:带你搞懂 Kubernetes Pod 如何获取 IP 地址

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    阿里云容器Kubernetes监控(二) - 使用Grafana展现Pod监控数据

    kubernetes中承担的责任远不止监控数据的采集,还包括控制台的监控接口、HPA的POD弹性伸缩等都依赖于Heapster的功能。简介在kubernetes的监控方案中
    发表于 05-10 15:28

    从零开始入门 K8s| 详解 Pod 及容器设计模式

    一、为什么需要 Pod容器的基本概念我们知道 PodKubernetes 项目里面一个非常重要的概念,也是非常重要的一个原子调度单位,但是为什么我们会需要这样一个概念?在使用容
    发表于 09-20 15:12

    为什么DLINK怎么也获取不到IP地址

    我的板子是MINI STM32的。网络用的ENC28J60,基于lwip的。测试如下DHCP在小米的路由器上调试成功,并且获取IP地址的速度很快,但是换了个路由器DLINK的,就获取
    发表于 09-29 10:01

    Pod资源配置

    Kubernetes进阶实战》第四章《管理Pod资源对象》
    发表于 10-22 14:39

    STM32 DHCP怎么获取IP地址

    如果我首先开启的是板子,然后再开启路由器,那么在初始化的时候dhcp是获取不到ip的,那么我应该怎么在机器启动后继续获取IP地址
    发表于 10-10 14:27

    lwip获取ip地址说明

    Lwip是由Adam Dunkels 开发的一个小型开源的TCP/IP协议栈;目前已经为全球共同开发的开源协议。下面来看看lwip是如何能够获取ip地址的。
    发表于 12-11 15:55 1.2w次阅读

    连接一个未知的IP如何可以获取IP地址

    IP地址是每一个连接到网络中的设备都需要的一个逻辑性的地址,正常情况下,两个设备连接普通的命令并无法获得对端的IP地址,如果我们连接的是一个
    的头像 发表于 02-15 13:08 9319次阅读
    连接一个未知的<b class='flag-5'>IP</b>如何可以<b class='flag-5'>获取</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b>

    Kubernetes组件pod核心原理

    IP 地址和主机名 hostname,利用 namespace 进行资源隔离,相当于一台独立沙箱环境; pod 相当于一台独立主机,内部可以封装一个或多个容器(通常是一组相关的容器),内部容器之间
    的头像 发表于 09-02 09:27 1583次阅读

    获取IP地址的工具介绍

    容易,而当你遇到某些老项目,没有任何存档资料,网络设备的IP地址更是无法知晓,但你还不得不面对这样的现实,要么不停产维护,要么需要联机上载程序,所以,只有想办法获取到当前控制器或通信模块的IP
    的头像 发表于 10-08 15:52 1.6w次阅读
    <b class='flag-5'>获取</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b>的工具介绍

    如何通过一张照片来获取ip地址

    接着我还想说明一下如何使用SQLi来获取ip地址。其实使用照片来盗取ip地址十分快捷,我们没有理由去使用SQLi这种方法,但是为了让读者
    的头像 发表于 12-14 10:31 4032次阅读

    Kubernetes中的Pod简易理解

    PodKubernetes中非常重要的概念,也是Kubernetes管理的基本单位。正如其名,Pod像一个豌豆荚,可以容纳多个container,拥有相同的
    的头像 发表于 02-15 10:44 930次阅读

    Kubernetes Pod如何独立工作

    在学习 Kubernetes 网络模型的过程中,了解各种网络组件的作用以及如何交互非常重要。本文就介绍了各种网络组件在 Kubernetes 集群中是如何交互的,以及如何帮助每个 Pod 都能
    的头像 发表于 05-16 14:29 428次阅读
    <b class='flag-5'>Kubernetes</b> <b class='flag-5'>Pod</b>如何独立工作

    Pod是如何在底层实现的?如何使用Docker创建Pod

    刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod 中,容器可以通过 localhost 相互通信。所以,显而
    的头像 发表于 08-14 10:33 830次阅读
    <b class='flag-5'>Pod</b>是如何在底层实现的?如何使用Docker创建<b class='flag-5'>Pod</b>?

    获取Telegram的用户IP地址

    最近有个需求,查了些资料发现,Telegram有语音通话功能,也可以类似QQ一样通过语音通话的连接获取对方的IP地址, Denis Simonov (原文为俄语)发表过一篇文章,演示了如何通过 Telegram 语音呼叫
    的头像 发表于 01-12 11:35 642次阅读
    <b class='flag-5'>获取</b>Telegram的用户<b class='flag-5'>IP</b><b class='flag-5'>地址</b>

    CentOS虚拟机克隆后开机无法获取IP地址的解决策略

    克隆虚拟机后出现一台能获取IP地址,另外一台获取不到IP地址,查看MAC
    的头像 发表于 04-17 12:27 162次阅读
    CentOS虚拟机克隆后开机无法<b class='flag-5'>获取</b><b class='flag-5'>IP</b><b class='flag-5'>地址</b>的解决策略