本文目录导读:

- 核心概念:ConfigMap & Secret
- 如何修改
php.ini配置 - 管理 PHP-FPM 配置(
php-fpm.conf或pool.d/www.conf) - 管理敏感配置(Secret)
- 实战:完整 PHP-FPM + Nginx 示例
- 最佳实践
- 注意事项
在Kubernetes中管理PHP配置,核心是通过 ConfigMap 和 Secret 来实现配置与镜像的解耦,以下是几种常见PHP配置(如 php.ini、环境变量、扩展配置)在K8s中的使用方法。
核心概念:ConfigMap & Secret
- ConfigMap:存储非敏感的配置数据(如
php.ini、应用配置文件)。 - Secret:存储敏感数据(如数据库密码、API Key),Base64编码,更安全。
- Volume 挂载:将配置以文件形式挂载到 Pod 的指定目录(如
/usr/local/etc/php/conf.d/)。 - 环境变量:通过
env或envFrom将配置注入容器。
如何修改 php.ini 配置
PHP 官方镜像通常允许通过在 /usr/local/etc/php/conf.d/ 下添加 .ini 文件或 $PHP_INI_DIR/conf.d/ 来覆盖默认配置。
使用 ConfigMap 挂载 php.ini 文件(推荐)
-
创建 ConfigMap(定义覆盖配置)
# php-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: php-custom-config data: # 文件名必须符合 PHP 加载规则(如 custom.ini) custom.ini: | upload_max_filesize = 50M post_max_size = 50M memory_limit = 256M max_execution_time = 300 date.timezone = Asia/Shanghai opcache.enable=1 opcache.memory_consumption=128 -
在 Deployment 中挂载该 ConfigMap
# deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: php-app spec: replicas: 2 selector: matchLabels: app: php-app template: metadata: labels: app: php-app spec: containers: - name: php-fpm image: php:8.2-fpm-alpine # 挂载配置 volumeMounts: - name: php-ini mountPath: /usr/local/etc/php/conf.d/custom.ini subPath: custom.ini # 只挂载单个文件,避免覆盖整个目录 ports: - containerPort: 9000 volumes: - name: php-ini configMap: name: php-custom-config关键点:
subPath:只挂载单个文件,防止覆盖conf.d/目录下的其他配置文件。mountPath:路径必须正确(根据基础镜像而定,Alpine 通常在/usr/local/etc/php/conf.d/)。
通过环境变量注入 PHP 配置
适合少量、动态的配置:
env: - name: PHP_MEMORY_LIMIT value: "512M" - name: PHP_UPLOAD_MAX_FILESIZE value: "100M"
然后在 PHP 应用中通过 getenv('PHP_MEMORY_LIMIT') 读取,但这种方式不直接修改 php.ini,通常用于应用级配置而非PHP内核设置。
管理 PHP-FPM 配置(php-fpm.conf 或 pool.d/www.conf)
PHP-FPM 配置通常需要调整进程数、超时等。
-
创建 ConfigMap(定义
www.conf)apiVersion: v1 kind: ConfigMap metadata: name: php-fpm-pool-config data: www.conf: | [www] user = www-data group = www-data listen = 0.0.0.0:9000 pm = dynamic pm.max_children = 50 pm.start_servers = 10 pm.min_spare_servers = 5 pm.max_spare_servers = 20 request_terminate_timeout = 300 -
挂载到 Pod 的 FPM 配置目录(通常为
/usr/local/etc/php-fpm.d/)volumeMounts: - name: fpm-pool mountPath: /usr/local/etc/php-fpm.d/www.conf subPath: www.conf
管理敏感配置(Secret)
示例:数据库密码
-
创建 Secret
kubectl create secret generic db-secret \ --from-literal=DB_HOST=mysql-service \ --from-literal=DB_USER=app \ --from-literal=DB_PASSWORD=s3cretPass
或使用 YAML:
apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: DB_PASSWORD: czNyY3JldFBhc3M= # base64编码
-
在 Pod 中引用
-
作为环境变量
env: - name: DB_HOST value: "mysql-service" - name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: DB_PASSWORD -
作为文件挂载(适合复杂配置文件如
config.php)volumeMounts: - name: app-config mountPath: /var/www/html/config.php subPath: config.php volumes: - name: app-config secret: secretName: app-secret
-
实战:完整 PHP-FPM + Nginx 示例
假设需要调整 PHP 上传大小和 FPM 进程数:
# deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-nginx-app
spec:
replicas: 3
selector:
matchLabels:
app: php-app
template:
metadata:
labels:
app: php-app
spec:
containers:
- name: nginx
image: nginx:alpine
volumeMounts:
- name: nginx-config
mountPath: /etc/nginx/conf.d/default.conf
subPath: default.conf
- name: shared-files
mountPath: /var/www/html
ports:
- containerPort: 80
- name: php-fpm
image: php:8.2-fpm-alpine
volumeMounts:
- name: php-ini-custom
mountPath: /usr/local/etc/php/conf.d/custom.ini
subPath: custom.ini
- name: php-fpm-pool
mountPath: /usr/local/etc/php-fpm.d/www.conf
subPath: www.conf
- name: db-secret
mountPath: /var/run/secrets/db
readOnly: true
- name: shared-files
mountPath: /var/www/html
volumes:
- name: php-ini-custom
configMap:
name: php-custom-config # 包含 custom.ini
- name: php-fpm-pool
configMap:
name: php-fpm-pool-config # 包含 www.conf
- name: db-secret
secret:
secretName: db-secret
- name: shared-files
emptyDir: {}
- name: nginx-config
configMap:
name: nginx-config
最佳实践
- 避免在镜像中硬编码配置,全部通过 ConfigMap/Secret 注入。
- 配置文件热更新:ConfigMap 更新后,挂载的文件会自动更新(同步可能有延迟,通常在几秒内),PHP-FPM 可能需要
reload信号(kill -USR2)或重启 Pod 才能生效。 - 不敏感但常变的配置(如功能开关)可使用 ConfigMap。
- 敏感配置(密码、Token)必须用 Secret,并开启 RBAC 控制访问。
- 分环境管理:为开发、测试、生产创建不同的 ConfigMap/Secret。
注意事项
- 路径前缀:PHP 镜像的配置目录可能不同(
/usr/local/etc/php/vs/etc/php/),请通过php -i | grep php.ini确认。 - subPath 与目录挂载:使用
subPath时,文件不会随 ConfigMap 更新而自动同步(需要重启 Pod),如果需要动态更新,建议挂载整个目录(mountPath: /usr/local/etc/php/conf.d/并去掉subPath),但这样会覆盖该目录下所有文件。 - 权限:确保 PHP-FPM 用户(如
www-data)有读取配置文件的权限。
通过以上方式,可以灵活、安全地在 Kubernetes 中管理 PHP 应用的配置。