k8s网络模型


一、同一pod(sidecar)

好处

  • 在同一个pod,将关系紧密的容器放在一起,通过挂载同一数据卷来共享数据
  • 共享网络,内部相互调用访问更高效

坏处

  • 共享网络,每个容器的端口需要规划
  • 一个容器需要升级,会影响到整个pod滚动升级

二、pod和集群网络

在容器启动前,会为容器创建一个虚拟Ethernet接口对,这个接口对类似于管道的两端,其中一端在主机命名空间中,另外一端在容器命名空间中,并命名为eth0。在主机命名空间的接口会绑定到网桥(2层)。网桥的地址段会取IP赋值给容器的eth0接口。

同一节点下

当pod发往网桥时,会成功被arp解析转发

不同节点

Kubernetes网络模型要求Pod IP在整个网络上都是可访问的。通常,为群集中的每个节点分配一个CIDR块,以指定该节点上运行的Pod可用的IP地址。目的地为CIDR块的流量一旦到达该节点,会将其转发到指定的pod上。这里的数据包在网桥处并会被arp解析失败从而通过路由根据CIDR发送到正确的节点。

三、service网络

为了解决Pod IP地址不是持久性的,可能会进行更改,k8s采用service对pod进行抽象,service为pod组提供虚拟ip,任何路由到这个虚拟ip的,都将转发到对应关联的pod上,而且service还提供高可用与负载均衡

netfilter

为了在群集内执行负载平衡,Kubernetes依赖于Linux内置的网络框架netfilter; Netfilter是Linux提供的框架,它允许以自定义处理程序的形式实现与网络相关的各种操作。数据包筛选,网络地址转换和端口转换的操作,提供了通过网络引导数据包所需的功能,并提供了禁止数据包到达计算机网络内敏感位置的功能。

iptables

默认采用iptables,其是一个用户空间程序,它提供了一个基于表的系统,用于定义netfilter模块的处理和转换数据包的规则;iptables规则监视发往服务虚拟的流量IP,并从一组可用的Pod中随机选择一个Pod IP地址,并且iptables规则将数据包的目标IP地址从服务的虚拟IP更改为所选Pod的IP。
clustip
nodeport,在node上面开启一个监听端口,负责将service暴露给外面访问,通过访问这个service的这个端口可以确认访问这个service,会有iptables做地址转换
pod去访问service是需要通过宿主机的,不然没法通过宿主机的内核net_filter模块做nat地址转换
在这里插入图片描述

  • 数据包通过eth0离开pod1
  • 数据包来到网桥,arp协议不了解服务,发往默认路由eth0
  • 在到达eth0前,iptables改写目标ip为特点的pod ip,并记录下来这次的pod选择,以便将来的相同事件

coreDNS

k8sDns的默认实现,配置在每个Node上运行的kubelet,集群中的服务都分配有DNS名称,当容器需要解析DNS名称时进行解析。

四、networkpolicy

pod级别的网络访问策略
常见实现有iptables规则控制和ovs流表控制。
flannal实现方案

五、CNI容器网络标准

cni

CNI(container network interface)是一个接口规范,用于编写k8s集群的网络插件。有四个命令,add、del、check、version。
插件分类

  • main,负责容器网卡的初始化或者清理。。
    bridge,和 docker 默认的网络模型很像,把所有的容器连接到虚拟交换机上

  • meta,本身并不会提供具体的网络功能,它会调用其他插件,或者单纯是为了测试;
    flannel,结合 bridge 插件使用,根据 flannel 分配的网段信息,调用 bridge 插件,保证多主机情况下容器
    tunning、bandwith

  • ipam,负责ip管理,常见的实现有host-local、dhcp

这些插件可以链式调用
插件运行过程

  • 会先去/etc/cni/net.d/*读取的第一个文件作为配置文件,然后去/opt/cni/bin/*执行cni插件
  • 当kubelet创建pod的时候会去创建pause容器,当发现pause容器可以了后,会尝试为这个容器配置网络,当发现某个pod要删除了,会删除这个pod的业务容器,并检查其对应的pause容器是否不需要了,如果不需要则进行删除
    在这里插入图片描述
    这里的流程是,kubelet创建pause容器 -> 检查pause容器 -> 根据配置文件,执行add命令->先去执行bridge插件,bridge插件查看到ipam有内容,会执行host-local -> 然后把其执行结果配置作为bridge的输入,去配置ip路由,将结果组装起来返回给kubelet -> kubelet会去执行下一个插件tuning -> tuning执行完,kubelet认为网络配置成功 -> 开始创建pod的业务容器

pause容器(PodSandbox)

每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效,在设计时我们可以充分利用这一特性将一组密切相关的服务进程放入同一个Pod中。同一个Pod里的容器之间仅需通过localhost就能互相通信。

cni调用和设计

在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Kubernetes 的网络系统是由多个组件组成的, 它们协作为应用程序提供网络连接和通信. 其中一些主要的组件包括: - kube-proxy: 运行在每个节点上, 负责为 Pod 和 Service 提供代理服务. - kube-dns: 为应用程序提供 DNS 服务. - 网络插件: 用于为 Pod 提供网络连接, 支持不同的网络模型, 如 Calico, Flannel, Cilium 等. - Service: 为应用程序提供负载均衡和服务发现. Kubernetes 的网络模型是基于 Pod 的, 每个 Pod 都有一个独立的 IP 地址, 使得容器间直接通信成为可能. Service 则提供了一种发现和负载均衡的机制, 让外部客户端可以访问 Pod. ### 回答2: Kubernetes(K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序。下面是一些与K8s网络相关的知识点。 1. 服务发现:K8s通过DNS(域名系统)服务提供内部服务发现机制。每个服务都会被分配一个唯一的域名,其他服务可以通过该域名访问该服务。 2. Pod网络:Pod是K8s中的最小调度单元,它可以包含一个或多个容器。每个Pod都有一个唯一的IP地址,容器可以通过本地回环地址访问其他Pod中的容器。 3. 容器网络接口(CNI):CNI是一个规范,用于定义容器网络的实现方式。K8s使用CNI插件来设置和管理Pod的网络。不同的CNI插件可以支持不同的网络方案,如VLAN、VXLAN、Calico等。 4. 服务代理:K8s使用服务代理来实现服务之间的通信。服务代理可以在集群各个节点上运行,并通过负载均衡来分发到后端Pod。 5. 网络策略:K8s允许用户通过网络策略来定义集群中的网络访问规则。网络策略可以限制哪些Pod可以与另一个Pod通信,以及允许的协议和端口。 6. Ingress控制器:Ingress控制器是K8s中用于管理入站网络流量的组件。它可以将外部流量路由到集群内部的服务,并提供负载均衡和SSL终止等功能。 7. 可插拔网络解决方案:K8s提供了一些可插拔的网络解决方案,如Flannel、Calico等。这些解决方案可以根据具体需求选择,以提供不同的网络拓扑结构和性能。 总而言之,K8s网络相关的知识点包括服务发现、Pod网络、CNI、服务代理、网络策略、Ingress控制器和可插拔网络解决方案。这些知识点帮助我们理解和管理K8s集群中的网络配置和通信。 ### 回答3: Kubernetes(简称k8s)是一种用于容器编排和管理的开源平台,它涉及到一些重要的网络概念和组件。 首先,k8s网络模型是基于虚拟网络的概念。每个k8s集群中的容器都会被分配一个独立的IP地址,并且可以通过这个IP地址跨节点进行通信。这是通过一个称为kube-proxy的组件实现的,它会在每个节点上监听API服务器上的变化,并使用iptables或者IPVS等工具在宿主机上进行流量转发。 其次,k8s通过Service和Endpoint来暴露和访问容器。Service是一个逻辑概念,用于封装一组具有相同功能的容器,在集群内部提供服务的访问入口。一个Service可以通过ClusterIP、NodePort或者LoadBalancer等不同的类型暴露。而Endpoint是实际运行容器的IP和端口的集合,用于告诉Service流量应该转发到哪里。 此外,k8s还支持Ingress资源,用于在集群外部暴露服务,实现外部访问。Ingress通过定义一个或多个规则,将外部流量转发到不同的Service上,从而实现域名或路径的复杂路由。 最后,网络插件是k8s网络中的重要组件。k8s提供了一些默认的网络插件,如Flannel、Calico等,用于管理Pod之间的网络通信。网络插件负责创建网络的子网和路由表,并将Pod的IP地址与宿主机的虚拟网卡进行关联。 总结来说,k8s网络涉及到虚拟网络、kube-proxy、Service、Endpoint、Ingress等概念和组件,这些都是为了实现容器间的通信和外部访问的需求。不同的网络插件可以根据具体需求选择,以满足集群的网络需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值