Kubernetes网络模型原理

导语: Kubernetes 目前看来已经成为了 docke r的应用最多的编排工具,所以学习使用 docker 容器的话,就免不了使用 Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解...

导语:

Kubernetes 目前看来已经成为了 docke r的应用最多的编排工具,所以学习使用 docker 容器的话,就免不了使用 Kubernetes,但是其网络原理还是比较晦涩难懂,所以还是有必要专门解析关于 Kubernetes 的网络原理。

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 网络”模型而来。

Pod 所在的网络之间通信

Kubernetes 把各 node 主机上的 docker的 bridge 网络“外包”给了 flannel,然后通过 etcd 将各 node 主机上的 bridge 网络信息收集起来,因此每个 node 之间的网络使用的是同网络的不同 IP,保证了网络通讯的可靠性。其原理是根据 docker 的“bridge 网络”模型而来。

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实现的。

kube-proxy 有两种请求转发模式:userspace 模式和 iptables 模式。在 Kubernetes v1.1版本之前默认是userspace 模式,v1.2 版本后默认是 iptables 模式。

补充说明 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。

外界与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 访问。

总结

Kubernetes 网络模型的理解会对使用第三方产商提供的服务有更深刻的体会,比如阿里云,华为云都已经全面支持 Kubernetes 的编排。其中涉及了很多 Kubernetes 的基本原理,回过头来仔细想想,也无非是万变不离其宗。

  • 发表于 2018-10-30 14:26
  • 阅读 ( 637 )
  • 分类:默认分类

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
不写代码的码农
Kemin

架构工程师

45 篇文章

作家榜 »

  1. Kemin 45 文章
  2. golanglover 5 文章
  3. D.Chen 4 文章
  4. salamander 1 文章
  5. 深圳-伟 1 文章
  6. 广训 1 文章
  7. PHP小菜 1 文章
  8. Undefined 0 文章