20250718-3-Kubernetes 应用程序生命周期管理-Pod对象:存在意义_笔记

发布于:2025-07-20 ⋅ 阅读:(15) ⋅ 点赞:(0)
一、Pod对象

1. Pod基本概念



  • 逻辑抽象单元: Pod是Kubernetes创建和管理的最小单元,由一个或多个容器组成,可理解为应用实例
  • 部署特点: 同一个Pod中的容器始终部署在同一个Node上
  • 资源共享: Pod内容器共享网络命名空间和存储资源,可通过127.0.0.1相互访问
1)Docker与K8s的namespace区别



  • 隔离机制差异: Docker的namespace利用Linux namespace机制实现容器网络隔离,而K8s的namespace是更高层次的资源隔离单位
  • 作用范围: Docker namespace隔离单个容器,K8s namespace隔离资源对象(如Pod、Service等)
2)Docker的namespace隔离机制



  • 六种隔离类型:
    • 网络命名空间(net)
    • 文件系统(mnt)
    • 进程PID(pid)
    • 用户与用户组(user)
    • 进程间通信(ipc)
    • 主机域名(uts)
  • 实现原理: 通过Linux内核的namespace机制实现容器间的资源隔离
3)Cgroup的作用



  • 资源限制: 控制容器可使用的CPU、内存等资源配额
  • 管理维度: 设置资源使用上限(如最大CPU使用率、内存限制)
  • 与namespace关系: 与namespace共同构成容器隔离的两大核心技术
4)Docker网络模式与容器间通信



  • container模式: 允许一个容器加入另一个容器的网络命名空间
  • 实现原理: 通过共享网络协议栈打破网络隔离,使容器间可通过127.0.0.1通信
  • 典型应用: 主容器提供网络服务,辅助容器共享其网络环境
5)K8s中的Pod网络模式



  • Infra Container机制:
    • 隐藏容器: 先于业务容器创建,提供基础网络环境
    • 网络共享: 业务容器通过docker的container模式加入Infra Container的网络命名空间
    • 访问方式: Pod内容器可通过127.0.0.1相互访问服务
  • 存储共享:
    • 实现方式: 通过Volume将宿主机目录映射到多个容器
    • 数据交互: 容器可对共享目录进行读写操作实现数据交换
  • 设计继承: 基于Docker已有技术(container网络模式、volume)实现多容器协同
2. Pod对象资源共享实现机制

1)共享网络示例

​​​​​​

  • 配置方式:通过定义Pod的spec.containers字段实现多容器共享网络命名空间
  • 示例配置:
  • 创建方式:
    • 直接创建:适用于测试场景,通过kubectl run命令创建
    • 控制器创建:生产环境推荐使用Deployment等控制器创建
  • 注意事项:
    • 直接创建的Pod不具备升级、扩容等高级功能
    • 从Kubernetes 1.17版本开始,kubectl run只能创建Pod,不能创建其他资源
2)共享存储示例



  • 配置方式:通过volumes和volumeMounts字段实现多容器共享存储
  • 核心字段:
    • volumes:定义数据卷名称和类型(如emptyDir)
    • volumeMounts:指定容器内挂载路径
  • 示例配置:
  • 实现原理:
    • 使用emptyDir类型卷在Pod生命周期内临时存储数据
    • 多个容器通过相同卷名实现数据共享
  • 缩进规范:
    • volumeMounts字段需与containers同级缩进
    • volumes字段需与spec同级缩进
3)应用案例



  • 例题:创建Pod示例
    • 镜像选择:推荐使用busybox镜像进行网络测试,因为它是专门用于容器功能测试的工具镜像,包含完整的调试工具
    • 防止退出:busybox等工具镜像需要添加休眠命令防止容器退出,例如command: ["/bin/sh","-c","sleep 12h"]
    • 多容器配置:一个Pod中可以配置多个容器,如同时运行busybox和nginx容器
    • YAML生成:使用kubectl run bs --image=busybox --dry-run=client -o yaml > pod.yaml命令生成基础YAML模板
    • 标签重要性:Pod必须配置标签(label),因为Service和Deployment等高级资源都通过标签关联Pod
    • 主辅容器:可以将nginx作为主应用容器,busybox作为辅助测试容器
    • 命令格式:command字段使用数组格式,如["/bin/sh","-c","sleep 12h"],其中-c表示使用shell解释器执行命令
    • 休眠时长:休眠时间可根据测试需求设置,12小时足够完成测试,也可设置为365天等更长时间
  • 例题:查看Pod示例

    
    • 就绪状态:READY列显示为2/2表示Pod中两个容器都已准备就绪
    • 命名规则:
      • Deployment创建的Pod命名格式:deployment名称-RS名称-随机名
      • 直接创建的Pod只有自定义名称,没有随机后缀
    • 状态差异:
      • Deployment管理的Pod会有副本集(RS)名称和随机字符串后缀
      • 直接创建的Pod名称完全由metadata.name字段决定
    • 容器数量:READY列的分母表示Pod中定义的容器总数,分子表示已就绪的容器数
    • 副本标识:随机字符串用于区分多个副本,当Pod由Deployment管理时才会出现
    • 滚动更新:升级过程中可以通过RS名称变化观察新旧Pod替换过程
    • 状态监控:如果某个容器挂掉,READY状态会立即变化,如从2/2变为1/2
二、Pod对象管理命令

1. Pod创建与查看

  • 创建方式:
    • 通过YAML文件:kubectl apply -f pod.yaml
    • 直接运行命令:kubectl run nginx --image=nginx
  • 查看命令:
    • 列表查看:kubectl get pods
    • 详情查看:kubectl describe$pod名称
  • YAML示例:
apiVersion: v1
kind: Pod
metadata:
  name: my-pod
spec:
  containers:
  - name: container1
    image: nginx
  - name: container2
    image: centos
2. 日志与终端操作

  • 日志查看:
    • 基础命令:kubectl logs$pod名称
    • 指定容器:kubectl logs$pod名称 -c$CONTAINER
    • 实时跟踪:kubectl logs$pod名称 -c$CONTAINER -f
  • 终端进入:
    • 标准命令:kubectl exec -it$pod名称 -- bash
    • 注意:部分容器可能不支持bash,需改用sh:kubectl exec -it$pod名称 -- sh
3. 多容器终端访问

  • 容器选择:
    • 默认进入第一个容器
    • 指定容器:-c参数(如-c bs进入第二个容器)
  • 常见问题:
    • 解释器兼容性:busybox等精简镜像可能只支持sh
    • 绝对路径:可使用/bin/sh确保命令执行
    • 工具缺失:工具容器可能缺少curl等常用工具,可用wget替代
4. 网络共享机制

  • 实现原理:
    • 通过PodInfra Container实现网络栈共享
    • 所有容器共享同一个网络命名空间
  • 验证示例:
    • 在busybox容器中访问localhost:80
    • 实际访问的是同Pod内nginx容器的服务
    • 关键现象:即使容器未部署服务,仍可访问其他容器的网络端口
  • 存储共享:
    • 通过emptyDir等数据卷类型实现
    • 示例YAML片段:
volumes:
- name: log
  emptyDir: {}
5. Pod删除操作
  • 删除命令:
    • 基本格式:kubectl delete pod$pod名称
    • 注意:删除后K8s会根据控制器配置决定是否重建
  • 操作验证:
    • 删除前建议先describe确认Pod详情
    • 多副本场景下需注意控制器行为差异
三、知识小结

知识点

核心内容

考试重点/易混淆点

难度系数

Linux Namespace机制

实现容器隔离的基础技术,包括网络、文件系统、进程PID、用户与用户组等6种隔离类型

Docker与K8s的namespace区别:虽然都基于Linux namespace,但K8s的namespace是逻辑隔离单元

⭐⭐⭐

cgroup功能

资源限制机制,控制CPU/内存等资源配额

与namespace的关系:namespace负责隔离,cgroup负责限制

⭐⭐

Docker网络模式

包括bridge/host/container/none等模式,container模式可实现网络命名空间共享

关键命令:docker run --network=container:<name>

⭐⭐⭐⭐

K8s Pod网络原理

通过infra container创建共享网络空间,业务容器通过container模式加入

访问方式:容器间可通过127.0.0.1直接通信

⭐⭐⭐⭐

共享存储实现

通过volume挂载宿主机目录实现容器间数据共享

与网络共享的区别:存储共享依赖外部卷,网络共享依赖命名空间

⭐⭐⭐

Pod创建方式对比

1. 直接创建(测试用)

2. 通过Deployment创建(生产用)

核心差异:直接创建的Pod无自愈/扩缩容能力

⭐⭐

多容器Pod实践

主容器(如nginx)与边车容器(如busybox)共存

调试技巧:使用kubectl exec -c <容器名>指定容器

⭐⭐⭐⭐

容器调试命令

1. 默认进入方式:kubectl exec -it <pod> -- bash

2. Alpine系镜像需改用sh

常见错误:OCI runtime exec failed通常因解释器不匹配

⭐⭐


网站公告

今日签到

点亮在社区的每一天
去签到