本文目录导读:

在 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 参与基础设施的管理。