k8s网络规划、网络通信的认识

一、k8s网络规划

(一)、k8s网络设计

1、每个Pod都拥有一个独立IP地址,Pod内所有容器共享一个网络命名空间。

2、集群内所有pod都在一个直接联通的扁平网络中,可通过IP直接访问。

(1)所有的Pod之间可以在不使用NAT网络地址转换的情况下相互通信。

(2)所有的Node之间可以在不使用NAT网络地址转换的情况下相互通信

(3)每个pod自己看到的自己的IP和其他pod看到的一致

(二)、k8s网络要求

k8s对网络的要求总的来说主要有两个基本要求,分别是:

(1)要能够为每一个node上的pod分配互相不冲突的IP地址

(2)要所有Pod之间能够互相访问

(三)K8s网络规范

CNI是由coreos提出的一个容器网络规范。已采纳规范的包括apache mesos,cloud foundry,kuberne,另外contiv networking,project calico和weave这些项目也为CNI提供插件。

CNI(容器网络接口):

这是k8s中提供一种通用网络标准规范,因为K8s本身不提供网络解决方案。目前比较知名的网络解决方案有:

flannel

calico

canel

kube-router

.......

(四)k8s网络规范

(1)隧道方案

隧道方案在Iaas层的网络中应用也比较多,将Pod分布在一个大二层的网络规范下。网络拓扑简单,但随着节点规范的增长复杂度会提升。

weave:UDP广播,本机建立新的BR,通过PCAP互通

open vswitch(OVS):基于Vxlan和GRE协议,但是性能方面损失比较严重

Flannel:UDP广播,Vxlan

Racher:IPsec

(2)路由方案

路由方案一般是从3层或者2层实现隔离和跨主机容器互通的,出了问题也很容易排查

Calico:基于BGP协议的路由方案,支持很细致的ACL控制,对混合云亲和度比较高。

Macvlan: 从逻辑和kernel层来看隔离性和性能最优的方案,基于二层隔离,所以二层路由器支持。大多数云服务商不支持,所以混合云上比较难以实现

  • (五)k8s pod网络创建流程

(1)每个Pod除了创建时指定的容器外,都有一个kubelet启动时指定的基础容器

(2)kubelet创建基础容器,生成network namespace

(3)kubelet调用网络CNI drive,由它根据配置调用具体CNI插件(eg:calico,flannel)

(4)CNI插件给基础容器配置网络

(5)pod中其他的容器共享使用基础容器的网络

二、K8S网络

前言:K8S有三种网络三种IP

(一)k8s的网络通信问题:

1、容器间通信问题:即同一个pod内多个容器间通信,通常使用loopback来实现。

2、pod间通信:k8s要求,pod和pod之间通信必须使用pod-ip“直接”访问另一个pod-ip

3、pod与service通信:即pod-ip去访问clusterip,当然,clusterip实际上是IPVS或iptables规则的虚拟IP,是没有TCP/IP协议栈支持的。但不影响pod访问它。

4、service与集群外部client的通信,即k8s中提供的服务必须能被互联网上的用户所访问到。

(二)pod网络与service网络的初步认识

k8s为pod和service资源对象分别使用了各自的专用网络,pod网络由k8s的网络插件配置实现;而service的网络则由k8s集群给予实现。

为了提供更灵活的解决方案,k8s的网络模型需要借助外部插件实现,它要求任何实现机制都必须满足以下要求:

1)所有Pod之间均可不通过NAT机制而直接通信

2)所有节点均可不结果NAT机制而直接与所有容器通信。

3)容器自己使用的IP地址也是其他容器或节点直接看到的地址。换句话说,所有pod对象都位于同一个平面网络中,而且可以使用pod自身的地址直接通信

k8s使用的网络插件必须能为pod提供满足以上的要求,它需要为每个Pod配置至少一个特定的地址,即pod ip。

(1)IP是否存在于网卡上

pod ip地址实际存在于某个网卡(可以是虚拟设备)上;而service的地址却是一个虚拟IP地址,没有任何网络接口,在将其调度至后端pod对象。service的IP地址是集群提供服务的接口,也称为cluster ip。

(2)IP由哪个插件配置

pod网络机器IP由k8s的网络插件负责配置和管理,具体使用的网络地址可在管理配置插件时指定,如10.244.0.0/16网络;而cluster网络和IP则是由k8s集群负责配置和管理,如10.96.0.0/12网络

(3)总结:

总结起来,k8s集群至少应该包含三个网络,如下图所示。一个是各主机(master、node和etcd等)自身所属的网络,其地址配置与主机的网络接口,用于各主机之间的通信,例如,master与个node之间的通信。

此地址配置与k8s集群构建之前,它并不能由k8s管理,管理员需要于集群构建之前自行确定其地址配置及管理方式。

第二个是k8s集群上赚用于pod资源对象的网络,它是一个虚拟网络,用于为各pod对象设定IP地址等网络参数,其地址配置与pod中容器的网络接口之上。pod网络需要借助k8s插件或NCI插件实现,改插件可独立于部署于k8s集群之外,亦可托管于k8s之上,它需要在构建k8s集群时由管理员定义,而后在创建pod对象时由其自动完成各网络参数的动态配置。

第三个是专用与service资源对象的网络,它也是一个虚拟网络,用于为k8s集群之中的service配置IP地址,但此地址并不配置于任何主机或容器的网络接口之上,而是通过node之上的kube-proxy配置为iptables或ipvs规则,际上是IPVS或iptables规则的虚拟IP从而将发往此地址的所有流量调度至其后端的各pod对象之上。service网络在k8s集群创建时给予指定,而各service地址则在用户创建service时给予配置。

  • 三种IP的定义与理解

三种IP定义:

1、node ip:node节点的IP地址,即物理机(虚拟机)的IP地址。

2、pod ip: pod的IP地址,即docker容器的IP地址(由flannel提供),此为虚拟IP地址

3、cluster ip:service的IP地址,此为虚拟IP地址。

三种IP的理解:

(1)node ip: 是物理机IP(或虚拟机ip)。每个service都会在node节点上开通过一个端口,外部可以通过http://nodeip:nodeport即可访问service里的pod提供的服务。

(2)cluster ip:是service的IP地址,此为虚拟ip地址,外部网络无法ping通,只有k8s集群内部访问使用;cluster ip仅仅作用于k8s service这个对象,并由k8s管理和分配IP地址;cluster ip无法被ping,他没有一个“实体网络对象”。单独的cluster ip不具备通信的基础,并且他们属于k8s集群这样一个封闭的空间;在不同service的pod节点在集群间相互访问可以通过cluster ip。

(3)pod ip:是每个pod的IP地址,一般由网络插件提供配置(flannel),通常是一个虚拟的二层网络。同service下的pod可以直接根据podip相互通信;不同service下的pod在集群间pod通信要借助于cluster ip;

pod和集群通信,要借助于node ip。

(四)k8s的网络中pod的通信

1、通一个pod内的容器间通信:

因为pause容器提供pod内网络共享,所以容器直接可以使用localhost(lo,loopback,环回侦听端口)访问其他容器。

2、各pod彼此之间的通信(两个pod在一台主机上面,两个pod分布在不同主机之上)

1)两个pod在一台主机上面:通过dockere默认的docker网桥互联容器(docker0)

2)两个pod分布在不同主机之上:通过CNI插件实现,eg: flannel,calico

 

3、pod与service之间的通信

service分配的IP叫做cluster ip,是一个虚拟IP(相对固定,除非删除service),ip只能在k8s集群内部使用(clusterip模式);如果service需要对外提供,只能使用nodeport方式映射到主机上,使用主机的ip和端口对外提供服务(nodeport模式)。

      节点上面有个kube-proxy进程,这个进程会从master apiserver、etcd获取信息,感知service和endpoint(用来记录一个service对应的所有pod的访问地址。)的创建,然后做两个事:

1)为每个service在集群中每个节点上面创建一个随机端口,任何此端口上面的连接会代理到相应的pod。

2)集群中每个节点安装iptables/ipvs规则,用于clusterip+port路由到上一步定义的随机端口上。

 所以集群中每个Node节点都有service的转发规则:iptables -L -n -t filter

 

备注:

https://zhuanlan.zhihu.com/p/126116540

Linux网络名词的解释:

(1)网络的命名空间:Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命名空间中,彼此间无法通信。

(2)veth设备对(v+eth):veth设备对的引入实现在不同网络命名空间的通信。

(3)iptable/netfilter: netfilter负责在内核中执行各种挂接的规则(过滤、修改、丢弃等),运行在内核模式中;iptables模式是在用户模式下运行的进程,负责协助维护内核中netfileter的各种规则表;通过两者的配合来实现整个linux网络协议中灵活的数据包处理机制。

(4)网桥:网桥是一个二层网络设备,通过网桥可以将Linux支持的不同端口连接起来,并实现类似交换机那样的多对多的通信。

(5)路由:linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。

 

 

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 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网络PodK8s中的最小调度单元,它可以包含一个或多个容器。每个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、付费专栏及课程。

余额充值