Kubernetes 容器的网络概念

已完成

Kubernetes 是一种可移植且可扩展的开放源代码平台,可用于自动进行部署、缩放和管理容器化工作负载。 与平台即服务 (PaaS) 和基础结构即服务 (IaaS) 产品/服务相比,作为业务流程平台的 Kubernetes 提供了相同的易用性和灵活性。

重要

你需要了解虚拟网络、负载均衡器和反向代理等概念以配置 Kubernetes 网络。

群集和节点

Kubernetes 基于群集。 与使用单台虚拟机相反,它使用多台称为节点并作为整体协同工作的虚拟机。 Kubernetes 使用由主节点和一个或多个工作器节点组成的群集体系结构。 主节点运行控制平面组件,例如 API 服务器、计划程序以及控制器管理器。 工作器节点运行数据平面组件,例如 kubelet、kube-proxy 和容器运行时

Diagram showing how Kubernetes uses a cluster architecture that consists of a primary node and one or more worker nodes.

kube-proxy 组件负责本地群集网络,并在每个节点上运行。 它确保每个节点都具有唯一的 IP 地址。 它还通过使用 IP 表和 IP 虚拟服务器实施了用于处理路由和流量负载均衡的规则。 此代理本身不提供 DNS 服务。 建议使用基于 CoreDNS 的 DNS 群集加载项(默认安装)。

Pod

Kubernetes Pod 将容器和应用程序分组为逻辑结构。 这些 Pod 不具智能,由一个或多个应用程序容器组成。 每个应用程序容器都有一个 IP 地址以及多个网络规则和公开的端口。

Diagram showing how a Kubernetes pod groups containers and applications into a logical structure.

Kubernetes 部署由 Pod 演变而来。 部署将 Pod 包装到一个智能对象中,使它们可以横向扩展。无需配置复杂的网络规则,即可轻松地复制和缩放应用程序以支持更多负载。

抽象层资源

为允许访问应用程序或是在应用程序组件之间进行访问,Kubernetes 为虚拟网络提供了抽象层。 Kubernetes 节点连接到虚拟网络,这可以为 Pod 提供入站和出站连接。 kube-proxy 组件在每个节点上运行,以提供这些网络功能。

在 Kubernetes 中:

  • 服务会以逻辑方式对 Pod 进行分组,以允许通过 IP 地址或 DNS 名称直接访问特定端口
  • ServiceType 允许指定所需的服务类型。
  • 可以使用负载均衡器分配流量。
  • 还可以使用入口控制器实现应用程序流量的第 7 层路由。
  • 可以控制群集节点的出站(出口)流量。
  • 使用网络策略可提供安全性,还可筛选 Pod 网络流量。

Kubernetes 中的网络

Kubernetes 对如何为群集实现网络有特定要求。 配置选项会影响你在群集网络上公开应用以及存储数据方式方面的选择。 为了简化通信,Kubernetes 要求以如下方式配置网络:

  • 在没有网络地址转换 (NAT) 的情况下,Pod 之间可以进行跨节点的通信。
  • 节点和 Pod 无需使用 NAT 即可相互通信。
  • 节点上的代理可以与所有节点和 Pod 通信。

容器的配置及其中的数据在执行之间不具有持久性。 删除容器后,除非将其配置为使用卷,否则所有信息都将丢失。 这同样适用于容器的网络配置以及分配给它的任何 IP 地址。

部署是 Pod 的逻辑分组。 它不被视为物理工作负载,并且未分配 IP 地址。 每个 Pod 会自动分配有一个 IP 地址,它会在销毁 Pod 时丢失。 此行为使手动网络配置策略变得复杂。

适用于 Windows 容器的 Kubernetes 网络选项

使用 Windows 容器部署 Kubernetes 时,可以使用两个网络选项:“服务”和“入口控制器”。 要使用这些选项,Windows 将依赖于容器网络接口 (CNI) 插件。

为了简化应用程序工作负载的网络配置,Kubernetes 使用服务将一组 Pod 以逻辑方式进行分组,并提供网络连接。 该服务充当 Pod 组的入口点,并提供静态 IP 地址。 流量到达该组的服务,然后以循环模式分发到 Pod。 随着 Pod 的 IP 地址随时间发生变化,服务会跟踪这些更改,以确保网络流量正确流向 Pod。

在 Kubernetes 上运行的容器化应用程序需要通过 Internet 发送和接收数据。 Kubernetes 通过入口和出口组件支持此通信。 入口控制器指定哪些流量和源可以连接到服务。 出口控制器支持通过 Internet 网关将应用连接到外部实体。

借助 CNI 插件,Kubernetes 能够将不同的网络接口用于容器网络。 插件可将 Pod 连接到网络并向 Pod 分配 IP 地址。 它们与 Windows 主机网络服务 (HNS) 和主机计算服务 (HCS) 交互,为 Windows 容器创建和管理网络资源。 插件的一些示例包括 Calico、Flannel 和 Azure CNI。

Kubernetes ServiceTypes

要配置所需的服务,可以指定以下“Kubernetes ServiceTypes”之一:

  • “ClusterIP”可创建在群集中使用的内部 IP 地址。 此服务适用于支持群集中其他工作负载的仅限内部使用的应用程序。 如果没有显式指定服务的类型,则这是使用的默认类型。

Diagram showing how ClusterIP creates an internal IP address for use within the cluster.

  • “NodePort”可在基础节点上创建端口映射,该映射支持使用节点 IP 地址和端口直接访问应用程序

Diagram showing how NodePort creates a port mapping on the underlying node that allows the application to be accessed directly with the node IP address and port.

  • “LoadBalancer”可创建 Azure 负载均衡器资源、配置外部 IP 地址并将请求的 Pod 连接到负载均衡器后端池。 为允许客户流量发送到应用程序,要在所需端口上创建负载均衡规则。

Diagram showing how LoadBalancer creates a load balancer resource, configures an external IP address, and connects the requested pods to the load balancer backend pool.

对于入站流量的 HTTP/S 负载均衡,另一个选项是使用入口控制器。

  • “ExternalName”可创建特定的 DNS 条目,以便更轻松地访问应用程序。

Kubernetes 入口

Kubernetes 入口组件会来自群集外部的 HTTP 和 HTTPS 流量到群集内部服务的路由。 入口路由使用入口规则进行定义。 Kubernetes 群集会拒绝所有未定义这些路由的传入流量。

Diagram showing how the Kubernetes ingress component exposes routes for HTTP and HTTPS traffic from outside a cluster to services inside the cluster.

入口控制器

入口控制器是一个软件片段,为 Kubernetes 服务提供可配置的流量路由。 Kubernetes 入口资源用于配置各个 Kubernetes 服务的入口规则和路由。 借助入口控制器和入口规则,可以使用单个 IP 地址将流量路由到 Kubernetes 群集中的多个服务。 在环境中部署控制器后,可以创建和部署入口清单。 Kubernetes 使用入口控制器来管理群集中的入口配置,并提供多种功能。

入口规则

入口规则定义流量的来源以及在群集中将流量定向到的位置。 入口规则在入口部署清单文件中进行定义。 这些规则是在清单文件的规则键中定义的。 每个规则都是一组描述规则的值。

入口注释

使用注释可附加工作负载的非标识元数据,例如入口配置。 可以将注释视为内部标签,用于定义资源的特定配置。 例如,你可能想要使用支持名称重写或有效负载限制的特定入口控制器。

网络策略

Kubernetes 提供了“网络策略”功能来控制 Pod 之间的流量流。 可以根据已分配标签、命名空间和流量端口的设置允许或拒绝流量。 网络策略提供了一种云原生方法,非常适合用于控制 Kubernetes Pod 之间的流量。