Kubernetes之Pod
Pod基本概念
1 2 3 4 | 最小部署单元 一组容器的组合 一个Pod中的容器共享网络命名空间与存储 Pod是短暂的 |
Pod为亲密性应用而存在
亲密性应用场景
- 两个应用之间发生文件交互
- 两个应用要通过127.0.0.1或socket通信
- 两个应用需要发送频发的调用
Pod实现机制
共享网络
共享存储
实例,查看网络共享是怎么实现的
导出已经运行的模板
首先查看运行的pod
1 | kubectl get pods |
导出pod模板为yaml文件
1 | kubectl get pods java - demo - b76fc7876 - 5qjgn - o yaml>pod.yaml |
内容如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 | apiVersion: v1 kind: Pod metadata: creationTimestamp: "2019-12-24T02:23:16Z" generateName: java - demo - b76fc7876 - labels: app: java - demo pod - template - hash : b76fc7876 name: java - demo - b76fc7876 - 5qjgn namespace: default ownerReferences: - apiVersion: apps / v1 blockOwnerDeletion: true controller: true kind: ReplicaSet name: java - demo - b76fc7876 uid: cda02c20 - 8619 - 44ef - adad - 892ed4bc731d resourceVersion: "735811" selfLink: / api / v1 / namespaces / default / pods / java - demo - b76fc7876 - 5qjgn uid: 07a0a636 - 62d5 - 44bf - 8bc6 - 0224fbf01cf2 spec: containers: - image: yueming33990 / java - demo imagePullPolicy: Always name: java - demo resources: {} terminationMessagePath: / dev / termination - log terminationMessagePolicy: File volumeMounts: - mountPath: / var / run / secrets / kubernetes.io / serviceaccount name: default - token - 44pnx readOnly: true dnsPolicy: ClusterFirst enableServiceLinks: true nodeName: k8s - node2 priority: 0 restartPolicy: Always schedulerName: default - scheduler securityContext: {} serviceAccount: default serviceAccountName: default terminationGracePeriodSeconds: 30 tolerations: - effect: NoExecute key: node.kubernetes.io / not - ready operator: Exists tolerationSeconds: 300 - effect: NoExecute key: node.kubernetes.io / unreachable operator: Exists tolerationSeconds: 300 volumes: - name: default - token - 44pnx secret: defaultMode: 420 secretName: default - token - 44pnx status: conditions: - lastProbeTime: null lastTransitionTime: "2019-12-24T02:23:16Z" status: "True" type : Initialized - lastProbeTime: null lastTransitionTime: "2019-12-24T02:25:46Z" status: "True" type : Ready - lastProbeTime: null lastTransitionTime: "2019-12-24T02:25:46Z" status: "True" type : ContainersReady - lastProbeTime: null lastTransitionTime: "2019-12-24T02:23:16Z" status: "True" type : PodScheduled containerStatuses: - containerID: docker: / / f73622a1a10253a36ec01521071fa5fecf5bdec83217a18403001a51b6a821a9 image: yueming33990 / java - demo:latest imageID: docker - pullable: / / yueming33990 / java - demo@sha256:c1d14557eaa5da1604447d6ce8538aa01411c0b85fc47b512c3eadeb11b620cf lastState: {} name: java - demo ready: true restartCount: 0 state: running: startedAt: "2019-12-24T02:25:46Z" hostIP: 192.168 . 1.13 phase: Running podIP: 10.244 . 2.4 qosClass: BestEffort startTime: "2019-12-24T02:23:16Z" |
去除不需要的字段修改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | apiVersion: v1 kind: Pod metadata: labels: app: my - pod name: my - pod namespace: default spec: containers: - image: nginx name: nginx image: nginx - image: java - demo name: java image: lizhenliang / java - demo:latest |
启动
1 | kubectl apply - f pod.yaml |
查看是否启动
1 | kubectl get pods |
因为yaml定义了两个容器所以启动了两个容器
进入其中一个容器
1 | kubectl exec - it my - pod - c java bash |
java是刚刚命名的名字,bash是解释器
查看进程运行了java
1 | ps - ef |
查看分配的ip
进入nginx容器 查看ip 与java里面的ip是一样的
1 | kubectl exec - it my - pod - c nginx bash |
安装ifconfig工具
1 | apt - get update |
需要更新一下才能安装ifconfig工具
1 | apt - get install net - tools / stable |
查看ip ip和mac地址都和容器java是一样的
网络使用命名空间共享
存储共享通过数据卷的方式
需要持久的数据
- 临时数据
- 日志
- 数据库data
当有状态的应用pod需要偏移时可以保证数据的持久
删除已经运行的my-pod
1 | kubectl delete pod my - pod |
编辑emtydir.yaml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | apiVersion: v1 kind: Pod metadata: name: my - pod spec: containers: - name: write image: centos command: [ "bash" , "-c" , "for i in {1..100};do echo $i >> /data/hello;sleep 1;done" ] volumeMounts: - name: data mountPath: / data - name: read image: centos command: [ "bash" , "-c" , "tail -f /data/hello" ] volumeMounts: - name: data mountPath: / data volumes: - name: data emptyDir: {} |
该pod创建了两个容器,两个都是centos一个是写一个是读,写的产出数据,写到当前容器的/data/hello文件中
volumes定义一个empty 会在当前节点创建一个空目录,让两个容器都挂载该空目录,一个往空目录里面写,另外一个往空目录读取
运行
1 | kubectl apply - f emtydir.yaml |
查看是否启动
1 | kubectl get pods |
分别进入容器查看文件
1 2 | kubectl exec - it my - pod - c write bash kubectl exec - it my - pod - c read bash |
也可以通过查看容器read的日志查看
1 | kubectl logs my - pod - c read |
会不停地运行这个写入及输出的过程
Pod容器分类与设计模式
1 2 3 4 5 6 | Infrastructure Container:基础容器 维护整个Pod网络空间 InitContainer:初始化容器 先于业务容器开始执行 Containers: 业务容器 并行启动 |
首先创建Infrastructure容器 再创建初始化容器 再创建业务容器
Pod Template常用功能字段解析
- 变量
- 拉取镜像
- 资源限制
- 健康检查
分类:
Docker
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
2018-12-24 Docker容器集群管理之Swarm