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常用功能字段解析

  • 变量
  • 拉取镜像
  • 资源限制
  • 健康检查
posted @   minseo  阅读(796)  评论(0编辑  收藏  举报
编辑推荐:
· 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
点击右上角即可分享
微信分享提示