首页 > 解决方案 > Kubernetes 集群中的 Laravel ENV 变量冲突

问题描述

通过使用 Laravel 框架作为 kubernetes 集群的一部分,我遇到了一个非常具体的案例。这些是必须知道的事实:

Kubernetes 在每个 Docker 容器中设置 ENV 变量。通常,一个称为{container-name}_PORT. 因此,KubernetesREDIS_PORT在我的application容器中创建了 ENV 变量,该变量设置为:tcp://{redis-container-ip}:{redis-container-port}.

Laravel 也设置了这个 ENV 变量,但将其用作独立的端口变量,例如6379. 但是,在这种特定情况下,Redis 在 Laravel 中不起作用,因为REDIS_PORT变量被覆盖。框架尝试在 Kubernetes 内的这个示例主机字符串上获取 redis tcp://redis:tcp://10.7.240.204:6379:。Laravel 背后的逻辑:{scheme}://{REDIS_HOST}:{REDIS_PORT}. 可以看到,REDIS_PORT充满了tcp://10.7.240.204:6379

解决问题的最佳方法是什么?

在我看来,Kubernetes 使用 ENV 变量的{container-name}_PORT方式是错误的,但我确实理解 Kubernetes ENV 变量背后的内部逻辑。

目前,我已经更改config/database.php了 Laravel 中的配置,但这会导致每次更新时都要查看更改日志。

其他一些细节可以在这里阅读:https ://github.com/laravel/framework/issues/24999

标签: phplaraveldockerrediskubernetes

解决方案


@Florian在 github 上给自己的回复:

我的解决方案是config/database.php像这样更改配置:

'redis' => [

    'client' => 'predis',

    'default' => [
        'scheme' => 'tcp',
        'host' => env('REDIS_SERVICE_HOST', env('REDIS_HOST','127.0.0.1')),
        'port' => env('REDIS_SERVICE_PORT', env('REDIS_PORT',6379)),
        'password' => env('REDIS_PASSWORD', null),
        'database' => 0,
    ],

],

现在,配置首先检查 REDIS_SERVICE_HOST 和 REDIS_SERVICE_PORT 是否作为 ENV 变量存在。如果您在 docker/kubernetes 集群中有一个称为 REDIS 的容器,就是这种情况。

此解决方案的优点是 REDIS_SERVICE_HOST 返回容器的 IP 地址,而不是主机名。因此,此内部连接不再有 dns 解析。


推荐阅读