一、Pod对象
1. 资源共享实现机制
1)共享网络
- 基本概念
- 实现方式:通过将业务容器网络加入到负责网络的容器(infra container)实现网络共享
- 核心特点:共享网络协议栈(包括TCP/IP、MAC地址、端口等),打破网络命名空间隔离
- 典型示例:Nginx主容器与busybox边车容器共享infra container网络,可通过localhost互相访问
- 实现机制
- 基础镜像:使用pause:3.4.1镜像创建infra container
- 容器关系:所有业务容器(如Nginx、busybox)都会关联到同一个infra container
- 隐藏特性:在k8s层面不可见,需通过节点docker ps命令查看
- 实践验证
- 验证方法:
- 通过docker ps | grep pod-web查看实际运行的三个容器(含隐藏的infra container)
- infra container命名规则:k8s_POD_<pod名称>_<命名空间>_<ID>
- 镜像特征:
- 体积仅几MB大小
- 运行简单程序保持容器不退出
- 所有Pod都会自动创建对应的infra container
- 验证方法:
- 关键要点
- 识别特征:镜像名称为registry.aliyuncs.com/google_containers/pause:3.4.1
- 核心作用:专门负责维护Pod的网络栈
- 部署特点:每个Pod对应一个独立的infra container实例
2)共享存储
- Pod共享网络与存储示例
- 共享网络机制
- 实现方式:将业务容器网络加入到"负责网络的容器"中实现网络共享
- 访问验证:通过127.0.0.1可以访问另一个容器,证明网络命名空间已共享
- 典型应用:nginx+php架构中,php可以通过127.0.0.1:9000被nginx访问
- 共享存储机制
- 数据卷类型:使用emptyDir实现容器间共享存储
- 挂载配置:
- 主容器nginx挂载到/usr/share/nginx/html
- 边车容器busybox挂载到/data
- 验证方法:在边车容器/data目录创建文件,主容器能立即读取
- 配置示例解析
- 容器顺序:容器定义顺序不影响角色,完全由业务功能决定
- volumeMounts:通过相同名称的volume实现目录共享
- emptyDir特性:临时存储空间,Pod删除后数据丢失
- 实际操作演示
- 验证步骤:
- 在busybox容器的/data目录创建index.html
- 通过wget 127.0.0.1验证nginx能访问该文件
- 在nginx容器修改文件内容,busybox容器同步可见
- 应用场景:日志采集场景中,主容器写日志到共享目录,边车容器负责日志收集
- 验证步骤:
- 常见问题解答
- 网络隔离:默认每个容器有独立网络命名空间,共享网络打破这种隔离
- 多端口暴露:一个Pod可以暴露多个端口,通过Service配置多个targetPort
- 权限问题:共享目录的读写权限由挂载配置决定,不受容器角色限制
- 与Docker区别:原理类似Docker的volume共享,但由K8s统一管理
- 共享网络机制
2. 管理命令
1)Pod创建
- YAML方式:通过kubectl apply -f pod.yaml命令创建Pod,其中YAML文件需包含apiVersion、kind、metadata和spec等必要字段
- 命令行方式:使用kubectl run nginx --image=nginx直接创建运行nginx镜像的Pod
2)Pod查看
- 列表查看:kubectl get pods命令可列出当前所有Pod的基本信息
- 详情查看:kubectl describe pod <Pod名称>可查看指定Pod的详细配置和状态信息
3)日志管理
- 基础日志:kubectl logs <Pod名称>查看Pod的标准输出日志
- 容器指定:添加-c CONTAINER参数可查看多容器Pod中特定容器的日志
- 实时跟踪:使用-f参数可以实时跟踪日志输出(类似tail -f功能)
4)容器交互
- 终端接入:kubectl exec <Pod名称> [-c CONTAINER] -- bash命令可进入Pod容器的bash终端
- 多容器选择:对于多容器Pod,需要通过-c参数指定要进入的容器名称
5)Pod删除
- 删除操作:使用kubectl delete pod <Pod名称>命令可删除指定的Pod资源
- 注意事项:删除后Kubernetes可能会根据控制器配置自动重建Pod
二、知识小结
知识点 |
核心内容 |
考试重点/易混淆点 |
难度系数 |
Pod网络共享机制 |
通过infra container实现网络协议栈共享(TCP/IP/MAC/端口等),打破网络命名空间隔离 |
共享原理:所有容器加入同一个infra container网络 |
⭐⭐⭐ |
Pod数据卷共享 |
使用emptyDir卷实现多容器目录共享(如Nginx日志目录与边车容器采集目录) |
验证方法:在边车容器修改文件后主容器可实时读取 |
⭐⭐ |
边车容器(Sidecar)模式 |
主容器(如Nginx)与辅助容器(如日志采集器)通过共享网络/存储协同工作 |
典型场景:Nginx+PHP分离部署时通过127.0.0.1:9000通信 |
⭐⭐⭐⭐ |
infra container |
每个Pod隐藏的基础容器,使用k8s.gcr.io/pause镜像维护共享网络 |
关键特征:镜像体积小(仅几MB),保持常驻不退出 |
⭐⭐ |
Service多端口暴露 |
一个Pod内多个容器端口可通过Service同时暴露(如Nginx 80和辅助服务8080) |
配置要点:在YAML中定义多个targetPort |
⭐⭐⭐ |
网络验证方法 |
在边车容器通过127.0.0.1访问主容器服务(如wget 127.0.0.1:80) |
易错点:误认为需配置独立IP |
⭐⭐ |