云原生技术系列 ---- 容器网络

189 阅读13分钟

CNI (Container Network Interface) 网络插件是一种用于 Kubernetes 集群的网络解决方案,旨在提供灵活、可扩展和高性能的网络连接。CNI TKE 网络插件遵循 CNI 规范,允许 Kubernetes 集群与各种网络解决方案无缝集成,以满足不同的业务需求和性能要求。

网络插件需满足的以下约束:

  • 每个 Pod 都有独立的 IP 地址,节点上的 Pod 可以不通过 NAT 和集群内的所有 Pod 通信。
  • 节点上的代理服务(代理服务通常是指用于管理和协调集群节点上网络通信及监控的服务或进程。最常见的代理服务是 Kubelet 和 kube-proxy。)可以和本节点上的所有 Pod 通信。
  • TKE 提供了3种网络 CNI 插件方案:VPC-CNIGlobal RouterCilium-Overlay

VPC-CNI 网络方案介绍

VPC-CNI 是基于腾讯云 VPC 专有网络实现的容器网络 CNI 插件,可以将 VPC 的弹性网卡直接分配给 Pod,实现 Pod 之间的互联互通。 这里针对 VPC ,补充一些信息:

VPC 是私有网络(Virtual Private Cloud,VPC),是基于腾讯云构建的专属云上网络空间。可以为云服务器、云数据库等资源构建逻辑隔离的、用户自定义配置的网络空间,以提升用户云上资源的安全性,并满足不同的应用场景需求。

弹性网卡(Elastic Network Interface,ENI)是绑定私有网络(Virtual Private Cloud,VPC)内云服务器的一种弹性网络接口,可在多个云服务器间自由迁移。弹性网卡对配置管理网络与搭建高可靠网络方案有较大帮助。可以在云服务器上绑定同一可用区下的多个弹性网卡,实现高可用网络方案;也可以在弹性网卡上绑定多个内网 IP,实现单主机多 IP 部署。

IP:IP 地址(Internet Protocol Address, IP 地址)是一种数字标签,用于标识设备在网络中的位置。每个连接到互联网或局域网的设备都有一个唯一的 IP 地址。

这种方案充分复用 VPC 的云上网络资源,容器与节点分布在同一网络平面,Pod IP 为集群 IPAMD 组件分配的弹性网卡 IP,由于不需要经过节点上的网桥设备,不需要使用 VxLAN 等隧道技术封装报文,在网络性能、可观测性、限流、隔离等多层面都提供更好的支持,更加适合公有云场景。TKE 推荐将 VPC-CNI 作为集群默认的网络方案。VPC-CNI 模式提供共享网卡独占网卡两种模式,各自适用于不同的场景,您可以根据业务需求选择不同的网络模式。

共享网卡模式:多个 Pod 共享一张弹性网卡,IPAMD 组件为弹性网卡申请多个 IP 并绑定到不同的 Pod,此模式可以降低对弹性网卡资源的需求,并提升节点上 Pod 的部署密度。共享网卡模式可支持 固定 Pod IP 能力。详情请参见 多 Pod 共享网卡模式

独立网卡模式:每个 Pod 会绑定独立的弹性网卡,此模式适合对网络性能有较高需求(高吞吐低延迟)的场景。但是会受机型影响,不同节点可使用的弹性网卡数量有限,单节点 Pod 密度更低(每个节点上可使用的弹性网卡数量有限,导致单节点上 Pod 的密度可能较低。)。详情请参见 Pod 独占网卡模式

管理面(Control Plane)

管理面负责网络配置和管理任务,它管理数据面的路径并确保其正常工作。管理面的主要功能包括:

  • 节点和 Pod 的网络配置:为每个节点和 Pod 分配 IP 地址,配置路由和网络策略。
  • 监控和管理网络状态:实时监控网络性能,发现并解决网络问题。
  • 资源分配和调度:管理和分配网络资源,确保高效利用。

管理面一般不会处理实际的数据包,而是配置和管理如何传输数据。

数据面(Data Plane)

数据面负责实际的数据传输,它是流量路径的一部分,通过它进行业务数据包的转发和处理。数据面的主要功能包括:

  • 数据包转发:将进来的数据包传送到正确的目的地(如 Pod 或服务)。
  • 网络地址转换(NAT) :如果使用 NAT,它会在源地址或目标地址之间进行转换。
  • 负载均衡:在多个服务副本之间分配流量。
  • 流量策略实施:如网络策略(Network Policies),控制哪些 Pod 可以通信。

在数据面中,性能是关键,因为它直接关系到数据包的传输速率和延迟。

image.png

Init Container 是 Kubernetes Pod 的一种特殊类型的容器,它在应用容器之前启动,并完成一些初始化任务。一般来说,Init Container 用于执行配置、准备数据或做其他需要在主应用容器启动之前完成的任务。

Veth0 是虚拟以太网(Virtual Ethernet)的一个接口,通常用于将容器连接到宿主机的网络命名空间或虚拟网络设备。veth 设备是成对出现的,一端放在容器的网络命名空间中,另一端放在宿主机的网络命名空间中。它们之间相互连接,形成数据包的转发通道。

优势特性

容器网络和 VPC 子网处于同一网络平面,可以使用 VPC 相应的云上网络的能力,例如 EIP 和安全组等。

  • 无需按节点预分配 CIDR 地址段,避免浪费 CIDR 内的 IP 地址。
  • 数据面转发无需网桥,网络转发性能更高,大约提升10%,适用于对网络性能要求较高的场景。
  • 支持 Pod 固定 IP,适用于依赖容器固定 IP 的场景。

适用场景

时延敏感型:

  • 中间件与微服务:较低的网络延迟,可以提升大规模中间件以及微服务部署的网络性能。 在线游戏、视频直播类应用:较高的网络吞吐和较低的网络延迟,同时可以使用 VPC 的云上网络资源,能够更好地支持网络密集型业务。
  • 传统架构迁移:传统架构迁移到容器平台需要保证 IP 不变及针对 IP 做安全策略限制。 需要为容器单独绑定独立的安全组策略,使用独立网卡模式绑定安全组。

补充信息

IP 地址基础

1. 什么是 IP 地址

IP 地址(Internet Protocol Address, IP 地址)是一种数字标签,用于标识设备在网络中的位置。每个连接到互联网或局域网的设备都有一个唯一的 IP 地址。

2. IP 地址类型

  • IPv4:32 位地址,表示为四个十进制数,每个数的范围是 0 到 255,用点号分隔。例如:192.168.1.1
  • IPv6:128 位地址,表示为八组十六进制数,每组由冒号分隔。例如:2001:0db8:85a3:0000:0000:8a2e:0370:7334

3. 公有 IP 和私有 IP

  • 公有 IP 地址:用于互联网中的设备,全球范围唯一。
  • 私有 IP 地址:用于局域网内设备,不会在互联网上路由。常见私有 IP 地址范围:
    • 10.0.0.010.255.255.255
    • 172.16.0.0172.31.255.255
    • 192.168.0.0192.168.255.255

4. IP 地址分类

  • A 类0.0.0.0 - 127.255.255.255
  • B 类128.0.0.0 - 191.255.255.255
  • C 类192.0.0.0 - 223.255.255.255
  • D 类(多播)224.0.0.0 - 239.255.255.255
  • E 类(实验)240.0.0.0 - 255.255.255.255

子网和 CIDR

1. 子网掩码

子网掩码用于划分 IP 地址的网络部分和主机部分。子网掩码通常与 IP 地址一起使用。例如,IP 地址 192.168.1.1 和子网掩码 255.255.255.0 表示前 24 位是网络部分,后 8 位是主机部分。

2. CIDR 表示法

CIDR (Classless Inter-Domain Routing)用来表示 IP 地址和其分配的路由前缀。例如 192.168.1.0/24 表示 IP 地址前 24 位是网络部分。

3. 子网划分

通过子网掩码,可以划分更小的子网。例如:

  • 192.168.1.0/24 可以划分为 192.168.1.0/25192.168.1.128/25,每个子网有 128 个 IP 地址。

IP 地址计算

1. 子网计算方法

  • 网络地址:子网中的第一个地址,通常用于标识网络本身。
  • 广播地址:子网中的最后一个地址,用于向所有设备发送广播信息。

2. 示例

假设我们有一个 IP 地址 192.168.1.0/24

  • 网络地址192.168.1.0
  • 可用 IP 地址范围192.168.1.1192.168.1.254
  • 广播地址192.168.1.255

3. 在线工具

可以使用在线工具进行 IP 地址和子网计算,例如:IP Calculator

云计算中的 IP 地址

1. VPC (Virtual Private Cloud)

VPC 是一种虚拟网络,允许用户定义和管理自己的网络空间,包括 IP 地址范围、子网、路由表和安全组。

2. 子网

在 VPC 内划分的更小的网络范围,具有自己的网络地址和子网掩码。

  • 例如,一个 VPC 的CIDR 范围是 10.0.0.0/16,可以划分为多个子网,如 10.0.1.0/2410.0.2.0/24等。

3. 弹性 IP 地址

弹性 IP 是公有 IP 地址,可以动态地分配给云资源(如实例)。它允许你在不同实例之间灵活地切换 IP 地址。

4. 安全组和网络 ACLs

  • 安全组:虚拟防火墙,用于控制进出 VPC 中实例的流量。
  • 网络 ACLs:子网级别的安全控制,用于过滤进出子网的流量。

5. 其他概念

  • NAT 网关:用于让没有公有 IP 地址的实例访问互联网。
  • VPN 网关:用于通过 VPN 连接将本地数据中心与 VPC 连接起来。

6. 示例配置

假设我们在一个云平台(如AWS)上创建一个 VPC 并配置网络:

  1. 创建 VPC
    • CIDR:10.0.0.0/16
  2. 创建子网
    • 子网1(Public):10.0.1.0/24
    • 子网2(Private):10.0.2.0/24
  3. 配置互联网网关:将 Public 子网连接到互联网
  4. 配置 NAT 网关:让 Private 子网访问互联网
  5. 配置路由表
    • Public 子网:默认路由指向互联网网关
    • Private 子网:默认路由指向 NAT 网关
  6. 配置安全组:允许特定端口和 IP 范围的通信
    • 例如,允许 80443 端口的入站流量

一、中间件

定义

中间件是一种软件层,它位于应用程序和操作系统之间,提供应用程序之间的通信和数据管理服务。中间件的目的是简化不同应用程序或服务之间的交互,提供常见的功能,如消息传递、事务管理、身份验证和数据集成等。

类型

  1. 消息中间件
    • 用于在分布式系统中传递消息,让各个组件异步通信。常见的有 Kafka、RabbitMQ 和 ActiveMQ。
  2. 事务中间件
    • 管理分布式系统中的事务,确保数据一致性。常见的有 Atomikos、GigaSpaces。
  3. 应用服务器
    • 提供运行企业级应用和服务的环境,如 JBoss、WebLogic 和 Tomcat。
  4. 数据库中间件
    • 提供数据访问和管理功能,如 Hibernate、MyBatis。

功能

  • 消息传递:促进不同应用程序或服务之间的通信。
  • 事务管理:确保跨多个资源的事务一致性。
  • 安全管理:提供身份验证、授权和加密功能。
  • 负载平衡:分发请求以提高可用性和性能。

真实案例

案例一:使用 Kafka 实现日志处理系统

假设你在一个大型电商平台工作,需要处理大量用户活动日志并实时分析。

  1. 需求

    • 收集用户点击、购买等活动日志。
    • 实时处理和分析这些数据。
    • 保证高可用性和可靠性。
  2. 解决方案

    • Kafka 作为消息中间件,将用户活动日志传递给日志处理服务。
    • 使用 Kafka 的分区和副本机制,实现高可用性。
    • 部署多个消费者实例处理日志,保证实时性。
  3. 实现

    • 用户活动日志通过 API 网关发送到 Kafka 主题。
    • 日志处理服务从 Kafka 消费日志,进行实时处理和分析。
    • 分析结果存储到数据库并生成报告。

二、微服务

定义

微服务是一种架构风格,它将传统的单体应用拆分成多个小型、独立部署和运行的服务。每个微服务负责特定的业务功能,并通过轻量级的通信协议(如 HTTP/REST 或消息队列)进行交互。

特点

  • 松耦合:服务之间尽量减少依赖,可以独立开发、部署和扩展。
  • 独立部署:每个服务可以独立更新和部署,不影响其他服务。
  • 业务能力:每个服务聚焦于特定的业务功能。
  • 去中心化:团队根据业务需求自主管理服务,使用不同的技术栈。

优点

  • 灵活性:可以根据不同业务需求,选择最合适的技术栈。
  • 可扩展性:可以独立部署和扩展各个服务,轻松应对不同的负载需求。
  • 高可用性:服务之间松耦合,单个服务的故障不会影响整个系统。

真实案例

案例二:使用微服务架构实现在线商城

假设你负责一个在线商城项目,需要构建一个高可用、可扩展的平台。

  1. 需求

    • 用户可以浏览商品、下订单和支付。
    • 后台需要管理商品、订单和用户数据。
    • 需要支持高并发和弹性扩展。
  2. 解决方案

    • 用户服务:管理用户注册、登录和个人信息。
    • 商品服务:管理商品的添加、修改和查询。
    • 订单服务:处理订单的创建、查询和修改。
    • 支付服务:处理支付请求、认证和支付状态。
    • 各个服务通过 API 网关和消息队列进行交互。
  3. 实现

    • 用户服务商品服务订单服务支付服务 分别用不同的技术栈开发(如 Java、Node.js、Go)。
    • 使用 API 网关 作为统一入口,路由请求到对应的微服务。
    • 使用消息中间件(如 Kafka 或 RabbitMQ)实现服务之间的异步通信。
    • 每个服务使用独立的数据库,实现数据隔离和独立管理。
  4. 部署

    • 每个微服务独立容器化,并部署在 Kubernetes 集群中。
    • 使用 Kubernetes 的自动扩展和负载均衡功能,保证高可用性和弹性扩展。
    • 配置日志和监控系统(如 ELK Stack、Prometheus)实时监控系统状态。

总结

  • 中间件是运行在操作系统和应用程序之间的软件层,提供消息传递、事务管理、安全管理等功能,简化应用之间的交互。

    案例:

    • Kafka 用于实现日志处理系统,通过消息队列收集和传递用户活动日志,并进行实时处理和分析。
  • 微服务是一种架构风格,将单体应用拆分为多个独立的服务,每个服务负责特定的业务功能,并通过轻量级的通信协议连接,具有松耦合、独立部署、高可用性等优点。

    案例:

    • 在线商城 项目,使用微服务架构将用户服务、商品服务、订单服务、支付服务等分开,独立开发、部署和扩展,保证系统的灵活性、高可用性和可扩展性。