5.k8s的pod介绍

一、Pod 概述

1.1 定义与本质

Pod 是 Kubernetes 中最小可调度与部署单元,代表一个逻辑主机,封装一个或多个紧密协作的容器。

核心特征

  • 调度原子性:调度器以 Pod 为单位分配节点
  • 资源共享
    • 共享 Network Namespace(IP、端口空间)
    • 共享 UTS Namespace(主机名)
    • 共享 IPC Namespace(进程间通信)
    • 共享 Storage Volume(数据卷)
  • 统一生命周期:Pod 创建/删除时,内部容器同步启停

通信模型

  • 容器间通过 localhost 直接通信
  • Pod 间通过 Pod IP 跨节点通信(需底层CNI支持)

1.2 使用模式

模式说明典型场景
单容器 Pod一个 Pod 运行一个容器标准无状态应用
多容器 Pod主容器 + 辅助容器(Sidecar)日志采集、代理、配置同步
无状态 Pod不保存本地状态,数据依赖外部存储Web服务器、API服务
有状态 Pod需持久化数据,配合 StatefulSet数据库、消息队列

二、Pod 内部架构

2.1 Pause 容器(Infra Container)

定义:每个 Pod 启动时自动创建的特殊“根容器”,不执行业务逻辑,镜像极简(仅 /pause)。

核心作用

功能说明
命名空间持有者创建并持有 Network、UTS、IPC、PID 命名空间
资源共享基础业务容器启动时加入 pause 已创建的命名空间
Pod 存活锚点pause 容器存活即 Pod 存活,业务容器可独立重启
稳定环境提供Pod 生命周期内 pause 持续运行,为重启容器提供恒定网络环境

类比:Pod = 豆荚,Pause = 豆荚壳,业务容器 = 豆子。

查看命令

docker ps | grep pause

修改默认 Infra 镜像

vim /etc/kubernetes/kubelet
# 添加或修改 --pod-infra-container-image 参数

2.2 Init 容器(初始化容器)

定义:在业务容器启动前按顺序执行的专用容器,执行成功后退出。

核心特性

特性说明
执行顺序多个 Init 容器串行执行,按定义次序
与业务容器关系Init 容器全部成功后才启动业务容器
生命周期执行成功即退出,不持续运行
重启行为Pod 重启时,Init 容器重新执行

适用场景

  • 数据库初始化脚本导入
  • 配置文件生成
  • 权限设置
  • 依赖服务等待

三、Pod 生命周期

3.1 阶段状态(Phase)

status.phase 定义 Pod 所处生命周期阶段:

状态含义典型原因
PendingAPI 对象已创建,但部分容器未就绪调度失败、镜像拉取中、资源不足
RunningPod 已调度至节点,所有容器创建成功,至少一个运行中-
Succeeded所有容器成功退出(返回码 0)Job、CronJob 完成
Failed至少一个容器以非 0 返回码退出应用崩溃、配置错误
Unknown状态无法获取Master 与 Node 通信故障
CrashLoopBackOff容器启动后异常退出,且反复重启应用故障、健康检查失败
Completed同 Succeeded,任务类 Pod 正常结束-
Error容器运行出错-
Init:N/MM 个 Init 容器,N 个已完成Init 容器执行中
Init:ErrorInit 容器执行失败-
Init:CrashLoopBackOffInit 容器反复失败-
PodInitializingInit 容器完成,业务容器启动中-

3.2 条件状态(Conditions)

status.conditions 提供更细粒度状态描述:

条件说明
PodScheduledPod 已被调度至某节点
ReadyPod 可提供服务(所有就绪探针通过)
Initialized所有 Init 容器执行成功
Unschedulable调度失败(资源不足、污点不匹配等)
ContainersReady所有容器已就绪

四、Pod 资源管理与服务质量

4.1 资源限制

参数定义

参数含义单位
requests资源最小申请量(调度保证)CPU:核(1000m=1核) 内存:Mi、Gi
limits资源最大使用量(强制限制)同上

超限行为:容器试图使用超过 limits 的资源时,可能被 OOM Kill 并重启

4.2 服务质量等级(QoS)

Kubernetes 根据资源定义自动为 Pod 分配 QoS 等级:

等级判定条件资源不足时驱逐优先级
Guaranteed(最高)所有容器均设置 limitsrequests,且两者相等最低
Burstable(中等)至少一个容器设置 requests,不满足 Guaranteed 条件中等
BestEffort(最低)没有任何容器设置 requestslimits最高(优先驱逐)

生产建议:始终为容器同时配置 requestslimits 且取值相同,获得 Guaranteed QoS。


五、Pod 健康检查机制

5.1 探针类型

探针作用失败后果
livenessProbe(存活探针)检查容器是否正在运行kubelet 杀死容器,根据重启策略重建
readinessProbe(就绪探针)检查容器是否可接收流量从 Service Endpoints 中移除 Pod IP
startupProbe(启动探针)检查容器是否已完成启动失败则杀死容器,重启策略生效;存在时禁用其他探针

默认行为:未配置探针时,liveness 默认成功,readiness 默认成功。

5.2 检查方式

方式原理适用场景
exec容器内执行命令,返回码 0 为成功自定义检查逻辑
httpGetHTTP GET 请求,状态码 200-399 为成功Web 应用健康端点
tcpSocketTCP 端口是否开放(类似 telnet)非 HTTP 服务

关键参数

参数含义
initialDelaySeconds容器启动后延迟检查秒数
periodSeconds探测间隔秒数(默认10)
timeoutSeconds单次探测超时秒数(默认1)
successThreshold成功阈值(默认1)
failureThreshold失败阈值(默认3)

六、Pod 调度与控制

6.1 普通 Pod

  • 由用户直接创建或通过控制器(Deployment、StatefulSet 等)管理
  • 定义存储在 etcd
  • 调度器分配节点后,kubelet 负责实例化
  • 容器崩溃时根据 restartPolicy 重启

重启策略

策略行为
Always(默认)容器退出时自动重启
OnFailure仅当返回码非 0 时重启
Never从不重启

6.2 静态 Pod(Static Pod)

定义:由特定节点的 kubelet 直接管理,不依赖 API Server。

核心特征

特征说明
配置存储不存储在 etcd,存放于节点本地目录(如 /etc/kubernetes/manifests
管理方式kubelet 监控目录,YAML 创建/删除即自动创建/删除 Pod
API 可见性API Server 会创建镜像 Pod(Mirror Pod) 以只读方式可见
控制能力不能通过 API Server 删除或修改(需操作本地文件)
典型用途部署控制平面组件(kube-apiserver、etcd 等)

启用配置

# /var/lib/kubelet/config.yaml
staticPodPath: /etc/kubernetes/manifests

创建:将 Pod YAML 放入上述目录
删除:从上述目录删除对应 YAML 文件


七、Pod 亲和与反亲和

7.1 Pod 亲和(podAffinity)

定义:Pod 与 Pod 之间的倾向性调度规则,使某些 Pod 靠近部署(同一拓扑域)。

典型场景:将应用前端与后端部署在同一节点/可用区,减少网络延迟

示例:将带有 security=S1 标签的 Pod 调度到同一拓扑域(如可用区)。

7.2 Pod 反亲和(podAntiAffinity)

定义:Pod 与 Pod 之间的排斥性调度规则,使某些 Pod 分散部署(不同拓扑域)。

典型场景

  • 高可用部署:同一应用的多个副本分布在不同节点
  • 面试题:如何让 Deployment 在每个节点仅运行一个 Pod?
    答案:使用 podAntiAffinity + requiredDuringSchedulingIgnoredDuringExecution + topologyKey: kubernetes.io/hostname

核心参数

参数含义
requiredDuringSchedulingIgnoredDuringExecution硬策略:必须满足,否则 Pod 无法调度
preferredDuringSchedulingIgnoredDuringExecution软策略:尽量满足,不强制
topologyKey拓扑域划分依据(如 kubernetes.io/hostname 表示按节点划分)

八、Pod 常用操作命令

8.1 创建与运行

# 使用镜像直接运行 Pod
kubectl run <pod-name> --image=<image> [--command -- <cmd>]

# 从 YAML 创建
kubectl apply -f <pod.yaml>

# 强制更新(替换)
kubectl replace -f <pod.yaml> --force

8.2 查看与调试

# 查看基本信息
kubectl get pods [-n <namespace>] [-o wide|yaml|json]

# 查看标签
kubectl get pods --show-labels

# 根据标签过滤
kubectl get pods -l <key>=<value>

# 查看详情(事件、状态)
kubectl describe pod <pod-name>

# 查看 Pod IP 及所在节点
kubectl get pod <pod-name> -o wide

# 查看日志
kubectl logs <pod-name> [-c <container-name>] [-f]

# 进入容器
kubectl exec -it <pod-name> [-c <container-name>] -- <shell>

# 查看 Pod 内运行的镜像
kubectl get pods -A -o=custom-columns='DATA:spec.containers[*].image'

8.3 更新与扩缩容

# 滚动更新镜像
kubectl set image pod/<pod-name> <container-name>=<new-image>

# 手动扩缩容(仅控制器管理时有效)
kubectl scale <deployment/rs> --replicas=<num>

# 自动水平伸缩(HPA)
kubectl autoscale deployment <deployment-name> --max=<max> --min=<min> --cpu-percent=<threshold>

8.4 删除

# 正常删除
kubectl delete pod <pod-name>

# 强制删除(Terminating 状态)
kubectl delete pod <pod-name> --grace-period=0 --force

九、Pod YAML 规范(完整示例)

apiVersion: v1
kind: Pod
metadata:
  name: <pod-name>                 # Pod 名称(必填)
  namespace: default              # 命名空间(默认为 default)
  labels:                        # 标签(用于 Service 选择器)
    app: <app-label>
  annotations:                   # 注释(非标识性元数据)
    description: <text>
spec:
  # ---------- 调度控制 ----------
  nodeSelector:                  # 节点标签选择器
    <key>: <value>
  affinity:                     # 亲和性规则
    podAffinity:               # Pod 亲和
    podAntiAffinity:           # Pod 反亲和
  tolerations:                 # 污点容忍
  - key: <taint-key>
    operator: Equal|Exists
    value: <value>
    effect: NoSchedule|NoExecute|PreferNoSchedule
    tolerationSeconds: <int>
  
  # ---------- 容器定义 ----------
  containers:
  - name: <container-name>      # 容器名称(必填)
    image: <image>:<tag>        # 镜像地址(必填)
    imagePullPolicy: Always|IfNotPresent|Never  # 拉取策略
    
    # 启动命令与参数
    command: ["<executable>"]   # 覆盖 Dockerfile ENTRYPOINT
    args: ["<arg1>", "<arg2>"]  # 覆盖 Dockerfile CMD
    workingDir: <path>          # 工作目录
    
    # 端口声明
    ports:
    - name: <port-name>
      containerPort: <int>      # 容器监听端口
      protocol: TCP|UDP        # 协议
      hostPort: <int>          # 宿主机映射端口(不推荐)
    
    # 环境变量
    env:
    - name: <KEY>              # 直接赋值
      value: <value>
    - name: <KEY>              # 从 ConfigMap 引用
      valueFrom:
        configMapKeyRef:
          name: <cm-name>
          key: <cm-key>
    - name: <KEY>              # 从 Secret 引用
      valueFrom:
        secretKeyRef:
          name: <secret-name>
          key: <secret-key>
    
    # 资源限制
    resources:
      requests:
        cpu: "100m"            # 最小申请 CPU
        memory: "128Mi"        # 最小申请内存
      limits:
        cpu: "500m"            # 最大使用 CPU
        memory: "256Mi"        # 最大使用内存
    
    # 健康检查
    livenessProbe:
      exec:
        command: ["cat", "/tmp/healthy"]
      httpGet:
        path: /healthz
        port: 8080
      tcpSocket:
        port: 8080
      initialDelaySeconds: 5
      periodSeconds: 10
      timeoutSeconds: 1
      failureThreshold: 3
      successThreshold: 1
    
    readinessProbe:            # 配置方式同 livenessProbe
    startupProbe:             # 配置方式同 livenessProbe
    
    # 存储挂载
    volumeMounts:
    - name: <volume-name>
      mountPath: <container-path>
      readOnly: true|false
      subPath: <file-name>    # 挂载单个文件
  
  # ---------- 初始化容器 ----------
  initContainers:
  - name: <init-container-name>
    image: <image>
    command: ["<command>"]
    volumeMounts: [...]       # 可与业务容器共享卷
  
  # ---------- 存储卷定义 ----------
  volumes:
  - name: <volume-name>
    emptyDir: {}              # 临时卷(Pod 删除即销毁)
  - name: <volume-name>
    hostPath:                 # 宿主机目录
      path: <host-path>
      type: Directory|File|...
  - name: <volume-name>
    configMap:                # ConfigMap 卷
      name: <cm-name>
      items:
      - key: <cm-key>
        path: <file-name>
  - name: <volume-name>
    secret:                   # Secret 卷
      secretName: <secret-name>
  - name: <volume-name>
    persistentVolumeClaim:    # PVC 卷
      claimName: <pvc-name>
  - name: <volume-name>
    nfs:                      # NFS 卷
      server: <nfs-server-ip>
      path: <export-path>
  
  # ---------- Pod 策略 ----------
  restartPolicy: Always|OnFailure|Never
  hostNetwork: true|false      # 使用宿主机网络命名空间
  dnsPolicy: ClusterFirst|Default|...
  serviceAccountName: <sa>    # 服务账户
  
  # ---------- 节点选择与隔离 ----------
  nodeName: <node-name>        # 直接指定节点(跳过调度器)
  hostPID: true|false         # 共享宿主机 PID 命名空间
  hostIPC: true|false        # 共享宿主机 IPC 命名空间

十、Pod 设计原则与最佳实践

原则说明
单职责原则一个 Pod 应承载一个主业务进程,Sidecar 为辅助功能
无状态优先优先设计无状态 Pod,数据存储通过 PVC 或外部服务
资源显式声明始终设置 requestslimits,且值相等(Guaranteed QoS)
探针必配生产环境必须配置 livenessProbereadinessProbe
镜像拉取策略开发测试用 IfNotPresent,生产用 Always 或指定版本
配置分离非敏感配置用 ConfigMap,敏感信息用 Secret
反亲和部署关键应用使用 podAntiAffinity 分散至不同节点
不直接使用 Pod长期运行应用通过 Deployment、StatefulSet 等控制器管理

Pod 非在线更新限制:Pod 的绝大多数字段不支持直接 apply/edit** 更新**,需删除重建或通过控制器滚动更新。

内容概要:本文围绕可变桨叶四旋翼无人机的规范控制与点对点运动模拟展开,重点研究优化推力分配策略在翻转动作中的应用与性能比较。通过Matlab代码实现,构建了四旋翼动力学模型,并设计了多种控制算法以实现精确的姿态调整与轨迹跟踪。研究对比了不同推力分配方案在执行高机动性翻转动作时的稳定性、能耗效率与响应速度,旨在提升无人机在复杂飞行任务中的动态性能与控制精度。该仿真研究为无人机飞控系统的设计与优化提供了理论依据和技术支持。; 适合人群:具备一定自动控制理论基础和Matlab编程能力,从事无人机控制、飞行器动力学或机器人系统研究的科研人员及研究生。; 使用场景及目标:① 实现四旋翼无人机在三维空间中的精确点对点运动控制;② 对比分析不同推力分配策略在执行翻转等高难度动作时的控制效果与能耗表现,优化飞行性能;③ 为无人机自主飞行、特技飞行及复杂环境下的机动控制提供算法验证平台。; 阅读建议:此资源以Matlab仿真为核心,建议读者结合相关控制理论知识,深入理解代码实现细节,重点关注动力学建模、控制律设计与推力分配模块。在学习过程中,应动手调试参数,复现文中翻转动作的仿真结果,并尝试拓展至其他复杂飞行任务,以加深对无人机控制机理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

教Linux的李老师

您的赞赏,是我深夜码字时最亮的

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值