K8s Pod 与 Deployment¶
一句话概述:Pod 是 Kubernetes 最小的部署单元(一个或多个容器的组合),Deployment 管理 Pod 的副本数量和滚动更新,是 K8s 中最常用的工作负载资源。
核心知识点¶
| 概念 | 白话解释 |
|---|---|
| Pod | 豆荚 = 一个或多个容器打包在一起,共享网络和存储 |
| Deployment | 部署 = 管理 Pod 副本的控制器(维持数量、滚动更新) |
| ReplicaSet | 副本集 = Deployment 自动创建的,负责维持指定数量的 Pod |
| Container | 容器 = Pod 中的一个 Docker 容器 |
| Init Container | 初始化容器 = Pod 启动前先运行的容器(做准备工作) |
| Sidecar | 边车 = 和主容器一起运行的辅助容器 |
| Label | 标签 = 键值对,用来标记和筛选资源 |
| Selector | 选择器 = 根据标签筛选资源 |
安装配置¶
# 安装 kubectl(K8s 命令行工具)
# macOS
brew install kubectl
# Ubuntu
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x kubectl && sudo mv kubectl /usr/local/bin/
# 本地学习用 minikube
brew install minikube # macOS
minikube start # 启动本地 K8s 集群
# 验证
kubectl version # 查看版本
kubectl cluster-info # 查看集群信息
基本使用¶
1. Pod¶
# pod.yaml — 最简单的 Pod
apiVersion: v1
kind: Pod # 资源类型:Pod
metadata:
name: my-pod # Pod 名称
labels:
app: web # 标签(用于选择器筛选)
spec:
containers:
- name: web # 容器名
image: nginx:latest # 镜像
ports:
- containerPort: 80 # 容器端口
resources: # 资源限制
requests: # 最低保证
cpu: "100m" # 0.1 个 CPU
memory: "128Mi" # 128 MB 内存
limits: # 最大限制
cpu: "500m" # 0.5 个 CPU
memory: "256Mi" # 256 MB 内存
livenessProbe: # 存活探针(不响应就重启)
httpGet:
path: / # 检查的 URL
port: 80
initialDelaySeconds: 10 # 启动后等10秒再检查
periodSeconds: 5 # 每5秒检查一次
readinessProbe: # 就绪探针(不就绪就不接流量)
httpGet:
path: /
port: 80
initialDelaySeconds: 5
kubectl apply -f pod.yaml # 创建 Pod
kubectl get pods # 查看 Pod 列表
kubectl describe pod my-pod # 查看 Pod 详情
kubectl logs my-pod # 查看日志
kubectl exec -it my-pod -- bash # 进入 Pod
kubectl delete pod my-pod # 删除 Pod
2. Deployment¶
# deployment.yaml
apiVersion: apps/v1
kind: Deployment # 资源类型:Deployment
metadata:
name: web-deployment
labels:
app: web
spec:
replicas: 3 # 运行3个 Pod 副本
selector:
matchLabels:
app: web # 管理带有 app=web 标签的 Pod
strategy:
type: RollingUpdate # 滚动更新策略
rollingUpdate:
maxSurge: 1 # 更新时最多多出1个 Pod
maxUnavailable: 0 # 更新时不允许有不可用的 Pod
template: # Pod 模板
metadata:
labels:
app: web # Pod 的标签(必须与 selector 匹配)
spec:
containers:
- name: web
image: myapp:v1.0 # 应用镜像
ports:
- containerPort: 8080
env: # 环境变量
- name: DATABASE_URL
value: "postgresql://db:5432/mydb"
resources:
requests:
cpu: "200m"
memory: "256Mi"
limits:
cpu: "500m"
memory: "512Mi"
kubectl apply -f deployment.yaml # 创建/更新 Deployment
kubectl get deployments # 查看 Deployment 列表
kubectl get pods -l app=web # 查看这个 Deployment 管理的 Pod
kubectl rollout status deployment/web-deployment # 查看部署状态
# 扩缩容
kubectl scale deployment web-deployment --replicas=5 # 扩到5个副本
# 更新镜像(触发滚动更新)
kubectl set image deployment/web-deployment web=myapp:v2.0 # 更新镜像版本
# 查看更新历史
kubectl rollout history deployment/web-deployment
# 回滚
kubectl rollout undo deployment/web-deployment # 回滚到上一个版本
kubectl rollout undo deployment/web-deployment --to-revision=2 # 回滚到指定版本
3. 带 Init Container 的 Pod¶
apiVersion: v1
kind: Pod
metadata:
name: analysis-pod
spec:
initContainers: # 初始化容器(按顺序执行,全部完成后才启动主容器)
- name: download-data # 下载数据
image: busybox
command: ['wget', '-O', '/data/reference.fa', 'https://example.com/ref.fa']
volumeMounts:
- name: data
mountPath: /data
containers: # 主容器
- name: analysis
image: biocontainers/samtools:v1.19
command: ['samtools', 'index', '/data/reference.fa']
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
emptyDir: {} # 临时卷,Pod 生命周期内存在
高级用法¶
1. 多容器 Pod(Sidecar 模式)¶
spec:
containers:
- name: app # 主容器
image: myapp:latest
ports: [{containerPort: 8080}]
- name: log-collector # 边车:日志收集
image: fluentd:latest
volumeMounts:
- name: logs
mountPath: /var/log/app
volumes:
- name: logs
emptyDir: {}
2. Pod 亲和性(调度控制)¶
spec:
affinity:
podAntiAffinity: # Pod 反亲和:不要把同一应用的 Pod 放在同一个节点
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: web
topologyKey: kubernetes.io/hostname
常见报错¶
| 报错信息 | 原因 | 解决方法 |
|---|---|---|
ImagePullBackOff | 拉取镜像失败 | 检查镜像名、仓库权限 |
CrashLoopBackOff | 容器不断崩溃重启 | kubectl logs 查看日志 |
Pending | Pod 调度不上 | kubectl describe pod 看原因(资源不足?) |
OOMKilled | 内存超限被杀 | 增加 resources.limits.memory |
CreateContainerConfigError | 配置错误 | 检查 ConfigMap/Secret 引用 |
速查表¶
# === Pod 操作 ===
kubectl get pods # 列出 Pod
kubectl get pods -o wide # 详细列出(含 IP、节点)
kubectl describe pod <name> # 查看详情
kubectl logs <pod> [-c container] # 查看日志
kubectl exec -it <pod> -- bash # 进入 Pod
kubectl delete pod <name> # 删除 Pod
kubectl top pod # 查看资源使用
# === Deployment 操作 ===
kubectl get deployments # 列出 Deployment
kubectl scale deploy <n> --replicas=5 # 扩缩容
kubectl set image deploy/<n> c=img:v2 # 更新镜像
kubectl rollout status deploy/<n> # 查看部署状态
kubectl rollout history deploy/<n> # 查看历史
kubectl rollout undo deploy/<n> # 回滚
# === 常用参数 ===
-l app=web # 按标签筛选
-n namespace # 指定命名空间
-o yaml # 输出 YAML
-o json # 输出 JSON
--watch # 实时监听变化
参考:Kubernetes Pod 文档 | Deployment 文档 | 更新于 2026 年