当前位置: 首页 > news >正文

Kubernetes 核心准备:从 Pod 本质到网络模型全解析

引言

在 Kubernetes 的学习中,Pod 作为最小部署单元,其设计理念和网络通信机制是理解整个集群运行的基础。对于初学者而言,Pod 为什么需要 Pause 容器、容器间如何共享资源、跨节点 Pod 如何通信等问题往往难以理解。

本文基于 Kubernetes 核心文档,从 “是什么、为什么、怎么做” 三个维度,全面解析 Pod 的概念、Pause 容器的作用、通过 Docker 模拟 Pod 的实践,以及 Kubernetes 网络模型(包括 CNI 插件、Underlay/Overlay 网络、Calico 部署)。内容涵盖详细命令解释、参数说明和实操步骤,确保新手能清晰理解每一个知识点。文末将附上排错指南、总结及思考问题与答案。


一、Pod:Kubernetes 的最小部署单元

1.1 什么是 Pod?

Pod 是 Kubernetes 中最小的可部署计算单元,可理解为 “逻辑主机”—— 它包含一个或多个紧密协作的容器,这些容器共享存储、网络和运行规约,且始终被协同调度。

  • 形象比喻:Pod 就像一个豌豆荚,里面的 “豌豆” 是相互依赖的容器(如 nginx 和 php-fpm),它们共同完成一个业务功能(如处理动态网页)。
  • 核心特点
    • 容器共享网络命名空间(可通过localhost通信)。
    • 共享存储卷(可访问相同的文件系统)。
    • 生命周期一致(Pod 重启时所有容器同时重启)。

1.2 为什么需要 Pause 容器?

观察 Pod 内部会发现一个特殊的 Pause 容器(又称 Infra 容器),它是 Pod 实现资源共享的核心。

1.2.1 传统 Docker 的问题

直接部署多个容器时,会遇到三个关键问题:

  1. 端口冲突:两个容器绑定同一端口(如都用 80 端口)会失败。
  2. 网络隔离:容器间无法通过localhost通信(默认处于不同网络命名空间)。
  3. 网络策略难统一:无法对一组容器应用统一的防火墙规则。

Pause 容器通过创建共享沙箱环境解决了这些问题,它是 Pod 中第一个启动的容器,为其他容器提供网络、PID 和 IPC 的共享基础。

1.2.2 Pause 容器的特点
  • 轻量:镜像仅约 700KB,几乎不占用资源。
  • 常驻暂停:启动后执行/pause命令进入暂停状态,不参与业务逻辑。
  • 生命周期锚点:Pod 的生命周期与 Pause 容器一致(应用容器重启不影响 Pod)。
  • 僵尸进程回收:作为 Pod 的 1 号进程,回收其他容器的僵尸进程(如 nginx worker 进程意外退出后,Pause 会清理残留资源)。
1.2.3 Pause 容器的实现原理

  • 共享网络:Pause 容器创建网络命名空间(包含 IP、MAC 地址),其他容器通过Join Namespace加入,因此所有容器可见的网络视图完全一致(同一 IP 和端口空间)。
  • 共享 PID/IPC:Pause 作为 1 号进程,可监控其他容器的进程状态,实现僵尸进程回收和跨容器通信(如信号量传递)。

示例:Pod 中 nginx(80 端口)和 ghost(2368 端口)容器,通过 Pause 共享网络后,nginx 可通过localhost:2368访问 ghost,无需知道对方的 IP。


二、通过 Docker 模拟 Pod:实操详解

通过 Docker 命令手动创建包含 Pause、nginx 和 ghost 的 “模拟 Pod”,可直观理解 Pod 的工作机制。

2.1 环境准备:创建虚拟机并初始化

2.1.1 创建虚拟机
  • 配置:4 核 CPU、4GB 内存、100GB 硬盘,双网卡(仅主机模式用于局域网,NAT 模式用于外网)。
  • 操作系统:Red Hat Enterprise Linux 9.5。
2.1.2 初始化系统环境
  1. 配置本地仓库(使用系统镜像作为 yum 源):

    # 创建yum配置文件
    vi /etc/yum.repos.d/yum.repo
    # 配置内容
    [BaseOS]
    name=BaseOS
    baseurl=/mnt/BaseOS  # 镜像中BaseOS目录路径
    gpgcheck=0  # 关闭GPG校验(测试环境)
    [AppStream]
    name=AppStream
    baseurl=/mnt/AppStream  # 镜像中AppStream目录路径
    gpgcheck=0
    
  2. 配置自动挂载(开机自动挂载系统镜像):

    # 编辑fstab文件
    vi /etc/fstab
    # 添加挂载配置
    /dev/sr0  /mnt  iso9660  defaults  0  0  # /dev/sr0是光驱设备,挂载到/mnt
    # 生效配置
    systemctl daemon-reload
    mount -a  # 手动挂载验证
    df -h  # 查看挂载结果(应显示/dev/sr0挂载到/mnt)
    
  3. 关闭防火墙和 SELinux(测试环境简化配置):

    # 关闭并禁用防火墙
    systemctl disable --now firewalld
    # 临时关闭SELinux
    setenforce 0
    # 永久关闭SELinux(重启生效)
    sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config
    
  4. 关闭交换分区(Kubernetes 要求):

    # 临时关闭交换分区
    swapoff -a
    # 永久关闭(注释fstab中swap配置)
    sed -i 's/.*swap.*/#&/' /etc/fstab
    
  5. 安装基础工具

    dnf install net-tools vim wget curl bash-completion -y
    # 说明:net-tools包含ifconfig等工具,bash-completion提供命令补全
    
  6. 调整系统最大连接数(避免高并发时连接受限):

    vi /etc/security/limits.conf
    # 添加以下配置(*表示所有用户)
    * soft nofile 655350  # 软限制:最大文件句柄数
    * hard nofile 655350  # 硬限制:最大文件句柄数
    * soft nproc 655350   # 软限制:最大进程数
    * hard nproc 655350   # 硬限制:最大进程数
    * soft memlock unlimited  # 软限制:内存锁定无限制
    * hard memlock unlimited  # 硬限制:内存锁定无限制
    

2.2 安装 Docker:容器运行时准备

  1. 配置仅主机网卡 IP(用于虚拟机间通信):

    # 查看网络连接配置文件
    ls /etc/NetworkManager/system-connections/  # 通常为ens160.nmconnection等
    # 修改仅主机网卡(如ens160)为静态IP
    nmcli c m ens160 \ipv4.method manual \  # 手动配置IPipv4.addresses 192.168.10.10/24 \  # IP地址和子网掩码ipv4.dns 223.5.5.5  # DNS服务器
    # 重启网卡生效
    nmcli c up ens160
    
  2. 开启网卡转发(Docker 网络需要):

    # 创建配置文件
    cat > /etc/sysctl.d/docker.conf <<EOF
    net.ipv4.ip_forward = 1  # 开启IPv4转发
    EOF
    # 生效配置
    sysctl -p /etc/sysctl.d/docker.conf  # 输出net.ipv4.ip_forward = 1表示成功
    
  3. 卸载旧版本 Docker

    dnf remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine \podman \  # 移除Podman(与Docker冲突)runc
    
  4. 添加 Docker 仓库

    # 安装yum-utils(提供yum-config-manager工具)
    dnf install yum-utils -y
    # 添加阿里云Docker仓库(国内加速)
    yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/rhel/docker-ce.repo
    
  5. 安装 Docker 组件

    dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
    # 说明:
    # docker-ce:Docker引擎
    # docker-ce-cli:Docker命令行工具
    # containerd.io:容器运行时
    # docker-buildx-plugin:构建工具扩展
    # docker-compose-plugin:-compose插件
    
  6. 配置 Docker(优化存储和加速):

    cat > /etc/docker/daemon.json <<EOF
    {"default-ipc-mode": "shareable",  # 默认IPC模式为可共享"data-root": "/data/docker",  # 镜像和容器存储路径"exec-opts": ["native.cgroupdriver=systemd"],  # 使用systemd作为Cgroup驱动(K8s推荐)"log-driver": "json-file",  # 日志驱动"log-opts": {"max-size": "100m",  # 单个日志文件最大100MB"max-file": "50"     # 最多保留50个日志文件},"insecure-registries": ["harbor.jock.com"],  # 私有仓库(按需修改)"registry-mirrors": [  # 镜像加速源"https://docker.m.daocloud.io","https://docker.hlmirror.com"]
    }
    EOF
    
  7. 启动 Docker 并设置开机自启

    systemctl start docker  # 启动服务
    systemctl enable docker  # 开机自启
    

2.3 模拟 Pod:创建 Pause、nginx 和 ghost 容器

2.3.1 编写 nginx 配置文件(反向代理到 ghost)
cat > nginx.conf <<EOF
error_log stderr;  # 错误日志输出到标准错误
events { worker_connections 1024; }  # 最大连接数1024
http {access_log /dev/stdout combined;  # 访问日志输出到标准输出server {listen 80 default_server;  # 监听80端口location / {proxy_pass http://127.0.0.1:2368;  # 反向代理到ghost(2368端口)}}
}
EOF
2.3.2 启动 Pause 容器(作为网络沙箱)
docker run --name pause -p 8080:80 -d registry.k8s.io/pause:3.10
# 参数说明:
# --name pause:指定容器名为pause
# -p 8080:80:将主机8080端口映射到容器80端口(供外部访问)
# -d:后台运行
# registry.k8s.io/pause:3.10:Pause容器镜像(K8s官方)
2.3.3 启动 nginx 容器(共享 Pause 网络)
docker run --name nginx \-v $(pwd)/nginx.conf:/etc/nginx/nginx.conf \  # 挂载本地配置文件到容器--net=container:pause \  # 共享pause的网络命名空间--ipc=container:pause \  # 共享pause的IPC命名空间--pid=container:pause \  # 共享pause的PID命名空间-d nginx:1.27.4  # 后台运行nginx 1.27.4镜像
2.3.4 启动 ghost 容器(博客系统,监听 2368 端口)
# 创建数据目录并授权
mkdir /opt/ghost
chmod -R 777 /opt/ghost  # ghost需要写入权限# 启动ghost容器
docker run -d --name ghost \--net=container:pause \  # 共享pause网络--ipc=container:pause \  # 共享pause IPC--pid=container:pause \  # 共享pause PID-v /opt/ghost:/var/lib/ghost/content \  # 挂载数据目录(持久化博客内容)-e NODE_ENV=development \  # 开发模式(默认监听2368端口)ghost:latest
2.3.5 验证模拟结果
  1. 查看容器状态

    docker ps  # 应显示pause、nginx、ghost均处于运行状态
    
  2. 访问测试
    在浏览器中访问http://192.168.10.10:8080(主机 IP: 映射端口),应看到 ghost 的默认页面,说明 nginx 成功代理到 ghost(通过localhost:2368)。

2.3.6 为什么必须用 Pause 容器?
  • 稳定性:Pause 容器仅做网络共享,几乎不会崩溃;若用 nginx 作为共享锚点,nginx 故障会导致整个 Pod 网络失效。
  • 僵尸进程回收:Pause 作为 1 号进程,可回收其他容器的僵尸进程;而 nginx 不具备此功能,会导致资源泄露。

三、Kubernetes 网络模型:打通 Pod 通信的 “任督二脉”

Kubernetes 网络的核心目标是:所有 Pod 在扁平网络中直接通信,无需 NAT 转换

3.1 网络基本概念与原则

3.1.1 核心原则

Kubernetes 对网络的硬性要求:

  1. 所有 Pod 可直接通信(无 NAT)。
  2. 节点与所有 Pod 可直接通信(无 NAT)。
  3. 每个 Pod 有唯一 IP(IP-per-Pod),其他 Pod 通过该 IP 访问。
3.1.2 需要解决的通信问题
  1. 容器到容器(同一 Pod 内):通过 Pause 共享网络实现。
  2. Pod 到 Pod(跨节点):通过 CNI 插件实现。
  3. Pod 到 Service:通过 kube-proxy 实现负载均衡。
  4. 外部到 Service:通过 Ingress 或 NodePort 实现。

3.2 CNI:容器网络的标准接口

3.2.1 什么是 CNI?

CNI(Container Network Interface)是 Google 和 CoreOS 联合制定的容器网络标准,定义了容器网络的核心操作(添加 / 删除容器到网络),使不同容器平台(K8s、Mesos)可共用网络插件。

  • 工作方式:容器运行时(如 containerd)通过调用 CNI 插件(可执行程序)为容器配置网络,插件通过标准输入接收配置,输出结果。
  • 默认路径:Kubernetes 节点的 CNI 插件路径为/opt/cni/bin

3.2.2 CNI 插件分类

  1. Main 插件:创建网络设备(如网桥、Veth 对)。

    • bridge:创建网桥连接容器与主机。
    • ptp:创建点对点(Veth)设备。
    • macvlan:为容器分配独立 MAC 地址。
  2. IPAM 插件:分配 IP 地址。

    • host-local:从预配置地址段分配 IP。
    • dhcp:通过 DHCP 服务器获取 IP。
  3. Meta 插件:辅助功能(如端口映射、限流)。

    • portmap:通过 iptables 配置端口映射。
    • firewall:配置容器防火墙规则。
  4. 第三方插件:完整网络方案(如 Calico、Flannel)。

3.3 网络模型:Underlay 与 Overlay

3.3.1 Underlay 网络
  • 定义:直接使用物理网络(交换机、路由器),Pod IP 是物理网络可达的地址,无数据包封装。
  • 特点:性能好(无额外开销),但依赖物理网络配置(如 BGP 路由)。
  • 比喻:如同自驾车,需自行规划路线(依赖物理路网)。

3.3.2 Overlay 网络
  • 定义:在物理网络上构建虚拟网络,通过隧道(VXLAN、IPIP)封装数据包,Pod IP 是虚拟地址。
  • 特点:不依赖物理网络,部署灵活,但有封装开销(约 5-10% 性能损耗)。
  • 比喻:如同坐班车,只需选择目的地(虚拟网络),无需关心物理路线。

3.3.3 对比总结
维度Underlay 网络Overlay 网络
数据传输物理网络设备转发虚拟隧道转发
性能开销无封装开销有 VXLAN/IPIP 封装开销
部署复杂度高(依赖物理网络配置)低(纯软件实现)
扩展性差(受物理网络限制)好(支持上万节点)

3.4 Calico:企业级网络方案

Calico 是主流 CNI 插件,支持 Underlay(BGP)和 Overlay(VXLAN/IPIP)模式,以高性能和灵活的网络策略著称。

3.4.1 核心组件
  • Felix:运行在每个节点的代理,管理路由、ACL 规则和网络设备。
  • BIRD:BGP 客户端,广播路由信息实现跨节点通信。
  • ETCD:存储路由和网络策略数据(可与 K8s 共用)。
  • BGP Route Reflector:大型集群中减少 BGP 连接数(替代全互联模式)。

3.4.2 三种网络模式配置
1. VXLAN 模式(Overlay)
  • 原理:通过 VXLAN 隧道封装数据包,基于 MAC 地址通信,节点间三层可达即可。

  • 配置:修改 Calico 部署文件:
    # 禁用IPIP,启用VXLAN
    - name: CALICO_IPV4POOL_IPIPvalue: "Never"
    - name: CALICO_IPV4POOL_VXLANvalue: "Always"
    calico_backend: "vxlan"
    # 注释BGP相关探测
    # --bird-live
    # --bird-ready
    
  • 验证
    ifconfig vxlan.calico  # 存在vxlan.calico设备即生效
    calicoctl node status  # 查看状态
    
2. IPIP 模式(Overlay) 
  • 原理:通过 IPIP 隧道封装数据包(内层 Pod IP,外层节点 IP),依赖 BGP 同步路由。

  • 配置
    - name: CALICO_IPV4POOL_IPIPvalue: "Always"
    - name: CALICO_IPV4POOL_VXLANvalue: "Never"
    
  • 验证
    ifconfig tunl0  # 存在tunl0设备即生效
    
3. BGP 模式(Underlay)
  • 原理:通过 BGP 协议同步路由,无数据包封装,性能最优,需物理路由器支持 BGP。

  • 配置
    - name: CALICO_IPV4POOL_IPIPvalue: "Off"
    - name: CALICO_IPV4POOL_VXLANvalue: "Never"
    
  • 验证
    calicoctl node status  # 显示IPv4 BGP status即生效
    
3.4.3 模式选择建议
  • 对性能不敏感 → 选 VXLAN(部署最简单)。
  • 性能敏感且物理网络可控 → 选 BGP(无封装开销)。
  • 折中方案 → 选 IPIP(平衡性能与部署复杂度)。

四、常见问题与排错

4.1 Pod 网络不通(跨节点)

  • 可能原因
    1. 网络插件未部署或配置错误(如 Calico 模式与物理网络冲突)。
    2. 节点防火墙阻止隧道端口(如 VXLAN 用 4789 端口)。
    3. 路由信息未同步(BGP 模式下检查 BGP 连接)。
  • 排查步骤
    # 查看Calico状态
    calicoctl node status
    # 检查节点间隧道端口连通性(如VXLAN的4789)
    telnet <目标节点IP> 4789
    # 查看路由表(确认Pod网段路由存在)
    ip route
    

4.2 模拟 Pod 时访问失败

  • 可能原因
    1. nginx 配置错误(反向代理地址错误)。
    2. 容器未共享网络(--net=container:pause参数遗漏)。
    3. 主机防火墙阻止 8080 端口。
  • 排查步骤
    # 查看nginx日志
    docker logs nginx
    # 检查容器网络模式
    docker inspect nginx | grep -i networkmode  # 应显示"NetworkMode": "container:pause"
    # 关闭主机防火墙
    systemctl stop firewalld
    

五、总结

本文从 Pod 的本质出发,解析了 Pause 容器的核心作用(共享网络、回收僵尸进程),通过 Docker 模拟 Pod 的实操帮助理解容器协同机制;接着深入 Kubernetes 网络模型,讲解了 CNI 标准、Underlay/Overlay 网络的区别,以及 Calico 的三种部署模式。

核心知识点:

  • Pod 是最小部署单元,通过 Pause 容器实现容器共享资源。
  • CNI 是网络插件的标准接口,解决 Pod 跨节点通信问题。
  • Calico 支持多种网络模式,可根据性能需求和物理网络环境选择。

六、思考与答案

思考 1:Pause 容器在 Pod 中扮演什么角色?为什么不能用业务容器替代?

答案
Pause 容器是 Pod 的 “网络沙箱”,负责初始化网络命名空间、共享 PID/IPC,并回收僵尸进程。
不能用业务容器替代的原因:

  1. 业务容器(如 nginx)可能因故障崩溃,导致整个 Pod 网络失效。
  2. 业务容器不具备僵尸进程回收能力,会导致资源泄露。

思考 2:CNI 插件的核心作用是什么?Kubernetes 为什么依赖 CNI?

答案
CNI 的核心作用是标准化容器网络配置,使不同容器平台可共用网络插件。
Kubernetes 依赖 CNI 的原因:

  1. 避免重复开发网络功能,专注核心编排能力。
  2. 支持多样化网络需求(如 Overlay/Underlay、安全策略),通过插件扩展。

思考 3:Calico 的 BGP 模式和 VXLAN 模式各适合什么场景?

答案

  • BGP 模式:适合性能敏感、物理网络可控(如数据中心)的场景,无数据包封装,依赖物理路由器支持 BGP。
  • VXLAN 模式:适合跨网段、物理网络不可控的场景(如公有云),部署灵活但有封装开销。
http://www.dtcms.com/a/304540.html

相关文章:

  • 作物生长模型Oryza V3实战16:气象数据集
  • 个人健康管理小程序(消息订阅、Echarts图形化分析)
  • 如何调整服务器的内核参数?-哈尔滨云前沿
  • 随着人工智能技术的飞速发展,大语言模型(Large Language Models, LLMs)已经成为当前AI领域最引人注目的技术突破。
  • Apache Ignite Cluster Groups的介绍
  • 多目标粒子群优化(MOPSO)解决ZDT1问题
  • 嵌入式系统分层开发:架构模式与工程实践(一)
  • Spring Boot 2整合MyBatis Plus详细指南
  • 【面试场景题】阿里云子账号设计
  • 从零开始学习Dify-爬取网站文章,批量提取和输出热点摘要(十)
  • CRMEB电商系统集群部署指南:阿里云COS静态文件加速与资源分离最佳实践
  • 聊聊测试环境不稳定如何应对
  • 人工智能与法律:智能司法的创新与挑战
  • C++ 进阶
  • Typecho handsome新增评论区QQ,抖音,b站等表情包
  • 【Clumsy】只是学习记录
  • 晶界能计算
  • flexiblejs + pxtorem 实现浏览器缩放适配:兼顾系统缩放与文本放大体验
  • 图形界面应用程序技术栈大全
  • getgff.py脚本-python006
  • 【学习路线】游戏开发大师之路:从编程基础到独立游戏制作
  • 2025年科研算力革命:8卡RTX 5090服务器如何重塑AI研究边界?
  • react 项目怎么打断点
  • vite + chalk打印输出彩色命令行
  • 基于Dify构建本地化知识库智能体:从0到1的实践指南
  • 橡胶制品加工:塑造生活的柔韧力量
  • python基础:request请求Cookie保持登录状态、重定向与历史请求、SSL证书校验、超时和重试失败、自动生成request请求代码和案例实践
  • Python批量生成N天前的多word个文件,并根据excel统计数据,修改word模板,合并多个word文件
  • 中科米堆CASAIM金属件自动3d测量外观尺寸三维检测解决方案
  • 火山方舟使用豆包基模 —— 基础流程