20250718-3-Kubernetes 应用程序生命周期管理-Pod对象:存在意义_笔记
一、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: container1image: nginx- name: container2image: 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: logemptyDir: {}
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通常因解释器不匹配 | ⭐⭐ |