系列文章目录
文章目录
- 系列文章目录
- 前言
- [Kubernetes Pod 详解:](#Kubernetes Pod 详解:)
-
- [一、Pod 基础概念:K8s 的「最小运行单元」](#一、Pod 基础概念:K8s 的「最小运行单元」)
-
- [1. 什么是 Pod?](#1. 什么是 Pod?)
- [2. Pod 的核心特性](#2. Pod 的核心特性)
- [二、Pod 的 3 类核心容器:各司其职](#二、Pod 的 3 类核心容器:各司其职)
-
- [1. 基础容器(Infrastructure Container):Pod 的「地基」](#1. 基础容器(Infrastructure Container):Pod 的「地基」)
- [2. 初始化容器(Init Containers):启动前的「准备工作」](#2. 初始化容器(Init Containers):启动前的「准备工作」)
-
- [实战示例:Init 容器等待依赖服务启动](#实战示例:Init 容器等待依赖服务启动)
- [3. 应用容器(Main Containers):Pod 的「核心业务」](#3. 应用容器(Main Containers):Pod 的「核心业务」)
-
- [示例 1:单容器 Pod(最常用)](#示例 1:单容器 Pod(最常用))
- [示例 2:多容器 Pod(应用 + 日志收集)](#示例 2:多容器 Pod(应用 + 日志收集))
- [三、Pod 的共享资源:网络与存储](#三、Pod 的共享资源:网络与存储)
-
- [1. 网络共享:一个 Pod 一个 IP](#1. 网络共享:一个 Pod 一个 IP)
- [2. 存储共享:Volume 持久化数据](#2. 存储共享:Volume 持久化数据)
-
- [示例:Pod 内容器共享 Volume](#示例:Pod 内容器共享 Volume)
- [四、Pod 的类型与使用场景](#四、Pod 的类型与使用场景)
-
- [1. Pod 的两种类型](#1. Pod 的两种类型)
- [2. 常见使用场景](#2. 常见使用场景)
- [五、关键配置 1:镜像拉取策略(imagePullPolicy)](#五、关键配置 1:镜像拉取策略(imagePullPolicy))
-
- 三种拉取策略
- [实战示例:测试 Always 策略](#实战示例:测试 Always 策略)
- [六、关键配置 2:重启策略(restartPolicy)](#六、关键配置 2:重启策略(restartPolicy))
-
- 三种重启策略
- [实战示例:测试 OnFailure 与 Never 策略](#实战示例:测试 OnFailure 与 Never 策略)
- [七、Pod 常见状态解读](#七、Pod 常见状态解读)
- [八、Rancher 定义及部署指南](#八、Rancher 定义及部署指南)
-
- [1. 什么是 Rancher](#1. 什么是 Rancher)
- [2. Rancher 部署及配置](#2. Rancher 部署及配置)
-
- [2.1 实验环境](#2.1 实验环境)
- [2.2 安装 Rancher](#2.2 安装 Rancher)
- [2.3 登录 Rancher 平台](#2.3 登录 Rancher 平台)
- [2.4 Rancher 管理已存在的 k8s 集群](#2.4 Rancher 管理已存在的 k8s 集群)
- [2.5 Rancher 部署监控系统](#2.5 Rancher 部署监控系统)
- [2.6 使用 Rancher 仪表盘管理 k8s 集群(以创建 nginx 服务为例)](#2.6 使用 Rancher 仪表盘管理 k8s 集群(以创建 nginx 服务为例))
-
- [2.6.1 创建名称空间(Namespace)](#2.6.1 创建名称空间(Namespace))
- [2.6.2 创建 Deployment 资源](#2.6.2 创建 Deployment 资源)
- [2.6.3 创建 Service 资源](#2.6.3 创建 Service 资源)
- 八、总结:
前言
Kubernetes Pod 详解:
作为 Kubernetes(简称 K8s)中最小的部署单元,Pod 是所有容器化应用运行的基础------无论是简单的单容器应用,还是多容器协同的复杂服务,最终都会以 Pod 的形式在 K8s 集群中部署。本文将从基础概念、核心特性、关键配置到实战案例,带你彻底搞懂 Pod,新手也能轻松上手~
一、Pod 基础概念:K8s 的「最小运行单元」
1. 什么是 Pod?
Pod 是 K8s 集群中最小的、可调度的部署单元,它本质是一个「容器组」,代表集群中的一个运行进程。可以把 Pod 理解为「容器的包装壳」:
- 一个 Pod 可包含 1 个或多个紧密耦合的容器(比如应用容器 + 日志收集容器);
- Pod 内所有容器共享网络命名空间 和存储资源,协作完成特定任务;
- Pod 是短暂的(瞬时性),生命周期结束后会被销毁,而非修复(通常由 Deployment 等控制器管理重建)。
2. Pod 的核心特性
- 最小部署单元:K8s 不会直接调度容器,而是调度 Pod,容器必须依赖 Pod 才能运行;
- 容器集合:支持单容器或多容器组合,多容器场景适用于「紧密耦合、需要协同工作」的服务(比如应用容器 + 侧车容器);
- 资源共享 :Pod 内所有容器共用一个 IP 地址和端口空间,可通过
localhost直接通信;同时共享指定的存储卷(Volume),数据不会因容器重启丢失; - 短暂性:Pod 本身没有自愈能力,若所在节点故障或容器异常退出,未被控制器管理的 Pod 会直接删除,无法自动恢复。
二、Pod 的 3 类核心容器:各司其职
一个 Pod 中的容器并非孤立存在,而是按功能分为「基础容器、初始化容器、应用容器」三类,协同完成 Pod 的启动和运行。
1. 基础容器(Infrastructure Container):Pod 的「地基」
每个 Pod 启动时,K8s 会自动创建一个 Pause 容器(也叫基础容器),它是 Pod 的「底层支撑」,用户无需手动配置:
-
核心作用:提供 Pod 的 Linux 命名空间(网络、存储)基础,让其他容器能共享网络和存储资源;
-
默认镜像 :K8s 内置镜像(比如
registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0); -
查看方式 :在节点上执行以下命令,可看到所有 Pod 对应的 Pause 容器:
bash# 列出所有容器,过滤 pause 关键字 docker ps -a | grep pause # 输出示例:registry.cn-hangzhou.aliyuncs.com/google-containers/pause-amd64:3.0 "/pause"
2. 初始化容器(Init Containers):启动前的「准备工作」
Init 容器是 Pod 启动过程中先于应用容器执行的特殊容器,负责初始化任务(比如等待依赖服务启动、配置环境变量):
- 启动规则 :
- 按配置顺序依次执行,前一个 Init 容器成功退出后,下一个才会启动;
- 必须全部成功完成,应用容器才会启动;若 Init 容器失败,K8s 会根据 Pod 重启策略重试;
- 核心作用 :
- 执行应用容器中没有的工具(比如
sed、dig),避免污染应用镜像; - 延迟应用容器启动,直到依赖条件满足(比如等待数据库、缓存服务就绪);
- 可访问 Secrets 资源,而应用容器无法访问,提升安全性。
- 执行应用容器中没有的工具(比如
实战示例:Init 容器等待依赖服务启动
yaml
# 文件名:myapp-pod.yaml
apiVersion: v1 # K8s API 版本
kind: Pod # 资源类型为 Pod
metadata:
name: myapp-pod # Pod 名称
labels:
app: myapp # 标签,用于关联 Service
spec:
# 应用容器:主服务
containers:
- name: myapp-container # 容器名称
image: busybox:1.28 # 容器镜像
command: ['sh', '-c', 'echo The app is running! && sleep 3600'] # 启动后执行的命令(休眠3600秒)
# Init 容器:先等待 myservice 和 mydb 服务启动
initContainers:
- name: init-myservice # 第一个 Init 容器:等待 myservice 服务
image: busybox:1.28
# 循环查询 myservice 服务,直到查询成功(nslookup 是DNS查询命令)
command: ['sh', '-c', 'until nslookup myservice; do echo waiting for myservice; sleep 2; done;']
- name: init-mydb # 第二个 Init 容器:等待 mydb 服务
image: busybox:1.28
command: ['sh', '-c', 'until nslookup mydb; do echo waiting for mydb; sleep 2; done;']
执行步骤与解释:
bash
# 1. 创建 Pod(此时 Init 容器会卡住,等待 myservice 和 mydb 服务)
kubectl apply -f myapp-pod.yaml
# 2. 查看 Pod 状态(会显示 Pending/Initializing,因为 Init 容器未完成)
kubectl get pods
# 输出示例:myapp-pod 0/1 Init:0/2 0 10s
# 3. 查看 Init 容器日志(确认等待状态)
kubectl logs myapp-pod -c init-myservice # -c 指定容器名称
# 输出示例:waiting for myservice
# 4. 创建依赖的 myservice 服务
cat > myservice.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: myservice # 服务名称,与 Init 容器查询的一致
spec:
ports:
- protocol: TCP
port: 80 # 服务端口
targetPort: 9376 # 目标容器端口
EOF
kubectl apply -f myservice.yaml
# 5. 创建依赖的 mydb 服务
cat > mydb.yaml << EOF
apiVersion: v1
kind: Service
metadata:
name: mydb # 服务名称,与 Init 容器查询的一致
spec:
ports:
- protocol: TCP
port: 80
targetPort: 9377
EOF
kubectl apply -f mydb.yaml
# 6. 再次查看 Pod 状态(Init 容器完成,应用容器启动,状态变为 Running)
kubectl get pods
# 输出示例:myapp-pod 1/1 Running 0 30s
3. 应用容器(Main Containers):Pod 的「核心业务」
应用容器是 Pod 中真正运行业务逻辑的容器,也是用户最常配置的部分:
- 启动规则 :所有 Init 容器成功后,应用容器会并行启动;
- 核心特性:每个应用容器有独立的镜像、命令、端口配置,共享 Pod 的网络和存储;
- 常见类型:单容器 Pod(最常用,一个 Pod 对应一个应用容器)、多容器 Pod(紧密耦合的服务,比如应用 + 日志收集)。
示例 1:单容器 Pod(最常用)
yaml
# 文件名:single-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: single-container-pod # Pod 名称
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.14 # 容器镜像(Nginx 1.14 版本)
执行命令:
bash
# 创建 Pod
kubectl apply -f single-container-pod.yaml
# 查看 Pod 状态(Running 表示启动成功)
kubectl get pods -o wide # -o wide 显示详细信息(IP、运行节点)
示例 2:多容器 Pod(应用 + 日志收集)
yaml
# 文件名:multi-container-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: multi-container-pod
spec:
containers:
- name: app # 应用容器(假设是业务服务)
image: my-app:latest # 业务镜像
- name: sidecar # 侧车容器(日志收集,比如 Filebeat)
image: log-collector:latest # 日志收集镜像
三、Pod 的共享资源:网络与存储
Pod 内的容器之所以能协同工作,核心是共享「网络」和「存储」资源,无需额外配置通信方式。
1. 网络共享:一个 Pod 一个 IP
- 每个 Pod 会被 K8s 分配一个唯一的集群内 IP 地址;
- Pod 内所有容器共享这个 IP 和端口空间,可通过
localhost:端口直接通信(比如应用容器在 80 端口,日志容器可通过localhost:80采集日志); - Pod 与外界通信时,需通过 Service(比如 NodePort、LoadBalancer)做端口映射,外界无法直接访问 Pod 的 IP(Pod 重启后 IP 会变化)。
2. 存储共享:Volume 持久化数据
- Pod 可配置多个「共享存储卷(Volume)」,所有容器都能读写该 Volume;
- Volume 独立于容器生命周期,即使容器重启或重建,Volume 中的数据也不会丢失;
- 常见 Volume 类型:hostPath(挂载节点本地目录)、NFS(网络存储)、ConfigMap/Secrets(配置存储)。
示例:Pod 内容器共享 Volume
yaml
apiVersion: v1
kind: Pod
metadata:
name: shared-volume-pod
spec:
containers:
- name: app
image: busybox:1.28
command: ['sh', '-c', 'echo "hello from app" > /data/app.log && sleep 3600']
volumeMounts:
- name: shared-data # 挂载名称(与下面 volumes 对应)
mountPath: /data # 容器内挂载路径
- name: sidecar
image: busybox:1.28
command: ['sh', '-c', 'cat /data/app.log && sleep 3600'] # 读取 app 写入的文件
volumeMounts:
- name: shared-data
mountPath: /data
volumes: # 定义共享 Volume
- name: shared-data
hostPath:
path: /tmp/shared # 节点上的本地目录(容器共享该目录)
type: DirectoryOrCreate # 目录不存在则自动创建
四、Pod 的类型与使用场景
1. Pod 的两种类型
| 类型 | 特点 | 适用场景 |
|---|---|---|
| 自主式 Pod(裸 Pod) | 无自愈能力,节点故障或容器退出后不会重建 | 测试、临时任务 |
| 控制器管理的 Pod | 由 Deployment/StatefulSet 等控制器管理,支持副本扩展、滚动升级、自动修复 | 生产环境所有业务服务 |
注意:生产环境禁止使用自主式 Pod,因为无法保证服务可用性,必须通过控制器管理。
2. 常见使用场景
- 单进程应用:最普遍的场景(比如 Nginx、MySQL),一个 Pod 对应一个应用容器,通过 Deployment 管理副本数;
- 多进程协作:紧密耦合的服务(比如应用 + 日志收集、应用 + 配置同步),多容器共享网络和存储,避免跨 Pod 通信的延迟。
五、关键配置 1:镜像拉取策略(imagePullPolicy)
Pod 启动时,K8s 会根据「镜像拉取策略」决定是否从镜像仓库拉取镜像,核心配置字段:imagePullPolicy。
三种拉取策略
| 策略 | 行为描述 | 适用场景 |
|---|---|---|
| IfNotPresent | 本地有镜像则直接使用,本地没有则拉取(默认) | 生产环境(避免重复拉取,节省时间) |
| Always | 每次启动 Pod 都强制从仓库拉取最新镜像 | 开发环境(实时获取最新代码) |
| Never | 只使用本地镜像,不主动拉取(本地没有则报错) | 离线环境、测试环境(固定镜像版本) |
实战示例:测试 Always 策略
yaml
# 文件名:pod1.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-test1 # Pod 名称
spec:
containers:
- name: nginx # 容器名称
image: nginx:1.14 # 镜像版本固定为 1.14
imagePullPolicy: Always # 每次启动都拉取镜像
# command: [ "echo", "SUCCESS" ] # 注释:若打开,执行完 echo 进程退出,容器会重启
执行步骤与解释:
bash
# 1. 创建 Pod
kubectl apply -f pod1.yaml
# 2. 查看 Pod 状态(Running 表示成功,若打开 command 会显示 CrashLoopBackoff)
kubectl get pods -o wide
# 输出示例:pod-test1 1/1 Running 0 2m
# 3. 查看镜像拉取日志(确认 Always 策略生效)
kubectl describe pod pod-test1 | grep Pulled
# 输出示例:Normal Pulled 3m kubelet Successfully pulled image "nginx:1.14"
# 4. 若修改镜像版本(比如 nginx:1.15),重新应用后会拉取新镜像
kubectl edit pod pod-test1 # 编辑 Pod 配置,修改 image 为 nginx:1.15
kubectl describe pod pod-test1 | grep Pulled # 会显示拉取 nginx:1.15 的日志
六、关键配置 2:重启策略(restartPolicy)
重启策略定义了「容器退出后,K8s 如何处理容器重启」,核心配置字段:restartPolicy(与 containers 同级)。
三种重启策略
| 策略 | 行为描述 | 适用场景 |
|---|---|---|
| Always | 无论容器退出码是什么,都自动重启(默认) | 生产环境服务(保证可用性) |
| OnFailure | 只有容器非正常退出(退出码非 0)时才重启 | 批处理任务(正常结束后不重启) |
| Never | 容器退出后不重启 | 测试任务、一次性任务 |
实战示例:测试 OnFailure 与 Never 策略
yaml
# 文件名:pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args: ['/bin/sh', '-c', 'sleep 30; exit 3'] # 休眠30秒后,以退出码 3 非正常退出
restartPolicy: OnFailure # 非正常退出时重启(改为 Never 则不重启)
执行步骤与解释:
bash
# 1. 创建 Pod
kubectl apply -f pod3.yaml
# 2. 实时查看 Pod 状态(30秒后容器退出,会自动重启)
kubectl get pods -w
# 输出示例:
# foo 1/1 Running 0 10s
# foo 0/1 Error 0 30s # 30秒后退出,状态变为 Error
# foo 1/1 Running 1 35s # OnFailure 策略触发重启,RESTARTS 变为 1
# 3. 修改重启策略为 Never,重新测试
kubectl edit pod foo # 将 restartPolicy 改为 Never
kubectl delete -f pod3.yaml && kubectl apply -f pod3.yaml
kubectl get pods -w
# 输出示例:
# foo 1/1 Running 0 10s
# foo 0/1 Error 0 30s # 退出后不会重启,状态保持 Error
七、Pod 常见状态解读
Pod 生命周期中会有多种状态,核心状态如下:
| 状态 | 含义 | 排查方向 |
|---|---|---|
| Pending | Pod 已被 K8s 接收,但容器未启动(调度中/拉镜像) | 检查节点资源、镜像是否存在 |
| Running | Pod 已调度到节点,至少一个容器在运行 | 正常状态,可通过 logs 查看容器日志 |
| CrashLoopBackoff | 容器启动后立即退出,不断重启 | 检查容器命令、配置文件、依赖服务 |
| Error | 容器启动失败(比如镜像不存在、权限不足) | 执行 kubectl describe pod 名称 查看错误日志 |
| Succeeded | 所有容器正常退出(退出码 0),不会重启 | 一次性任务执行完成 |
| Unknown | 无法获取 Pod 状态(通信故障) | 检查节点是否正常、K8s 组件状态 |
八、Rancher 定义及部署指南
1. 什么是 Rancher
Rancher 是一款开源的企业级多集群 Kubernetes(简称 k8s)管理平台,核心作用是实现 Kubernetes 集群在混合云与本地数据中心的集中部署与管理,能够保障集群安全性,助力企业加速数字化转型。目前已有超过 40000 家企业日常使用 Rancher 开展创新工作。
从功能特性来看,Rancher 与 k8s 均属于容器调度与编排系统,但 Rancher 具备更广泛的管理能力:不仅能管理应用容器,更核心的优势是可以管理 k8s 集群。其 2.x 版本底层基于 k8s 调度引擎,通过封装简化了操作流程,让不熟悉 k8s 概念的用户也能轻松通过 Rancher 向 k8s 集群部署容器。
Rancher 官网:https://docs.rancher.cn/
2. Rancher 部署及配置
2.1 实验环境
| 节点类型 | 节点名称 | IP 地址 |
|---|---|---|
| 控制节点 | master01 | 192.168.10.19 |
| 工作节点 | node01 | 192.168.10.20 |
| 工作节点 | node02 | 192.168.10.21 |
| Rancher 节点 | rancher | 192.168.10.23 |
2.2 安装 Rancher
- 在控制节点 master01 下载 rancher-agent 镜像:
bash
docker pull rancher/rancher-agent:v2.5.7
- 在 Rancher 节点下载 rancher 镜像并启动容器:
bash
# 下载镜像
docker pull rancher/rancher:v2.5.7
# 启动容器(--restart=unless-stopped 表示容器退出时自动重启,排除 Docker 守护进程启动前已停止的情况)
docker run -d --restart=unless-stopped -p 80:80 -p 443:443 --privileged --name rancher rancher/rancher:v2.5.7
# 验证容器是否启动成功
docker ps -a|grep rancher
成功启动后会显示类似如下结果:
1326da432b17 rancher/rancher:v2.5.7 "entrypoint.sh" 13 seconds ago Up 13 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp rancher
2.3 登录 Rancher 平台
- 容器启动后需等待片刻,在浏览器访问地址:http://192.168.10.23(因未使用授信证书,会出现报警提示,直接忽略即可);
- 若登录后为英文页面,点击右下角语言选项切换为中文。
2.4 Rancher 管理已存在的 k8s 集群
- 登录后选择【添加集群】,点击【导入】;
- 【集群名称】设置为 k8s-cluster,点击【创建】;
- 复制页面中第三条"绕过证书检查导入 k8s 集群"的命令;
- 在 k8s 控制节点 master01 上执行复制的命令(若第一次执行报错,再次执行即可):
bash
curl --insecure -sfL https://192.168.10.23/v3/import/ltlhl7vggnwz8knbjncgbxqlrf6krpbfbxtzh4qlpnqxrq5559k6gf_c-jf5bx.yaml | kubectl apply -f -
- 验证集群导入结果:
bash
# 查看命名空间(应出现 cattle-system、fleet-system 等命名空间)
kubectl get ns
# 查看 cattle-system 命名空间下的 Pod 状态
kubectl get pods -n cattle-system -o wide
# 查看 fleet-system 命名空间下的 Pod 状态
kubectl get pods -n fleet-system -o wide
正常情况下,相关 Pod 状态会显示为"Running",类似如下结果:
# cattle-system 命名空间 Pod 示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
cattle-cluster-agent-78647b4ff8-fbqdp 1/1 Running 0 2m1s 10.244.1.4 node01 <none> <none>
# fleet-system 命名空间 Pod 示例
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
fleet-agent-55bfc495bd-m9qjt 1/1 Running 0 6m8s 10.244.1.3 node01 <none> <none>
2.5 Rancher 部署监控系统
- 在 Rancher 集群页面点击【启用监控以查看实时监控】;
- 【监控组件版本】选择 0.2.1,其他参数保持默认;
- 点击【启用监控】,启动过程需等待约 10 分钟(因组件部署耗时较长)。
2.6 使用 Rancher 仪表盘管理 k8s 集群(以创建 nginx 服务为例)
2.6.1 创建名称空间(Namespace)
- 点击【仪表盘】进入 k8s 集群仪表盘界面;
- 左侧菜单选择【Namespaces】,点击右侧【Create】;
- 【Name】输入 dev,【Description】为可选自定义内容;
- 点击右下角【Create】完成创建。
2.6.2 创建 Deployment 资源
- 左侧菜单选择【Deployments】,点击右侧【Create】;
- 【Namespace】下拉选择 dev,【Name】输入 nginx-dev,【Replicas】输入 3;
- 点击中间选项【Container】,【Container Image】输入 nginx:1.14,【Pull Policy】选择 IfNotPresent;
- 在【Pod Labels】下点击【Add Label】,【Key】输入 app,【Value】输入 nginx;
- 点击中间选项【Labels and Annotations】,点击【Add Label】,【Key】输入 app,【Value】输入 nginx;
- 点击右下角【Create】完成创建。
2.6.3 创建 Service 资源
- 左侧菜单选择【Services】,点击右侧【Create】;
- 选择【Node Port】类型;
- 【Namespace】下拉选择 dev,【Name】输入 nginx-dev;
- 【Port Name】输入 nginx,【Listening Port】输入 80,【Target Port】输入 80,【Node Port】输入 30180;
- 点击中间选项【Selectors】,【Key】输入 app,【Value】输入 nginx;
- 点击右下角【Create】完成创建;
- 点击创建好的【nginx-dev】服务,验证是否已关联上对应的 Pod;
- 通过节点端口 30180/TCP 即可访问内部的 nginx 页面。
八、总结:
- 本质:Pod 是 K8s 最小部署单元,是「容器的包装壳」,负责管理容器的共享资源;
- 容器类型:基础容器(Pause)提供底层支撑,Init 容器负责初始化,应用容器运行业务;
- 关键配置:镜像拉取策略(默认 IfNotPresent)、重启策略(默认 Always),根据场景灵活选择;
- 实战建议:生产环境用 Deployment 等控制器管理 Pod,避免裸 Pod;多容器场景仅用于紧密耦合的服务。