美文网首页Kubernetes
Kubernetes网络实现

Kubernetes网络实现

作者: 王勇1024 | 来源:发表于2019-05-26 15:11 被阅读0次

《Linux虚拟网络技术》这篇文章中我们已经详细介绍了Linux虚拟网络技术,在《Docker网络实现》这篇文章介绍了Docker网络的实现原理,而Kubernetes的网络实现是基于Linux虚拟网络技术和Docker网络技术的。要想真正了解Kubernetes网络实现的原理,可以先阅读这两篇文章。

Kubernetes 网络模型设计的一个基础原则是:每个 Pod 都拥有一个独立的 IP 地址,而且假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中。所以不管它们是否允许在同一个 Node(宿主机)中,都要求它可以直接通过对方的 IP 进行访问。

设计这个原则的原因是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

Kubernetes的网络通信主要分为以下几种情况:

    1. Pod内容器之间的通信
    1. Pod到Pod之间的通信
    1. Pod到Service之间的通信
    1. 集群外部与内部组件之间的通信

下面我们就挨个儿来看看Kubernetes是怎么实现各种情况下的网络通信的吧。

Pod内容器之间的通信

在 Kubernetes 的世界里,IP 是以 Pod 为单位进行分配的。一个 Pod 内部的所有容器共享一个网络堆栈(实际上就是一个网络命名空间,包括它们的 IP 地址、网络设备、配置等都是共享的)。

所以,在同一个Pod内的容器(Pod内的容器是不会跨宿主机的)之间对于网络的各类操作,就和它们在同一台机器上一样,它们甚至可以用localhost地址访问彼此的端口。

因此,Pod内网络拓扑模型如下图所示:

Pod内网络拓扑模型

Pod之间的通信

每个Pod都有一个真实的全局IP地址,同一个Node内的不同Pod之间可以直接采用对方Pod的IP地址通信,而且不需要使用其他发现机制,例如DNS、Consul或者etcd。

两个Pod既有可能运行在同一个Node上,也有可能运行在不同的Node上。所以,我们可以把Pod间通信分为两类:

同一个Node内的Pod之间的通信

同一个Node内的Pod之间的通信方式如下图所示:

同一个Node内的Pod之间的通信

可以看到,Pod1和Pod2都是通信veth pair连接到同一个docker0网桥上,它们的IP地址IP1、IP2都是从docker0网段上动态获取的,它们和网桥本身的IP3是同一个网段的。
由于Pod1和Pod2处于同一局域网内,它们之间可以通过docker0作为路由量进行通信。

不同Node上的Pod之间的通信

我们知道,在Kubernetes的网络世界中,Pod之间假设是通过访问对方的Pod IP进行通信的,而不同Node之间的通信只能通过Node的物理网卡进行,Pod的IP地址是由各Node上的docker0网桥动态分配的。我们想要实现跨Node的Pod之间的通信,至少需要满足下面三个条件:

  1. 我们需要知道Pod IP 和Node IP之间的映射关系,通过Node IP转发到Pod IP;
  2. 在整个Kubernetes集群中对Pod的IP分配不能出现冲突;
  3. 从Pod中发出的数据包不应该进行NAT地址转换。

根据条件1的要求,Kubernetes会记录所有正在运行的Pod的IP分配信息,并将这些信息保存到etcd中(作为Service的Endpoint),这样我们就可以知道Pod IP和Node IP之间的映射关系。

根据条件2的要求,以Flannel为例,Flannel实现的容器的跨主机通信通过如下过程实现:

  • 每个主机上安装并运行etcd和flannel;
  • 在etcd中规划配置所有主机的docker0子网范围;
  • 每个主机上的flanneld根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
  • 当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
  • 将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
  • 由于目的IP是宿主机IP,因此路由是可达的;
  • VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

所以,Kubernetes不同Node上的Pod之间通信的网络拓扑如下图所示:

flannel实现跨主机通信

相关文章

  • kubernetes的网络实现

    kubernetes的网络实现 kubernetes的网络设计主要针对以下几种情况实现的: 同一pod下容器与容器...

  • Kubernetes网络实现

    在《Linux虚拟网络技术》这篇文章中我们已经详细介绍了Linux虚拟网络技术,在《Docker网络实现》这篇文章...

  • 5 网络与安全

    Kubernetes网络 提供多种选项帮助实现网络连接,k8s本身不关心如何实现它,但需满足三个基本要求: 无需N...

  • 橘子皮学docker之Kubernetes的网络知识

    目录 docker的网络通信 kubernetes的网络通信 总结 kubernetes集群搭建完成后,使用doc...

  • Kubernetes网络

    Kubernetes网络模型 Kubernetes网络模型设计的一个基础原则是:每个Pod都拥有一个独立的IP地址...

  • Kubernetes:网络

    Kubernetest网络 各容器之间的网络交互 一个容器想要与外界做到互通就需要一套网络栈也就是它发出、响应网络...

  • Kubernetes网络

    kube-proxy 我们知道,Kubernetes中Pod的生命是短暂了,它随时可能被终止。即使使用了Deplo...

  • 从CNI到OVN

    kubernetes各版本离线安装包 诸如calico flannel等CNI实现,通过牺牲一些功能让网络复杂度得...

  • 从零开始入门 K8s | Kubernetes 网络概念及策略控

    一、Kubernetes 基本网络模型 本文来介绍一下 Kubernetes 对网络模型的一些想法。大家知道 Ku...

  • 基于OVN的Kubernetes网络架构解析

    【编者的话】Kubernetes经过了几年的发展,存在着很多的网络方案。然而网络虚拟化在Kubernetes出现前...

网友评论

    本文标题:Kubernetes网络实现

    本文链接:https://www.haomeiwen.com/subject/ovyxtctx.html