PHP 怎么Pod中断预算

wen PHP项目 3

本文目录导读:

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: 3maxUnavailable: 1,K8s 在进行节点排空(kubectl drain)时,最多只会同时终止 1 个 PHP Pod。
  • 警告replicas: 1maxUnavailable: 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 文件 通过 minAvailablemaxUnavailable 约束
代码配合 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 参与基础设施的管理。

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