如何在Kitura服务器内获取Kubernetes外部IP地址
我之前在部署Kitura到IBM Kubernetes时也碰到过类似的情况,CloudEnvironment默认返回localhost:8080确实头疼,下面给你几个可行的解决方案:
方案一:通过环境变量覆盖CloudEnvironment的默认URL
CloudEnvironment组件会优先读取前缀为CLOUDENV_的环境变量来覆盖默认配置,所以你可以直接把Kubernetes的外部IP和端口通过环境变量传给Pod:
获取Kubernetes Service的外部IP和端口
先通过kubectl命令拿到你的Service信息:kubectl get service <your-kitura-service-name>在输出里找到
EXTERNAL-IP和PORT(S)字段,比如123.45.67.89:8080。修改Kubernetes Deployment配置
在你的Deployment YAML文件里,给容器添加环境变量CLOUDENV_URL,值为你的外部IP地址:spec: containers: - name: kitura-app-container image: <your-kitura-docker-image> env: - name: CLOUDENV_URL value: "http://123.45.67.89:8080"这样CloudEnvironment的
cloudEnv.url就会读取这个值,拼接/callback后就是你需要的真实地址了。
方案二:直接读取自定义环境变量(不依赖CloudEnvironment)
如果觉得CloudEnvironment的配置不够灵活,你可以直接在代码里读取自定义的环境变量:
在Deployment里注入自定义环境变量
同样在Deployment YAML里添加:env: - name: EXTERNAL_APP_URL value: "http://123.45.67.89:8080"在Kitura代码里获取该变量
替换原来的cloudEnv.url逻辑:let externalUrl = ProcessInfo.processInfo.environment["EXTERNAL_APP_URL"] ?? "http://localhost:8080" let callbackUrl = externalUrl + "/callback"这个方法更直接,不用依赖CloudEnvironment的默认行为。
为什么会出现localhost:8080?
CloudEnvironment在本地开发环境或者没有检测到服务绑定(比如Kubernetes里默认没有配置相关服务实例)时,会默认使用localhost:8080作为应用的URL。Kubernetes本身不会自动把外部IP注入到CloudEnvironment的配置里,所以需要我们手动通过环境变量传递。
内容的提问来源于stack exchange,提问作者Stanislav Goryachev

