docker应用最多的编排工具:Kubernetes网络模型原理

2018-10-3108:58:30计算机网络技术Comments2,938 views字数 1985阅读模式

Kubernetes 目前看来已经成为了docker的应用最多的编排工具,所以学习使用docker容器的话,就免不了使用 Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解析关于 Kubernetes 的网络原理。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

Kubernetes 的网络模型组成

  • Pod 内部 docke r容器之间网络通信[基础 docker 网络理论]
  • Pod 所在的网络之间通信[基础 docker 网络理论]
  • Pod 和 Service 之间网络通信[ Kubernetes 网络理论]
  • 外界与Service之间网络通信[ Kubernetes 网络理论]

Pod 内部 docker 容器之间网络通信

Kubernetes 使用了一种 “IP-per-pod” 网络模型:为每一个 Pod 分配了一个IP地址,Pod 内部的 docker 容器共享Pod的网络空间,即它们共享 Pod 的网卡和 IP。其原理是根据 docker 的“container 网络”模型而来。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

Pod 所在的网络之间通信

Kubernetes 把各 node 主机上的 docker的 bridge 网络“外包”给了 flannel,然后通过 etcd 将各 node 主机上的 bridge 网络信息收集起来,因此每个 node 之间的网络使用的是同网络的不同 IP,保证了网络通讯的可靠性。其原理是根据 docker 的“bridge 网络”模型而来。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

Pod 和 Service 之间网络通信

在 Kubernetes 体系中Pod是不稳定的,Pod 的 IP 地址会发生变化,所以 Kubernetes 引进了 Service 的概念。Service 是一个抽象的实体,Kubernetes 在创建 Service 实体时,为其分配了一个虚拟的 IP,当外界需要访问 Pod 里的容器提供的功能时,不直接使用 Pod 的 IP 地址和端口,而是访问 Service 的这个虚拟 IP 和端口,由 Service 把请求转发给它背后的 Pod。Kubernetes 在创建 Service 时,根据 Service 的标签选择器(Label Selector)来查找 Pod,据此创建与 Service 同名的 EndPoints 对象。当Pod的地址发生变化时,EndPoints 也随之变化。Service 接受到请求时,就能通过 EndPoints 找到对应的 Pod。再深入探究,Service 只是一个虚拟的概念,真正完成请求转发的是运行在 node 节点上的 kube-proxy。Service的虚拟IP就是由kube-proxy实现的。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

kube-proxy 有两种请求转发模式:userspace 模式和 iptables 模式。在 Kubernetes v1.1版本之前默认是userspace 模式,v1.2 版本后默认是 iptables 模式。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

补充说明 iptables 模式:

当创建 Service 时,所有 node 节点上的 kube-proxy 都会建立两级 iptables 规则,一级为 Service 创建,目的是将<服务虚拟 IP,端口>的流量转给后端,另一级为 EndPoints 创建,目的是用于选择 Pod。当 service.spec.sessionAffinity 值为 ”ClientIP” 时,iptables模式选择 Pod 的算法和 userspace 模式相同(选择与请求来源IP更接近的 Pod)。当 service.spec.sessionAffinity 值为”None”时,随机选择Pod,所以如果被选择的 Pod 没有响应,不会尝试选择另一个 Pod。
docker应用最多的编排工具:Kubernetes网络模型原理文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

外界与Service之间网络通信

①ClusterIP 类型,这种类型的 Service 只会得到虚拟的 IP 和端口,只能在 Kubernetes 集群内部被访问,此模型是为默认类型。
②NodePort 类型,这种类型的 Service 除了会得到虚拟的IP和端口,Kubernetes 还会在所有 node 节点上为其分配端口。分配的端口的值可以通过 spec.ports[*].nodePort 指定,或由 Kubernetes 在配置好的区间里分配(默认为 30000-32767)。这种 Service 即可以从 Kubernetes 集群通过虚拟 IP:端口访问,也可以从集群外部通过Node节点的 IP:nodePort 访问。
③LoadBalancer 类型,这种类型的 Service 除了会得到虚拟的 IP 和端口,Kubernetes 还会在所有 Node节点上为其分配端口,然后为其开通负载均衡。这种 Service 即可以从 Kubernetes 集群通过虚拟IP:端口访问,也可以从集群外部通过  node 节点的 IP:nodePort访问,还可以通过负载均衡的 IP 访问。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

总结

Kubernetes 网络模型的理解会对使用第三方产商提供的服务有更深刻的体会,比如阿里云,华为云都已经全面支持 Kubernetes 的编排。其中涉及了很多 Kubernetes 的基本原理,回过头来仔细想想,也无非是万变不离其宗。文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

作者:周知非
来源:掘金文章源自菜鸟学院-https://www.cainiaoxueyuan.com/wangluo/7584.html

  • 本站内容整理自互联网,仅提供信息存储空间服务,以方便学习之用。如对文章、图片、字体等版权有疑问,请在下方留言,管理员看到后,将第一时间进行处理。
  • 转载请务必保留本文链接:https://www.cainiaoxueyuan.com/wangluo/7584.html

Comment

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定