Kubernetes Pod 管理

文章目录

  • [Kubernetes Pod 管理](#Kubernetes Pod 管理)
    • [1. 核心概念速览](#1. 核心概念速览)
    • [2. 资源模型:Pod ↔ Controller 关联](#2. 资源模型:Pod ↔ Controller 关联)
    • [3. 常用命令 30s 速查](#3. 常用命令 30s 速查)
    • [4. YAML 模板骨架(最小可运行)](#4. YAML 模板骨架(最小可运行))
    • [5. 镜像拉取策略](#5. 镜像拉取策略)
    • [6. 资源限制与 QoS](#6. 资源限制与 QoS)
    • [7. Pod 多容器实践](#7. Pod 多容器实践)
    • [8. 生命周期钩子](#8. 生命周期钩子)
    • [9. 健康检查探针](#9. 健康检查探针)
    • [10. 调度约束](#10. 调度约束)
    • [11. 重启策略与现场恢复](#11. 重启策略与现场恢复)
    • [12. 排障三板斧](#12. 排障三板斧)
    • [13. 一键实验清单](#13. 一键实验清单)
    • [14. 思维导图](#14. 思维导图)

Kubernetes Pod 管理

1. 核心概念速览

术语 一句话记忆
Pod K8s 最小调度单元,1-N 个容器共享网络/存储
Workload 由 Pod + 控制器(Deployment、StatefulSet...)组成
静态 Pod 直接由 kubelet 管理,无控制器,kube-apiserver 不可见
控制器 Pod 由控制器管理,支持副本伸缩、滚动升级、回滚

2. 资源模型:Pod ↔ Controller 关联

唯一关联方式:Label-Selector

yaml 复制代码
# Pod 端
metadata:
  labels:
    app: nginx

# 控制器端
selector:
  matchLabels:
    app: nginx

3. 常用命令 30s 速查

bash 复制代码
kubectl get pod -A                    # 看所有 Pod
kubectl get pod --show-labels         # 带标签
kubectl top pod <name>                # 实时资源
kubectl describe pod <name>           # 事件排障
kubectl logs <pod> [-c <container>]   # 日志
kubectl exec <pod> [-c <c>] -- <cmd>  # 进入容器
kubectl label pod <name> k=v          # 打标签
kubectl delete pod <name> [--force]   # 删除单 Pod

4. YAML 模板骨架(最小可运行)

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: demo
  namespace: default
  labels:
    app: demo
spec:
  containers:
  - name: c1
    image: nginx:1.26-alpine
    ports:
    - containerPort: 80
    resources:
      requests:
        cpu: 100m
        memory: 128Mi
      limits:
        cpu: 200m
        memory: 256Mi
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 5
  restartPolicy: Always

5. 镜像拉取策略

策略值 行为 默认触发条件
Always 每次都尝试 pull 镜像 tag 为 latest
IfNotPresent 本地有就用本地 非 latest
Never 只用本地镜像 手动指定

6. 资源限制与 QoS

yaml 复制代码
resources:
  requests:   # 调度权重 & kubelet 预留
    cpu: 100m
    memory: 100Mi
  limits:     # 运行时硬限制
    cpu: 200m
    memory: 200Mi
  • QoS 等级 (系统 OOM 时按顺序 kill)
    1. Guaranteed:requests == limits
    2. Burstable:requests < limits
    3. BestEffort:未写 requests/limits

7. Pod 多容器实践

  • 共享网络 :同一 Pod 内 127.0.0.1 互通
  • 共享存储:挂载同一 volume
  • 常见组合:主容器 + sidecar(日志/代理/监控)

⚠️ 端口冲突场景:两个 nginx 都监听 80 → 第二容器 CrashLoopBackOff


8. 生命周期钩子

yaml 复制代码
lifecycle:
  postStart:   # 容器启动后
    exec:
      command: ["mkdir", "-p", "/var/www/cache"]
  preStop:     # 容器终止前
    exec:
      command: ["/bin/sh","-c","sleep 10 && nginx -s quit"]
  • preStop 最长宽限期 30s,之后强制 SIGKILL

9. 健康检查探针

探针类型 作用 失败行为
liveness 存活检查 kubelet 重启容器
readiness 就绪检查 从 Service Endpoints 摘流
startup 启动保护 成功前禁用其他探针

探测方式exechttpGettcpSocketgrpc


10. 调度约束

  1. nodeName(直接绕过 scheduler)
yaml 复制代码
spec:
  nodeName: node2
  1. nodeSelector(标签匹配)
bash 复制代码
kubectl label nodes node1 disktype=ssd
yaml 复制代码
spec:
  nodeSelector:
    disktype: ssd
  1. 亲和/反亲和、污点容忍

11. 重启策略与现场恢复

策略 说明 场景
Always(默认) 无限重启,指数退避(10s→20s→40s...) 长期服务
OnFailure 仅异常退出重启 批处理 Job
Never 不重启 一次性任务

12. 排障三板斧

  1. kubectl describe pod <name> → 看 Events
  2. kubectl logs <pod> -c <container> --previous → 看上次退出日志
  3. kubectl exec -it <pod> -c <c> -- /bin/sh → 现场交互

13. 一键实验清单

bash 复制代码
# 1. 创建
kubectl apply -f https://raw.githubusercontent.com/polinux/stress/master/k8s/pod-stress.yaml

# 2. 监控
watch -n 1 kubectl top pod pod-stress

# 3. 打标签
kubectl label pod pod-stress region=hz env=test

# 4. 删除观察重启
kubectl delete pod pod-stress

14. 思维导图

复制代码
Pod
├── 定义:最小调度单元
├── 分类
│   ├── 静态 Pod(kubelet 自管)
│   └── 控制器 Pod(Deployment 等)
├── 操作
│   ├── 创建:kubectl run / apply
│   ├── 查询:get, describe, top, logs
│   └── 删除:delete(级联 vs 孤立)
├── YAML 核心字段
│   ├── metadata:name/namespace/labels
│   ├── spec.containers:image/resources/probes
│   └── spec.restartPolicy
├── 生命周期
│   ├── Init → Main → PostStart → Probes → PreStop
│   └── 重启策略:Always | OnFailure | Never
├── 调度
│   ├── nodeName(直连)
│   ├── nodeSelector(标签)
│   └── 亲和/污点(进阶)
└── 排障
    ├── Events
    ├── Logs
    └── exec 现场
相关推荐
zfoo-framework3 小时前
docker compose安装gitea实现公司内部开发git私有仓库
docker·容器·gitea
无巧不成书02183 小时前
基于WSL 2的Docker远程开发全栈实战指南
运维·docker·容器·docker desktop·wsl 2·vs code远程开发·容器化开发
Renhao-Wan3 小时前
Docker 核心原理详解:镜像、容器、Namespace、Cgroups 与 UnionFS
java·后端·docker·容器
Eloudy3 小时前
docker pull ubuntu:22.04 失败的解决记录
运维·docker·容器
taWSw5OjU5 小时前
Docker] Docker中`overlay2`磁盘占用爆满的清理方案
docker·容器·eureka
Ashmcracker5 小时前
Azure Key Vault 证书如何在 AKS 中同步为 Kubernetes Secret?附权限配置与 YAML 示例
kubernetes·flask·azure
掘根19 小时前
【微服务即时通讯项目】系统联调
微服务·云原生·架构
DONG99920 小时前
配置docker代理
docker·容器
怎么就重名了20 小时前
docker可以动态修改端口映射吗
运维·docker·容器
JEECG低代码平台21 小时前
敲敲云零代码平台一键部署实战:命令安装 vs Docker 安装
运维·docker·容器