大家好,感谢邀请,今天来为大家分享一下深入解析 Kubernetes 网络架构与实现策略的问题,以及和的一些困惑,大家要是还不太明白的话,也没有关系,因为接下来将为大家分享,希望可以帮助到大家,解决大家的问题,下面就开始吧!
POD 中的所有容器共享一个LINUX NET NAMESPACE(网络堆栈)。 POD 中的容器可以使用localhost 访问pod 中的其他容器。
K8S 对集群网络的要求:
所有容器无需NAT 即可访问其他容器。所有节点都可以与所有容器通信,无需NAT。反之亦然,容器的地址和别人看到的地址是一样的。
kubernetes 网络实现
POD间通信网络模型
image.png 节点间通信网络模型
image.pngip1 ip2 都存储在etcd中
K8S中不同节点的Pod之间进行通信需要满足以下条件:
整个K8S集群中的POD IP分配不能冲突。想办法将POD的IP与其所在NDOE的IP关联起来。通过这种关联,POD 可以相互访问。条件1要求NODE中docker0的桥地址不能冲突。
条件2要求当POD中的数据发送出去时,需要有一种机制知道对方POD的IP地址在哪个NODE上。
满足条件的扁平网络拓扑如下
image.png docker0的默认网络是172.17.0.0/16网段。每个容器都会获取该子网中的IP,并使用docker0作为网关。
docker主机不需要知道docker 0的任何信息,因为docker主机伪装了物理卡上任何容器发送的数据(masquerade隐含nat),也就是说任何其他节点看到的数据的来源数据包是主机的物理网卡IP。
这种模式的缺点是需要使用NAT技术
在K8S模型中,每个NODE上的docker0都可以路由。也就是说,部署POD时,同一个集群中,每台主机都可以访问其他主机上的POD IP,不需要在主机上做端口映射。
我们可以将NODE视为一个交换网络模型,如下所示
image.png 在node中,我们目前使用直接路由来实现。在每个节点上配置podium 路由。
例如,在192.168.1.10上配置
路由添加-net 10.1.20.0 网络掩码255.255.255.0 gw 192.168.1.20
route add -net 10.1.30.0 netmask 255.255.255.0 gw 192.168.1.30 当我们启动一个POD时,要求该POD下的所有容器都使用相同的网络命名空间和相同的IP,所以必须使用容器网络的容器模式。如果把Pod中的所有容器做成链式结构,如果中间任何一个容器出现问题,都会引起连锁反应,所以在每个POD中引入一个google_containers/pause,其他容器都链接到这个容器上,由google_containers/pause 负责港口规划和测绘
POD内部的网络模型为
image.pngpause 容器用于接管pod 的端点。
通过docker inpsect检查pause容器的网络模式| grep 网络模块。可以看到使用了bridge以及业务容器docker inpsect业务容器id | grep NetworkMod 使用container: 长ID。
服务网络信息
当K8S中创建一个服务(非NODEPORT)时,K8S会给每个服务分配一个集群IP。
roger@microk8s:~$ kubectl 获取服务
名称类型集群IP 外部IP 端口年龄
默认http 后端ClusterIP 10.152.183.6980/TCP 11d
http-svc ClusterIP 10.152.183.16480/TCP 11dIP地址段为apiserver启动时--server-cluster-ip-range指定的IP段。该IP段不能与docker0的IP段冲突。该网段不会在物理网络和docker0 之间进行路由。该门户网络的目的是将容器流量引导至默认网关,即docker0
查看iptables-保存数据
:KUBE-后布线- [0:0]
.
-A KUBE-PORTALS-CONTAINER -d 10.152.183.69/32 -p tcp -m comment --comment "default/default-http-backend:" -m tcp --dport 80 -j REDIRECT --to-ports 37853
-A KUBE-PORTALS-CONTAINER -d 10.152.183.164/32 -p tcp -m comment --comment "default/http-svc:http" -m tcp --dport 80 -j REDIRECT --to-ports 35667
-A KUBE-PORTALS-CONTAINER -d 10.152.183.1/32 -p tcp -m comment --comment "default/kubernetes:https" -m tcp --dport 443 -j REDIRECT --to-ports 40441
.
-A KUBE-PORTALS-HOST -d 10.152.183.69/32 -p tcp -m comment --comment "default/default-http-backend:" -m tcp --dport 80 -j DNAT --to-destination 192.168.10.5:37853
-A KUBE-PORTALS-HOST -d 10.152.183.164/32 -p tcp -m comment --comment "default/http-svc:http" -m tcp --dport 80 -j DNAT --to-destination 192.168.10.5:35667
-A KUBE-PORTALS-HOST -d 10.152.183.1/32 -p tcp -m comment --comment "default/kubernetes:https" -m tcp --dport 443 -j DNAT --to-destination 192.168.10.5:40441 可以找到,将三个服务的流量重定向到一个随机端口,37853、35667、40441。这些端口都是由kube-proxy 创建的。 kube-proxy 服务会将一个随机端口与每个创建的服务关联起来。并侦听该特定端口,为该服务创建关联的负载均衡器。
image.png 请注意,node3 的kubeproxy 不参与此交互。 node1的kube-proxy起到负载均衡的作用
文章分享结束,深入解析 Kubernetes 网络架构与实现策略和的答案你都知道了吗?欢迎再次光临本站哦!
【深入解析 Kubernetes 网络架构与实现策略】相关文章:
2.米颠拜石
3.王羲之临池学书
8.郑板桥轶事十则
用户评论
终于找到这方面的详细讲解了,一直想懂K8S网络架构就这问题卡住了。
有6位网友表示赞同!
看完这个标题,感觉可以彻底搞定kubernetes网络方面的问题了!
有14位网友表示赞同!
我是Kubernetes的入门者,希望能从这篇文章中学到一些实用的知识点。
有16位网友表示赞同!
想了解两种不同的K8S 网络实现方式, 这篇帖子就正好适合我。
有8位网友表示赞同!
最近在项目中用到了K8S,理解网络部署非常重要哦!
有9位网友表示赞同!
感觉Kubernetes网络设置有点复杂,希望这篇文章能通俗易懂的解释一下。
有20位网友表示赞同!
之前对K8S网络机制了解很少,可以参考下这篇详解,学习学习。
有12位网友表示赞同!
工作中经常遇到K8S网络问题,需要好好查阅下这篇文章解决!
有12位网友表示赞同!
看标题就知道很有实用价值,赶紧去看看能不能解开我在部署方面的疑惑。
有10位网友表示赞同!
Kubernetes的网络架构确实比较难懂,希望这篇文章能给我一些启发。
有6位网友表示赞同!
我已经学会了基本的Kubernetes操作,接下来想深入学习网络搭建方面
有10位网友表示赞同!
两者的实现方式有哪些区别呢?这篇文章应该会说明很详细吧!
有20位网友表示赞同!
期待这篇讲解能清晰地描述K8S网络的细节和特点
有17位网友表示赞同!
学习Kubernetes最重要的就是搞明白它的网络是如何工作的。
有11位网友表示赞同!
希望能从文章中掌握一些常用的K8S 网络工具和配置方法。
有5位网友表示赞同!
终于找到一篇深入讲解K8S 网络实现的文章!太棒了!
有8位网友表示赞同!
对于初学者来说,这样的详细介绍很有帮助。可以一步步了解K8S网络的运作机制。
有17位网友表示赞同!
对Kubernetes比较感兴趣,想了解更多关于网络方面的知识和实践案例.
有20位网友表示赞同!