Kubernetes——k8s网络模型基础

k8s网络模型基础

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

一、网络模型概述

 Kubernetes 的网络中主要存在四种类型的通信:

  • 同一 Pod 内的容器间通信;
  • 各 Pod 彼此之间的通信;
  • Pod 与 Service 间的通信;
  • 集群外部的流量同 Service 之间的通信。

  Kubernetes 为 Pod 和 Service 资源对象分别使用了各自的专用网络Pod 网络由 Kubernetes 的网络插件配置实现,而 Service 的网络则由 Kubernetes 集群予以指定为了提供更灵活的解决方式,Kubernetes 的网络模型需要借助于外部插件实现,它要求任何实现机制都必须满足以下需求:

  • 所有 Pod 间均不可经 NAT 机制而直接通信。
  • 所有节点均可不经 NAT 机制而直接与所有容器通信。
  • 容器自己使用的 IP 也是其他容器或节点直接看到的地址。换句话讲,所有 Pod 对象都位于同一平面网络中,而且可以使用 Pod 自身的地址直接通信。

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

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

  总结起来,Kubernetes 集群至少应该包含三个网络,如下:

  • 第一个是各主机( Master、Node 和 etcd 等)自身所属的网络,其地址配置于主机的网络接口,用于各主机之间的通信,例如: Master 与各 Node 之间的网络通信。此地址配置于 Kubernetes 集群构建之前,它并不能由 Kubernetes 管理,管理员需要于集群构建之前自行确定其地址配置及管理方式。
  • 第二个是 Kubernetes 集群上专用于 Pod 资源对象的网络,它是一个虚拟网络,用于为各 Pod 对象设定 IP 地址等网络参数,其地址配置于 Pod 中容器的网络接口之上。Pod 网络需要借助 kubelet 插件或 CNI 插件实现,该插件可独立部署于 Kubernetes 集群之外,亦可托管于 Kubernetes 之上,它需要在构建 Kubernetes 集群时由管理员进行定义,而后在创建 Pod 对象时由其自动完成各网络参数的动态配置。
  • 第三个是专用于 Service 资源对象的网络。它也是一个虚拟网络,用于为 Kubernetes 集群之中的 Service 配置 IP 地址,但此地址并不配置于任何主机或容器的网络接口之上,而是通过 Node 之上的 kube-proxy 配置为 iptables 或 ipvs 规则,从而将发往此地址的所有流量调度至其后端的各 Pod 对象之上。Service 网络在 Kubernetes 集群创建时予以指定,而各 Service 的地址则在用户创建 Service 时予以动态配置。

二、集群上的网络通信

 Kubernetes 集群的客户端大体可以分为两类:

    • API Server 客户端
    • 应用程序客户端(运行为 Pod 中的容器)
  • 第一类客户端通常包含 人类用户 和 Pod 对象两种,它们通过 API Server 访问 Kubernetes 集群完成管理任务,例如:管理集群上的各种资源对象。
  • 第二类客户端一般也包含 人类用户 和 Pod 对象两种,它们的访问目标是 Pod 上运行于容器中的应用程序的各种具体的服务,如 redis 或 nginx 等,不过,这些访问请求通常要经由 Service 或 Ingress 资源对象进行。

  另外第二类客户端的访问目标对象的操作要经由第一类客户端创建和配置完成后才能进行。

  访问 API Server 时,人类用户一般借助于工具 kubectl 或图形化UI(例如 Kubernetes Dashboard)进行,也可以通过编程接口进行访问,包括 REST API。访问 Pod 中的应用时,其访问方式取决于 Pod 中的应用程序,例如:对于运行 Nginx 容器的 Pod 来说,其最常用工具自然是浏览器。

  管理员(开发人员或运维人员)使用 Kubernetes 集群的常见操作包括通过控制器创建 Pod,在 Pod 的基础上创建 Service 供第二类客户端访问,更新 Pod 中的应用版本(更新和回滚)以及对应用规模进行扩容和缩容等,另外还有集群附件管理、存储卷管理、网络及网络策略管理、资源管理和安全管理等。

posted @ 2022-06-09 16:08  左扬  阅读(193)  评论(0编辑  收藏  举报
levels of contents