Kubernetes 网络使您能够在 k8s 网络内配置通信。它基于扁平网络结构,无需在主机和容器之间映射端口。
Kubernetes 网络支持容器化组件之间的通信。这种网络模型的主要优点是不需要在主机和容器之间映射端口。然而,配置 Kubernetes 网络模型并不是一件容易的事。在本文中,您将了解什么是 Kubernetes 网络,探索常见的实现,并发现关键的 Kubernetes 网络变化。
什么是 Kubernetes 网络?
Kubernetes (k8s) 是一个开源容器编排平台。您可以使用它来自动化本地或云中容器的部署、更新和操作。使用 k8s,您可以跨多个基础架构管理容器化工作负载,而无需担心操作系统或环境。
Kubernetes 网络是 k8s 用来实现其组件之间通信的模型。它基于扁平的网络结构,不需要你在主机和容器之间映射端口。尽管 Kubernetes 网络设置起来可能是一个挑战,但它是任何 k8s 操作的重要组成部分,并且您需要了解它才能成功部署。
常见的 Kubernetes 网络实现
使用 Kubernetes 时,平台会强制实施需要第三方工具来实现的网络模型。您可以选择许多第三方工具,但以下三个是流行的选项。
Flannel——一种为 k8s 设计的开源网络结构。Flannel 通过每个主机上的二进制代理运行。该代理将子网租用分配给主机并使用 etcd 来存储配置数据。Project Calico——一个开源网络供应商和政策引擎。Calico 使您能够创建一个可扩展的网络解决方案来连接 k8s pod。它还使您能够在主机网络或服务网格层上实施安全策略。Weave Net — 一种专有网络工具包,可用于创建虚拟网络。Weave Net 包括弹性、可扩展性、安全性、多播网络和服务发现等功能。它基于去中心化架构,不需要任何外部配置服务或存储。Kubernetes 网络变化
在标准的 Kubernetes 部署中,您应该注意多种网络变化。以下是需要了解的最常见的网络情况。
容器到容器网络
网络的高级视图描述了直接与以太网设备通信的设备或虚拟机。然而,实际上(至少对于 Linux),您机器上的每个进程都在网络命名空间内进行通信。
这个命名空间创建了一个逻辑网络堆栈,它有自己的网络设备、防火墙规则和路由。当您运行一个进程时,它默认分配给您的根网络命名空间。这为进程提供了外部访问。
在 Kubernetes 中,您的容器被分组为 pod,每个 pod 都有一个共享的命名空间。在这个 pod 中,所有容器都具有相同的端口和 IP 地址以及端口空间。为了通信,Pod 中的容器可以使用 localhost,因为它们都在同一个命名空间中运行。如果不同 Pod 中的容器需要通信,则您正在使用下面描述的 Pod 到 Pod 网络过程。
Pod 到 Pod 网络
Pod 到 Pod 网络可以发生在同一节点内或跨节点的 Pod 中。您的每个节点都有一个无类域间路由 (CIDR) 块。该块是分配给该节点内的 Pod 的一组已定义的唯一 IP 地址。这确保了每个 pod 都被提供了一个唯一的 IP,而不管它在哪个节点。
当 Pod 需要通信时,会使用虚拟以太网设备 (VED) 或 veth 对来连接 Pod。Veth 对是分布在命名空间中的耦合网络接口。一对中的一个分配给根命名空间,另一个分配给 pod 命名空间。然后,VED 用作两个命名空间之间的中介连接。
Pod 到服务网络
Kubernetes 旨在允许根据需要动态替换 pod。这意味着 pod IP 地址不是持久的,除非采取特殊的预防措施,例如有状态的应用程序。为了解决这个问题并确保保持与 Pod 之间的通信,Kubernetes 使用了服务。
Kubernetes 服务管理 pod 状态并使您能够随时间跟踪 pod IP 地址。这些服务通过将单个虚拟 IP(集群 IP)分配给一组 pod IP 来抽象 pod 地址。然后,发送到虚拟 IP 的任何流量都会分发到相关联的 pod。
此服务 IP 允许根据需要创建和销毁 pod,而不会影响整体通信。它还使 Kubernetes 服务能够充当集群内负载均衡器,根据需要在关联的 pod 之间分配流量。
互联网到服务网络
大多数部署所需的最终网络情况是在 Internet 和服务之间。无论您是将 Kubernetes 用于内部还是外部应用程序,您通常都需要 Internet 连接。这种连接使用户能够访问您的服务和分布式团队进行协作。
在设置外部访问时,您需要使用两种技术——出口和入口。您可以使用白名单或黑名单来设置这些策略,以控制进出网络的流量。
Egress(出口):出口是将流量从您的节点路由到外部连接的过程。它通常通过连接到您的虚拟私有云 (VPC) 的 Internet 网关完成。此网关使用网络地址转换 (NAT) 在您的用户和您的节点所在的机器之间映射 IP。但是,它无法映射到您节点上的各个 Pod。对于这一步,Kubernetes 使用 IP 表和集群 IP 来完成通信。Ingress:Ingress 是 Egress 的相反过程,涉及从外部客户端到您的 Kubernetes 服务的通信。它作为一组规则运行,定义允许哪些连接以及阻止哪些连接与您的服务进行通信。结论
Kubernetes 网络使您能够在 k8s 网络内配置通信。它基于扁平网络结构,无需在主机和容器之间映射端口。但是,要强制实施此网络模型,您需要使用第三方工具(开源或付费的),例如 Flannel、Project Calico 和 Weave Net。
此外,在配置 Kubernetes 网络时,您需要考虑某些网络方面,这在传统网络中是不会遇到的。其中包括容器到容器网络、Pod 到 Pod 网络、Pod 到服务网络和 Internet 到服务网络。请务必妥善规划您的网络,因为错误配置可能会导致漏洞。
关键词: 网络模型