PHP配置管理在K8s中怎么用

wen PHP项目 1

本文目录导读:

PHP配置管理在K8s中怎么用

  1. 核心概念:ConfigMap & Secret
  2. 如何修改 php.ini 配置
  3. 管理 PHP-FPM 配置(php-fpm.confpool.d/www.conf
  4. 管理敏感配置(Secret)
  5. 实战:完整 PHP-FPM + Nginx 示例
  6. 最佳实践
  7. 注意事项

在Kubernetes中管理PHP配置,核心是通过 ConfigMapSecret 来实现配置与镜像的解耦,以下是几种常见PHP配置(如 php.ini、环境变量、扩展配置)在K8s中的使用方法。


核心概念:ConfigMap & Secret

  • ConfigMap:存储非敏感的配置数据(如 php.ini、应用配置文件)。
  • Secret:存储敏感数据(如数据库密码、API Key),Base64编码,更安全。
  • Volume 挂载:将配置以文件形式挂载到 Pod 的指定目录(如 /usr/local/etc/php/conf.d/)。
  • 环境变量:通过 envenvFrom 将配置注入容器。

如何修改 php.ini 配置

PHP 官方镜像通常允许通过在 /usr/local/etc/php/conf.d/ 下添加 .ini 文件或 $PHP_INI_DIR/conf.d/ 来覆盖默认配置。

使用 ConfigMap 挂载 php.ini 文件(推荐)

  1. 创建 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
  2. 在 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.confpool.d/www.conf

PHP-FPM 配置通常需要调整进程数、超时等。

  1. 创建 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
  2. 挂载到 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)

示例:数据库密码

  1. 创建 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编码
  2. 在 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

最佳实践

  1. 避免在镜像中硬编码配置,全部通过 ConfigMap/Secret 注入。
  2. 配置文件热更新:ConfigMap 更新后,挂载的文件会自动更新(同步可能有延迟,通常在几秒内),PHP-FPM 可能需要 reload 信号(kill -USR2)或重启 Pod 才能生效。
  3. 不敏感但常变的配置(如功能开关)可使用 ConfigMap。
  4. 敏感配置(密码、Token)必须用 Secret,并开启 RBAC 控制访问。
  5. 分环境管理:为开发、测试、生产创建不同的 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 应用的配置。

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