Kubernetes pod 无法访问本地主机资源,但可以使用curl

问题描述 投票:0回答:1

我在AWS Kubernates上部署了一个用node.js开发的API服务。 API 服务还公开包含图像的文件夹的静态路径。 但该服务无法从本地主机获取图像。

获取图像的服务,使用request库,我无法更改它,并执行以下函数:

function(img, url, callback) { 

            var requestOpts = {
                url: url,
                method: 'GET',
                encoding: null,
                gzip:true
            };

            request(requestOpts, function (err, response, body) {
                if (!err && response.statusCode === 200) {
                    img.onload = function() {
                        callback(null);
                    };
                    img.onerror = function() {
                        callback(new Error('Could not load marker-file image: ' + url));
                    };
                    img.src = body;
                } else {
                    callback(new Error('Could not load marker-file image: ' + url));
                }
            });
}

服务始终如一

Couldn't get marker-file http://127.0.0.1:4000/images/myimage.png

在 POD 的 shell 中,我们尝试获取 CURL

curl http://127.0.0.1:4000/images/myimage.png

并且有效,

还尝试测试节点是否可以解析 localhost url

dns.resolve4("127.0.0.1",console.log)
又有效了

可以从外部访问该服务,如果我尝试从外部 DNS 获取图像

https://my-website.com/images/myimage.png我可以看到我的图像,但 API 服务看不到

我还尝试更改服务可以从中获取图像的 URL,但没有成功

  • http://127.0.0.1:4000/images/myimage.png,
  • https://my-website.com/images/myimage.png
我在本地使用 minikube 尝试了该服务,它可以毫无问题地提供图像。

我想了解如何让该服务在 K8s 内将图像本地化。

感谢您的帮助

node.js kubernetes service localhost amazon-eks
1个回答
0
投票
为了找到解决方案,我们使用 Kubernetes IDE(Lens)连接到 POD 的 shell,然后使用

node 命令启动了 node.js

    我们尝试使用 fs 库获取图像,我们看到 Node.js 能够获取图像
fs = require('fs') fs.readFile('/var/www/mysite/images/myimage.png', 'utf8', function (err,data) { if (err) { return console.log(err); } console.log(data); });

    因此,我们创建了使用请求库的原始函数的简化版本:从本地主机获取图像
var request = require('request') var img = null; var requestOpts = { url: "http://127.0.0.1:4000/images/myimage.png", method: 'GET', encoding: null, // if you expect binary data, you should set encoding: null gzip: true }; request(requestOpts, function (err, response, body) { if (!err && response.statusCode === 200) { img = body; } else { console.log(new Error('Could not load marker-file image: ' + JSON.stringify(url))); } });
此时,库返回错误“无法加载标记文件图像”,并在控制台中滚动错误,我们发现了带有“http_proxy”的 Url 部分。
这有助于我们了解 Docker 配置中存在一些错误:

FROM node:10-slim ... ENV HTTP_PROXY="http://proxy-aws:8080" ... ENTRYPOINT ["node", "index.js"]
    
© www.soinside.com 2019 - 2024. All rights reserved.