K8s学习笔记(二):Pod
1 K8s核心资源Pod
1.1 Pod是什么?
官方文档:Pod | Kubernetes
Pod 是 Kubernetes(k8s)中最小的部署与调度单元,并非直接运行容器,而是对一个或多个 “紧密关联” 容器的封装。
核心特点可简单总结为 3 点:
- 容器的 “组合包”:通常包含 1 个主容器(业务核心,如 Web 服务),也可包含辅助容器(如日志收集、监控代理),所有容器共享 Pod 的资源。
- 共享基础环境:同一 Pod 内的容器共享网络命名空间(用
localhost
就能互相通信,无需跨网络)和存储卷(可共用文件目录),相当于 “在同一台迷你主机上运行”。 - 短暂且被管理:Pod 本身是 “一次性” 的(故障、重启后会生成新 Pod,IP 会变),不会自行修复,需依赖 k8s 的控制器(如 Deployment、StatefulSet)来管理其创建、扩缩容和故障恢复。
可以把 pod 看成是一个“豌豆荚”,里面有很多“豆子”(容器)。一个豌豆荚里的豆子,它们吸收着 共同的营养成分、肥料、水分等,Pod 和容器的关系也是一样,Pod 里面的容器共享 pod 的网络、存储等。
1.1.1 Pod如何管理多个容器
在 Kubernetes 中,Pod 管理多个容器的核心逻辑是 “协同调度、资源共享、生命周期绑定”,具体通过以下方式实现:
-
共享基础环境
同一 Pod 内的所有容器共享网络命名空间(相同的 IP 地址、端口空间)和存储卷(Volume):- 网络:容器间可通过
localhost
直接通信(如localhost:8080
访问同一 Pod 内的另一个容器),但需注意端口不冲突;对外表现为一个整体,共享 Pod 的 IP。 - 存储:Pod 中定义的 Volume(如临时目录
emptyDir
、持久化存储PersistentVolume
)可被所有容器挂载,实现数据共享(如日志容器读取主容器产生的日志文件)。
- 网络:容器间可通过
-
生命周期绑定
多个容器的生命周期与 Pod 强绑定:- 同时调度:Pod 被调度到某个节点后,其内所有容器会在同一节点启动。
- 整体管理:Pod 删除时,所有容器同时终止;Pod 重启(如节点故障重建)时,所有容器重新创建。
- 重启策略统一:Pod 通过
restartPolicy
(如Always
、OnFailure
)定义容器故障时的重启规则,适用于所有容器。
-
启动与依赖控制
若容器间有启动顺序或依赖关系,可通过以下机制控制:- Init 容器:在应用容器启动前运行的 “初始化容器”,完成前置任务(如配置加载、依赖检查),所有 Init 容器成功退出后,应用容器才会启动。
- 探针(Probe):通过
livenessProbe
(存活探针)、readinessProbe
(就绪探针)检测容器状态,确保容器按预期运行后再对外提供服务。
-
资源隔离与分配
每个容器可单独设置资源请求(resources.requests
)和限制(resources.limits
),Pod 会汇总这些需求向 Kubernetes 申请资源,确保容器间资源使用不冲突(如避免某容器耗尽内存影响其他容器)。
1.1.2 Pod网络
Pod 网络核心可总结为:
- 每个 Pod 有唯一集群内 IP,作为其网络身份;
- 同一 Pod 内容器共享网络命名空间,通过
localhost
直接通信; - 集群内 Pod 间可直接用 IP 互通(无 NAT),依赖 CNI 插件实现跨节点通信;
- Pod 访问外部靠节点 SNAT,外部访问 Pod 需通过 Service 作为稳定入口。
1.1.3 Pod存储
创建 Pod 的时候可以指定挂载的存储卷。 POD 中的所有容器都可以访问共享卷,允许这些容器共享数据。 Pod 只要挂载持久化数据卷,Pod 重启之后数据还是会存在的。
1.2 Pod工作方式
在 K8s 中,所有的资源都可以使用一个 yaml 文件来创建,创建 Pod 也可以使用 yaml 配置文件。或者使用 kubectl run 在命令行创建 Pod。
1.2.1 自主式 Pod
所谓的自主式 Pod,就是直接定义一个 Pod 资源,如下:
apiVersion: v1
kind: Pod
metadata:name: nginx-testnamespace: defaultlabels:app: nginx
spec:containers:- name: nginxports:- containerPort: 80image: nginximagePullPolicy: IfNotPresent# 更新资源清单
kubectl apply -f pod-nginx.yaml# 查看pod是否创建成功
kubectl get pods -o wide -l app=nginx
kubectl delete pods nginx-testkubectl get pods -l app=nginx
#结果为空说明pod已经被删除了
1.2.2 控制器管理的Pod
常见的管理 Pod 的控制器:Replicaset、Deployment、Job、CronJob、Daemonset、Statefulset。 控制器管理的 Pod 可以确保 Pod 始终维持在指定的副本数运行。 如,通过 Deployment 管理 Pod
vim nginx-deploy.yamlapiVersion: v1
kind: Deployment
metadata:name: nginx-testlabels:app: nginx-deploy
spec:selector:matchLabels:app: nginxreplicas: 2 # 副本数为2template:metadata:labels:app: nginx
spec:containers:- name: my-nginximage: nginximagePullPolicy: IfNotPresentports:- containerPort: 80# 更新资源清单文件
kubectl apply -f nginx-deploy.yaml# 查看Deployment
kubectl get deploy -l app=nginx-deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx-test 2/2 2 2 16s#查看 Replicaset
kubectl get rs -l app=nginx
NAME DESIRED CURRENT READY AGE
nginx-test-75c685fdb7 2 2 2 71s#查看 pod
kubectl get pods -o wide -l app=nginx
NAME READY STATUS IP
nginx-test-85c885fdb7-6d4lx 1/1 Running 10.190.102.69
nginx-test-85c885fdb7-9s95h 1/1 Running 10.190.102.68#删除nginx-test-85c885fdb7-9s95h这个 podkubectl delete pods nginx-test-85c885fdb7-9s95h
kubectl get pods -o wide -l app=nginxNAME READY STATUS IP
nginx-test-85c885fdb7-6d4lx 1/1 Running 10.190.102.69
nginx-test-85c885fdb7-6s95h 1/1 Running 10.190.102.68# 发现重新创建了一个新的pod nginx-test-85c885fdb7-6s95h
通过上面可以发现通过 deployment 管理的 pod,可以确保 pod 始终维持在指定副本数量