PHP 怎么Pod中断预算

wen PHP项目 179

本文目录导读:

PHP 怎么Pod中断预算

  1. 什么是 PodDisruptionBudget (PDB)?
  2. 核心配置方法(针对 PHP 应用)
  3. PHP 应用侧的最佳实践(配合 PDB)
  4. 运维操作(实操命令)
  5. 总结:PHP 与 PDB 的关系

在 PHP 中实现 Pod 中断预算(PDB)并不是指 PHP 代码本身有什么特殊的函数,而是指 Kubernetes 中的一个 API 资源,你需要在 Kubernetes 配置文件(YAML) 中定义,而不是在 PHP 代码中定义。

如果你的业务场景是:“我有一个 PHP 应用需要安全地进行滚动更新或节点维护,如何配置 PDB 来保证服务的可用性?”,请参考以下完整的实战指南。


什么是 PodDisruptionBudget (PDB)?

它是一个 K8s 控制器,用来确保在自愿中断(如节点维护、应用滚动更新、集群升级)期间,你的 PHP 应用最少有指定数量的副本保持在线,以避免服务完全不可用,注意:PDB 不能阻止非自愿中断(如节点宕机、断电)。


核心配置方法(针对 PHP 应用)

你需要创建一个 PodDisruptionBudget 资源,并通过 selector 匹配到你的 PHP Deployment 的标签。

标准 PHP Deployment 配置示例

假设你的 PHP 应用(如 Laravel、Symfony 或原生)带有标签 app: php-backend,副本数为 3。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: php-app
  namespace: production
spec:
  replicas: 3
  selector:
    matchLabels:
      app: php-backend
  template:
    metadata:
      labels:
        app: php-backend
    spec:
      containers:
        - name: php-fpm
          image: registry.example.com/php-app:v1.2.3
          ports:
            - containerPort: 9000

创建 Pod 中断预算(PDB)

场景 A:重可用(至少 2 个 Pod 存活) 适用于多读多写或不可长时间停机的 API 服务。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: php-app-pdb
  namespace: production
spec:
  # 指定允许最多中断的 Pod 数
  maxUnavailable: 1
  # 关联到你的 PHP Deployment
  selector:
    matchLabels:
      app: php-backend

场景 B:重性能(至少保留 50% 的副本) 适用于对流量波动敏感的服务。

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: php-app-pdb
  namespace: production
spec:
  # 指定最少可用 Pod 的绝对数 (优先于比例)
  minAvailable: 2
  selector:
    matchLabels:
      app: php-backend

关键原则:

  • 只能使用 minAvailable(最少可用)或 maxUnavailable(最大不可用)其中之一,不能同时使用。
  • replicas: 3 且 maxUnavailable: 1,K8s 在进行节点排空(kubectl drain)时,最多只会同时终止 1 个 PHP Pod。
  • 警告:replicas: 1 且 maxUnavailable: 1,这会导致 PDB 阻止节点排空(因为无论如何都会让可用数为 0)。

PHP 应用侧的最佳实践(配合 PDB)

为了让 PDB 完美生效,你的 PHP 应用容器必须处理好优雅停机(Graceful Shutdown),否则 PDB 工作时,正在处理的请求可能会被切断。

PHP-FPM + Nginx 共享 Pod 的优雅退出

如果你的 PHP 应用依赖 PHP-FPM 和 Nginx,建议在 Pod 内添加 preStop 钩子,并在 PHP-FPM 容器中设置优雅退出:

containers:
  - name: php-fpm
    lifecycle:
      preStop:
        exec:
          command:
            - /bin/sh
            - -c
            - "sleep 5" # 等待 Nginx 将当前请求发给 PHP-FPM 处理完毕
spec:
  terminationGracePeriodSeconds: 60  # 给 PHP-FPM 足够的关闭时间

针对 PHP 长连接(如 Laravel 队列 worker)

如果你的 Pod 运行的是 php artisan queue:work 之类的长任务进程,你必须在收到 SIGTERM 信号后主动退出循环。 在 PHP 代码中(QueueWorker)需要监听 SIGTERM,PDB 触发排空时会发送 SIGTERM,代码要响应并退出,否则会被强制 SIGKILL。


运维操作(实操命令)

配置好 PDB 后,你只需要在维护节点时执行:

# 排空节点 (K8s 会自动检查 PDB 并阻塞或延迟重启)
kubectl drain node-01 --ignore-daemonsets
# 查看 PDB 状态
kubectl get pdb php-app-pdb -n production
# 查看详细的当前状态
kubectl describe pdb php-app-pdb -n production

PHP 与 PDB 的关系

步骤 操作位置 说明
配置 PDB Kubernetes YAML 文件 通过 minAvailable 或 maxUnavailable 约束
代码配合 PHP 侧(非必须) 必须处理信号,确保优雅退出(否则会断开请求)
业务场景 日常容器化部署 保护 PHP 服务在节点升级时不出现 503 报错

如果你是在问 “PHP 代码中如何通过 SDK 操作 K8s API 创建 PDB”(例如用 KubePHP 或 Symfony Kubernetes 组件),可以用 HTTP 请求访问 K8s API 的 /apis/policy/v1/namespaces/{namespace}/poddisruptionbudgets 端点,配置 JSON 内容即可,但大多数情况下,直接写 YAML 通过 kubectl apply 更加推荐,不需要让 PHP 参与基础设施的管理。

抱歉,评论功能暂时关闭!

友情链接攻略窝 · 礼包窝 · 配置窝 · 换算窝 · 算法窝 · 查文窝 · 手册窝 · 问答窝 · 全文搜 · 手册库
相关站点礼包窝 · 查文窝