php - Kubernetes 集群中的 Laravel ENV 变量冲突
问题描述
通过使用 Laravel 框架作为 kubernetes 集群的一部分,我遇到了一个非常具体的案例。这些是必须知道的事实:
- 我创建了一个用于缓存的 Docker 容器,名为
redis
- 我为名为的应用程序创建了一个 Docker 容器
application
- 这两者在 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
解决方案
@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 解析。
推荐阅读
- sql - BigQuery LAST_VALUE 有条件
- html - css 动画使图像超链接不再可点击
- qt - QtProcess 获取输出数据
- mysql - 优化疯狂的 MySQL 查询
- php - 使用 nav_menu_item_id 添加到 Wordpress 菜单 ID
- c# - CefSharp 浏览器未在 C# WinForms 应用程序中触发任何鼠标事件
- typescript - 打字稿:是否可以为单元测试存根声明的函数?
- javascript - 功能未定义,虽然它在 JSFiddle 中工作
- javascript - 文件上传卷曲命令到 XMLHttpRequest Javascript?
- api - 带有子域的 Set-Cookie HTTP 标头