提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
-
- [1、pod的基本概念 几种容器 2、pod 存在意义 3、pod 实现的机制 4、镜像拉取策略 5、镜像容器策略](#1、pod的基本概念 几种容器 2、pod 存在意义 3、pod 实现的机制 4、镜像拉取策略 5、镜像容器策略)
- [一、Pod 基础详解](#一、Pod 基础详解)
-
- [1.1 Pod 的基本概念的](#1.1 Pod 的基本概念的)
- [1.2 Pod 的使用方式](#1.2 Pod 的使用方式)
-
- [1.2.1 单容器 Pod](#1.2.1 单容器 Pod)
- [1.2.2 多容器 Pod](#1.2.2 多容器 Pod)
- [1.3 Pause 容器(基础容器)](#1.3 Pause 容器(基础容器))
- [1.4 Pod 中的共享资源](#1.4 Pod 中的共享资源)
-
- [1.4.1 网络共享](#1.4.1 网络共享)
- [1.4.2 存储共享](#1.4.2 存储共享)
- [1.5 Pod 的使用场景](#1.5 Pod 的使用场景)
- [1.6 Pod 的类型](#1.6 Pod 的类型)
-
- [1.6.1 自主式 Pod](#1.6.1 自主式 Pod)
- [1.6.2 控制器管理的 Pod](#1.6.2 控制器管理的 Pod)
- [1.7. Pod 的类型](#1.7. Pod 的类型)
- [1.8. Pod容器的分类](#1.8. Pod容器的分类)
-
- [1.8.1 基础容器(Infrastructure Container)](#1.8.1 基础容器(Infrastructure Container))
- [1.8.2 初始化容器(Init Containers)](#1.8.2 初始化容器(Init Containers))
-
- [1. 8.2.1 Init容器启动过程](#1. 8.2.1 Init容器启动过程)
- [1. 8.2.2 Init 的容器作用](#1. 8.2.2 Init 的容器作用)
- [1.8.3 应用容器(Main Containers)](#1.8.3 应用容器(Main Containers))
- [二、Pod 的核心配置](#二、Pod 的核心配置)
-
- [2.1 镜像拉取策略(imagePullPolicy)](#2.1 镜像拉取策略(imagePullPolicy))
-
- [2.1.1 镜像拉取策略案例](#2.1.1 镜像拉取策略案例)
- 总结
前言
1、pod的基本概念 几种容器
2、pod 存在意义
3、pod 实现的机制
4、镜像拉取策略
5、镜像容器策略
一、Pod 基础详解
1.1 Pod 的基本概念的
Pod 是 Kubernetes 集群里最小的部署单元,对应集群内一个运行中的进程;它可包含一个或多个耦合紧密的容器,这些容器共享网络、存储资源;Pod 是 K8s 管理容器的基础,Deployment、StatefulSet 等控制器均基于 Pod 实现扩展管理。
Kubernetes 中所有的控制器(如 Deployment、StatefulSet、DaemonSet 等)均以 Pod 为基础进行扩展
。

1、最小部署的单元
2、包含一个或者多个容器(一组容器的集合)
3、一个pod中的容器共享网络命名空间和存储资源
4、pod是短暂
1.2 Pod 的使用方式
根据包含的容器数量,Pod 主要分为两种使用方式:
1.2.1 单容器 Pod
最常见的用法,一个 Pod 仅包含一个容器。此时 Pod 可视为容器的"外壳",K8s 直接管理 Pod 而非容器。
bash
apiVersion: v1
kind: Pod
metadata:
name: single-container-pod
spec:
containers:
- name: nginx
image: nginx:1.14
1.2.2 多容器 Pod
一个 Pod 包含多个容器,这些容器通常具有紧密的协作关系(如主应用与日志收集器),共享网络和存储资源,可通过 localhost 直接通信。
bash
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: app
image: my-app:latest # 主应用容器
- name: sidecar
image: log-collector:latest # 日志收集边车容器
1.3 Pause 容器(基础容器)
每个 Pod 中都会默认运行一个特殊的 Pause 容器(又称"基础容器"),它是 Pod 的"基石",主要作用是:
- 提供 Pod 级别的 Linux 命名空间(网络、PID 等),确保 Pod 内所有容器共享同一命名空间,Pod 内的所有容器共享网络和存储资源;
- 维护 Pod 的网络端点,使容器间的通信更高效。
Pause 容器的镜像由 K8s 平台内置,用户无需手动配置。例如,在节点上执行 docker ps 可看到类似如下的容器:
bash
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 "/pause"


1.4 Pod 中的共享资源
Pod 内的容器通过共享资源实现协作,核心共享资源包括网络和存储:
1.4.1 网络共享
- 每个 Pod 分配唯一的 IP 地址,所有容器共享该 IP 和端口范围;
- 容器间可通过 localhost:端口 直接通信;
- 与集群外通信时,需通过宿主机节点端口映射或 Service 暴露。
1.4.2 存储共享
- Pod 可定义多个 Volume(存储卷),所有容器均可挂载并访问;
- Volume 支持持久化存储,确保容器重启后数据不丢失。

1.5 Pod 的使用场景
Pod 的设计目标是承载"紧密耦合"的应用组件,典型使用场景包括:
单一进程应用:最常见,一个 Pod 运行一个业务容器(如 Nginx、MySQL);
多进程协作:多个容器协同完成一项任务(如主应用 + 日志收集器 + 配置更新器)。
1.6 Pod 的类型
根据管理方式,Pod 可分为两类:
1.6.1 自主式 Pod
直接由用户创建,无自我修复能力;
若所在节点故障,Pod 会被删除且不会自动重建。
1.6.2 控制器管理的 Pod
由 K8s 控制器(如 Deployment、StatefulSet)创建和管理;
支持副本管理、滚动升级、自动修复(节点故障时重建 Pod)等功能,是生产环境的首选。
1.7. Pod 的类型
- 自主式 Pod:
这种 Pod 不具备自我修复的能力。如果它所在的节点故障,Pod 会被删除,且不会自动恢复。 - 控制器管理的 Pod:
Kubernetes 中通常通过控制器(如 Deployment、StatefulSet)来管理 Pod。控制器提供副本管
理、滚动升级、自动修复等功能。
1.8. Pod容器的分类
1.8.1 基础容器(Infrastructure Container)
即前文提到的 Pause 容器,由 K8s 自动创建,维护 Pod 的网络和存储基础,对用户透明。
bash
维护整个 Pod 网络和存储空间
node 节点中操作
启动一个Pod时,k8s会自动启动一个基础容器
cat /opt/kubernetes/cfg/kubelet
......
--pod-infra-container-image=registry.cn-hangzhou.aliyuncs.com/googlecontainers/pause-amd64:3.0"
每次创建 Pod 时候就会创建,运行的每一个Pod都有一个 pause-amd64 的基础容器自动会运行,对于用户
是透明的
docker ps -a
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 "/pause"

1.8.2 初始化容器(Init Containers)
Init容器必须在应用程序容器启动之前运行完成,而应用程序容器是并行运行的,所以Init容器能够提供
了一种简单的阻塞或延迟应用容器的启动的方法。
1. 8.2.1 Init容器启动过程
启动时机:在应用容器启动前运行,且必须按顺序执行(前一个成功才能启动下一个);
作用:完成应用启动前的初始化工作(如等待依赖服务就绪、配置文件生成、权限设置等);
特性:若初始化失败,K8s 会根据 Pod 重启策略重试,直至成功。
1. 8.2.2 Init 的容器作用
Init 容器因采用与应用容器分离的独立镜像,具备多方面核心优势:
可包含应用容器缺失的实用工具 / 个性化代码,无需为工具定制应用镜像;
能安全运行工具,避免降低应用镜像安全性,同时实现镜像创建者与部署者独立工作;
可拥有与应用容器不同的文件系统视图,能访问应用容器无权限的 Secrets;
还能阻塞 / 延迟应用容器启动,待先决条件满足后,再让所有应用容器并行启动。


1.8.3 应用容器(Main Containers)
即用户部署的业务容器,在所有初始化容器成功后并行启动,是 Pod 的核心工作负载
bash
官网示例:
https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/init-containers/
bash
# init-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
# 主应用容器
containers:
- name: myapp-container
image: busybox:1.28
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
# Init容器(串行执行:先init-myservice,再init-mydb)
initContainers:
- name: init-myservice
image: busybox:1.28
# 修正command换行问题,确保脚本逻辑完整
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
bash
这个例子是定义了一个具有 2 个 Init 容器的简单 Pod。 第一个等待 myservice 启动, 第二个等待
mydb 启动。 一旦这两个 Init容器都启动完成,Pod 将启动 spec 中的应用容器。
先去查看 找不到错误信息
kubectl describe pod myapp-pod
使用logs查看 指定好 init r容器名称
kubectl logs myapp-pod -c init-myservice
bash
# myservice.yaml 正确格式(2个空格缩进,层级清晰)
apiVersion: v1
kind: Service
metadata:
name: myservice # metadata下的字段缩进2个空格
spec: # spec与metadata同级,无缩进
ports: # spec下的字段缩进2个空格
- protocol: TCP # 列表项(-)后紧跟字段,缩进2个空格
port: 80 # 列表项内的字段再缩进2个空格(共4个)
targetPort: 9376
bash
# mydb.yaml 正确格式
apiVersion: v1
kind: Service
metadata:
name: mydb
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
bash
# 1. 创建myservice.yaml文件(用vim编辑,粘贴上面修正后的内容)
vim myservice.yaml
# 2. 创建myservice Service
kubectl create -f myservice.yaml
# 3. 查看所有Service(验证myservice是否创建成功)
kubectl get svc
# (可选)查看kube-system命名空间的Pod(无关,仅你原命令保留)
kubectl get pods -n kube-system
# (可选)查看默认命名空间的Pod(无关,仅你原命令保留)
kubectl get pods
# 4. 创建mydb.yaml文件(用vim编辑,粘贴上面修正后的内容)
vim mydb.yaml
# 5. 创建mydb Service
kubectl create -f mydb.yaml
# 6. 再次查看Service(验证mydb是否创建成功)
kubectl get svc

二、Pod 的核心配置

2.1 镜像拉取策略(imagePullPolicy)
- IfNotPresent(默认):本地有镜像则使用,无则拉取;
- Always:每次启动均重新拉取镜像(适合开发环境);
- Never:仅使用本地镜像,不拉取。
bash
spec:
containers:
- name: nginx
image: nginx:1.14
imagePullPolicy: Always # 每次启动拉取镜像
2.1.1 镜像拉取策略案例
步骤1:准备工作与创建异常Pod
1、创建并进入测试目录:
bash
mkdir /opt/demo && cd /opt/demo
2、创建并编辑pod1.yaml配置文件: