codeigniter不支持k8s原生部署,迁移本质是将其改造为可容器化、可编排的独立服务单元:需重构入口以支持健康探针、改用环境变量注入配置、日志输出至stdout/stderr、会话存redis、服务调用走http或消息队列,并确保镜像兼容性与dns解析正确。

CodeIgniter 本身不支持 Kubernetes 原生部署,所谓“Kubernetes_CodeIgniter 微服务架构迁移”不是框架能力升级,而是把传统单体 CodeIgniter 应用改造为可容器化、可编排的独立服务单元。关键判断:你不需要改框架,但必须重构部署形态和通信方式。
确认 CodeIgniter 是否真适合作为微服务节点
CodeIgniter 是轻量 MVC 框架,无内置服务发现、熔断、gRPC 或健康检查端点,直接扔进 Kubernetes 容易出问题:
-
index.php入口默认不暴露/healthz或/readyz,K8s 探针会反复重启 Pod - Session 默认写文件或数据库,跨 Pod 时状态不一致,需强制切换到
redis或database驱动并确保连接池稳定 - 配置硬编码在
application/config/下,无法通过Kubernetes ConfigMap或Secret动态注入 - 日志写本地文件(如
application/logs/),会被 Pod 生命周期清空,必须重定向到stdout/stderr
改造入口文件以兼容 K8s 生命周期管理
必须让 index.php 支持探针和信号处理,否则 LivenessProbe 失败导致无限重启:
评估 Kubernetes 集群安全态势,覆盖 RBAC、工作负载安全、网络策略、基础设施即代码(IaC)、运行时监控和密钥管理等 30 项控制项……
- 在
index.php顶部添加简单健康检查路由逻辑(不依赖 CI 路由器):
if ($_SERVER['REQUEST_URI'] === '/healthz') {
header('Content-Type: text/plain');
echo 'OK';
exit(0);
}
if ($_SERVER['REQUEST_URI'] === '/readyz') {
// 可加入 DB 连通性检测
$link = @mysqli_connect($_ENV['DB_HOST'], $_ENV['DB_USER'], $_ENV['DB_PASS']);
echo $link ? 'OK' : 'FAIL';
mysqli_close($link);
exit(0);
}
- 禁用
error_reporting(E_ALL)和display_errors=On,所有错误必须输出到stderr,避免干扰探针响应 - 用
$_ENV替代$config数组硬编码,环境变量由Kubernetes Deployment的envFrom注入
用 Dockerfile 构建可移植镜像(非 Alpine 优先)
CodeIgniter 扩展如 mbstring、gd、pdo_mysql 在 Alpine 上常因 musl libc 缺失符号报错,生产建议用 php:8.1-apache 官方镜像:
- 基础镜像选
php:8.1-apache(非-alpine),兼容扩展多、调试方便 - 复制代码后,显式设置
DocumentRoot /var/www/html/public(假设你已把index.php移到public/目录) - 禁用
.htaccess,改用 Apache<directory></directory>块开启AllowOverride All,否则 CI 路由 404 - 用
chown -R www-data:www-data /var/www/html确保日志和缓存目录可写
服务间调用不能依赖 $this->load->library(),得走 HTTP 或消息队列
微服务意味着拆分后各 CodeIgniter 实例彼此隔离,不能再用本地类加载通信:
- 原
$this->user_model->get_by_id()必须改为调用https://user-service/api/v1/users/123,推荐封装成curl_init()+CURLOPT_TIMEOUT_MS控制超时 - 跨服务鉴权别传 Session ID,改用 JWT(从
Authorization: Bearer xxx解析),密钥从Secret挂载进容器 - 异步任务(如发邮件)不要用
exec(),改用RabbitMQ或Kafka,PHP 客户端用php-amqplib,消费者单独起一个 Job - 注意 DNS:K8s 内部服务名是
user-service.default.svc.cluster.local,不是localhost或127.0.0.1
CodeIgniter 不监听 SIGHUP,ConfigMap 更新后必须滚动重启 Pod;而所有 error_log() 输出若没重定向到 stdout,会被 fluentd 漏采,线上故障时等于“静默崩溃”。










