技术笔记分享

云计算的核心是虚拟化技术,网络虚拟化技术又是最重要的组成部分,用于在物理网络上虚拟多个相互隔离的虚拟网络,实现网络资源切片,提高网络资源利用率,实现弹性化网络。Kubernetes作为容器云技术栈中的容器编排组件,必然需要在多租户(名称空间)的基础上实现弹性网络管理,这也是 ”基础设置“ 的要求之一。

网络模型概述

Kubernetes的网络主要存在四种类型的通信:
1)同一 Pod 内容器之间通信
2)各个 Pod 之间彼此通信
3)Pod 与 Service 之间的通信
4)集群外部流量与 Service之间的通信

Kubernetes为 Pod 和 Service 资源对象分别使用了各自的专用网络, Pod 网络由 Kubernetes的网络插件(常用的网络插件为Flannel)指定。而 Service 的网络则由 Kubernetes 集群直接指定,为了提供更灵活的解决方式,Kubernetes的网络模型需要借助外部插件实现,它要求任何实现机制都必须满足以下需求。
1)所有 Pod 间都可以不经过 NAT 转换而直接通信
2)所有节点都可以不经过 NAT 转换而直接与所有容器通信。
3)容器自己使用的 IP 也是其它容器或节点可以直接看到的地址,所有 Pod 对象都位于同一网络平面/同一网络中,而且可以使用 Pod 自身的地址直接通信。

Kubernetes 使用的网络插件必须能为 Pod 提供满足以上要求的网络,它需要为每个 Pod 上配置至少一个特定地址,即 Pod IP,Pod IP实际存在某个网络(可以是虚拟设备)上,而 Service 的地址却是一个虚拟 IP 地址,不在任何网络接口上,它由 kube-proxy 借助 iptables 规则或 ipvs 规则重定向到本地端口,再将其调度至后端 Pod IP上。
Service 的 IP 地址是集群提供的接口,也被称为Cluster IP

Pod 网络及 Pod IP由 Kubernetes 的网络插件Flannel来配置和管理,具体使用的网络地址可以在配置管理插件的时候指定,默认为 10.244.0.0/16 网络。而 Cluster/Service 网络和 IP 则是由 Kubernetes 集群负责配置和管理,默认为 10.96.0.0/12网络。

Kubernetes集群至少应该包含三个网络,如下图所示:

网络一:各个宿主机 MasterNodeetcd 之间的网络,用于宿主机之间的通信。

网络二:Kubernetes 集群上专用于 Pod 资源对象的网络,它是一个虚拟网络,用于为各个 Pod 对象设定Ip地址等网络参数,其地址配置于 Pod 中容器的网络接口之上。Pod 网络需要借助 kubenet 插件或 CNI (Container Network Interface:容器网络接口)实现,Flannel亦是基于CNI协议之上的网络插件,该插件可独立部署与 Kubernetes 集群之外,也可以以 Pod 的形式托管在 Kubernetes 之上,他需要在构建 Kubernetes 集群时由管理员进行定义,而后在穿件 Pod 对象时由其自动完成各网络参数的动态配置。

网络三:用于 Service 资源对象的网络,它属于一个虚拟网络,却不在任何网络接口上,用于为 Kubernetes 集群之中的 Service 配置 IP 地址,但此地址并不配置与任何主机或容器的接口之上,而是通过 Node 之上的 kube-proxy 配置为 iptables 或者 ipvs 规则,从而发往此地址的所有流量调度至其后端的各 Pod 对象之上。Service 网络/网段在 Kubernetes 集群创建时给予指定,而各 Service 的IP地址则在用户创建 Service时给予动态指定配置。

undefined

集群上的网络通信

Kubernetes 集群的客户端大概可以分为两类:API Server 客户端和应用程序(运行为 Pod 中的容器)客户端,如下图所示。
第一类客户端即是图中的 开发/运维 所通过 APIServer 使用 kubectl 或 Web 图形 UI (例如 Kubernetes Dashboard)进行对Kubernetes集群的管理任务,例如,管理集群上的各种资源对象。
第二类客户端即为图中的 应用客户端,他们访问的目标是 Pod 上运行于容器中的应用程序所提供的服务,如 Redis、Nginx等,不过这些访问请求要由 Server 或 Ingress资源对象转发给 Pod进行。

undefined

发表评论

邮箱地址不会被公开。 必填项已用*标注