发布日期:2023 年 11 月 21 日
贡献者:Stephanie Susnjara,Ian Smalley
Kubernetes 网络提供网络基础架构,用于实现容器化应用程序的通信、可扩展性、安全性和外部访问。网络错综复杂,包括 Kubernetes 集群内部(例如 Pod、节点、容器、服务)和外部(例如外部流量)的所有主要组件之间的通信。
这些组件依靠四种不同的网络途径进行通信:
1. 容器到容器网络
2. Pod to-Pod 网络
3. Pod-to-Service 网络
4. External-to-Service 网络
适用于希望在确保应用程序性能的同时加快上市速度的平台和开发运维工程师。
订阅 IBM 时事通讯
Kubernetes 这个名字起源于希腊语,意思是舵手或飞行员。基于谷歌的内部容器编排平台 Borg,Kubernetes 于 2014 年作为开源工具向公众推出。同年,谷歌向云原生计算基金会(链接位于 ibm.com 外部)捐赠了 Kubernetes,该基金会是开源、供应商中立的云原生计算中心。从那时起,Kubernetes 已成为全球运行基于容器的工作负载时使用最为广泛的容器编排工具。
Kubernetes 也称为“k8s”或“kube”,专门为实现容器管理自动化而设计,容器是封装代码及其所有依赖项的标准软件单元。该编排工具可以在任何基础架构环境中快速且可靠地运行,无论是在本地、私有云、公共云还是混合云中,因此该工具受到高度评价。
与虚拟机 (VM)(虚拟化物理硬件)不同,容器可以虚拟化操作系统(例如 Linux 或 Windows)。每个容器仅包含应用程序的库和依赖项。由于容器与主机共享相同的操作系统内核,因此它们被视为轻量级、快速且可移植。
Kubernetes 及服务、支持和工具生态系统已成为现代云基础架构和应用程序现代化的基础。所有主要云供应商(包括 Amazon Web Services (AWS)、Google、Microsoft、IBM 和 Red Hat)都将 Kubernetes 集成到自己的云平台中,以增强平台即服务 (PaaS) 和基础架构即服务 (IaaS) 功能。
Kubernetes 架构由以下基本组件组成:
Kubernetes 集群是一组物理或虚拟机(节点),它们通过协同工作运行容器化应用程序。集群是 Kubernetes 架构的基础。
主节点表示单个计算主机,可以是虚拟机,也可以是物理机。它们托管 Kubernetes 控制平面组件,并负责调度和扩展应用程序。通过管理 Kubernetes 集群中的所有计算、网络和存储资源,主节点可确保容器化应用程序和服务均匀地部署到集群中的工作程序节点。
工作程序节点负责运行容器并执行主节点分配的任何工作。它们还托管应用程序容器,这些容器被分组为 Pod。
Pod 是由一个或多个容器(如 Linux 或 Docker)组成的群组,这些容器共享相同的计算资源和网络。它们是集群部署单元,也可以用作可扩展性单元。例如,如果 Pod 中的容器流量很大,Kubernetes 可以将该 Pod 复制到集群中的其他节点。如果流量减少,Kubernetes 还可以关闭 Pod。
Kubernetes 的其他组件如下:
基本的计算机网络包括通过电缆(有线)或 Wi-Fi 连接两个或更多计算设备以共享数据和交换资源。
在物理网络中,物理服务器连接到物理网络设备(交换机、路由器和以太网电缆),以连接到互联网。
在虚拟网络、软件定义网络 (SDN) 中,虚拟以太网设备和虚拟接口等组件安装在裸机服务器或虚拟机上,以连接到互联网。Kubernetes 部署依赖 SDN 来配置和管理集群之间的网络通信。
在深入研究 Kubernetes 网络之前,需要回顾一下基本的网络术语:
Kubernetes 的创建是为了运行分布式系统,其网络平面分布在机器集群中。除了提供组件之间的互联性,Kubernetes 集群网络还创建了一个无缝环境,通过软件定义的网络,数据可以自由、高效地移动。
Kubernetes 网络的另一个显著特点是其扁平化网络结构,这意味着所有组件都可以连接,而无需依赖其他硬件。在 Kubernetes 中,集群中的每个 Pod 都能与其他 Pod 通信,无论它运行在哪个节点上。扁平化网络提供了一种高效的资源共享方式,并消除了动态端口分配的需要。
总体而言,Kubernetes 网络采用抽象方法表示复杂性,使开发人员和运维人员能够专注于构建和维护应用程序,而不是处理复杂的网络配置。
Kubernetes 提供一个网络模型,帮助应对在分布式环境中编排容器化应用程序的挑战。每个节点上的容器运行时均可实现网络模型并遵循以下规则:
Kubernetes 网络模型适用于 Kubernetes 通信的四种基本类型:
容器是 Kubernetes 网络中最小的单元。在基本网络配置中,容器通过 localhost 在单个 Pod 内进行通信。之所以能实现这种通信,是因为同一 Pod 中的容器共享相同的网络命名空间,其中包括存储、IP 地址和端口空间等网络资源。
Pod-to-Pod 通信包括同一节点上的 Pod 之间的通信以及不同节点上的 Pod 之间的通信。Kubernetes 集群中的每个 Pod 都有自己的唯一 IP 地址,允许 Pod 之间直接通信,而无需考虑它们驻留的节点。而且,除了 Pod IP 地址之外,每个 Kubernetes 集群还自动提供 DNS 服务(域名系统服务)。DNS 服务将名称分配给 Pod(和服务),为管理员创建简单易读的名称,从而为服务发现提供轻量级机制。
Kubernetes 中的服务是一种抽象表示,它定义一组逻辑 Pod,并支持这些 Pod 的外部流量暴露、负载平衡和服务发现。这些服务可以促进 Pod-to-Service 通信和 External-to-Service 通信。
根据 Kubernetes 网络模型,Pod IP 地址是暂时的。因此,如果一个 Pod 崩溃或被删除,并在其位置创建了一个新的 Pod,则新的 Pod 很可能会收到一个新的 IP 地址。
在 Pod-to-Service 通信中,ClusterIP 是为一组 Pod 提供稳定虚拟 IP 地址的一种服务。该内部 IP 仅在集群内部可达,可用于 Pod 和服务之间的内部通信。
kube-proxy 安装在集群中的每个节点上,用于维护主机上的网络规则并监控服务和 Pod 的变化。创建或销毁 Pod 时,kube-proxy 会更新 iptables(一种实用程序,用于在 Linux 内核防火墙上创建流量路由规则)来反映这一变化,以便正确路由发送到服务 IP 的流量。
External-to-service 网络是指从 Kubernetes 集群外部公开和访问服务,如外部服务或数据库。
Kubernetes 提供多种服务,以促进外部流量进入集群:
Kubernetes 网络策略是一种应用程序构造,在 Kubernetes 网络中发挥着至关重要的作用。这些策略允许管理员和开发人员定义规则,指定 Pod 如何相互通信以及如何与其他网络端点通信。应用网络策略时需要使用 Kubernetes 网络策略 API,网络策略由以下基本组件组成:
Kubernetes 网络策略通过定义控制哪些 Pod 可以相互通信的规则,帮助定义和管理安全策略,从而防止未经授权的访问并避免恶意攻击。网络策略还确保 Pod 和服务之间提供隔离,以便只有这些 Pod 或服务才能与允许的 Pod 和服务通信。例如,在以下情况下,隔离对于多租户情境至关重要:开发运维或其他团队共享同一个 Kubernetes 集群但处理不同的项目。
对于有特定合规要求的公司,网络策略有助于指定和执行网络访问控制。这有助于达到监管标准,确保集群遵守组织政策。
容器网络接口 (CNI) 是与 Kubernetes 网络相关的另一个重要功能。CNI 由云原生计算基金会创建和维护,Kubernetes 和其他容器运行时(包括 RedHat OpenShift® 和 Apache Mesos)都在使用,它是一个标准化规范和一套 API,定义了网络插件应如何启用容器网络。CNI 插件可以分配 IP 地址、创建网络命名空间、设置网络路由等,以实现同一节点内和跨节点的 Pod 间通信。
虽然 Kubernetes 提供默认 CNI,但许多第三方 CNI 插件(包括 Calico、Flannel 和 Weave)旨在处理基于容器的网络环境中的配置和安全性。虽然每个插件可能具有不同的功能和方法,例如覆盖网络或直接路由,但它们都遵守与 Kubernetes 兼容的 CNI 规范。
在原生 Kubernetes 体验中部署安全且高度可用的集群。
借助 Red Hat OpenShift on IBM Cloud,OpenShift 开发者可以快速安全地在 Kubernetes 集群中容器化和部署企业工作量。
IBM Cloud Code Engine 是一个完全托管的无服务器平台,可让您在完全托管的容器运行时上运行容器、应用程序代码或批处理作业。
通过 IBM Cloud Professional Developer 认证中包含的课程培养 Kubernetes 技能。
学生借助 Red Hat® OpenShift® on IBM Cloud® 展示艺术。
容器是混合云策略的一部分,支持企业从任何地方构建和管理工作负载。
Kubernetes 是一个容器编排平台,用于调度和自动部署、管理和扩展容器化应用程序。
容器是软件的可执行单元,其中应用程序代码与对应的库和依赖项一起以通用方式封装,以便代码可以在任何地方运行。
容器编排可自动调配、部署和管理容器化应用程序,并简化相关流程。