如何从我的 Jelastic 环境中查询内部部署的 API?

How can I query an internally deployed API from my Jelastic environment?

我正在编写部署两个节点的 Jelastic 清单。在一个节点上,我有一个 API 需要查询才能设置第二个节点。这些方面的内容:

type: install
name: My test

nodes:
- count: 1
  cloudlets: 4
  nodeGroup: auth
  nodeType: docker
  image: my-api:latest
- count: 1
  cloudlets: 16
  nodeGroup: cp
  nodeType: docker
  image: some-service:latest

onInstall:
  - script: |
      import com.hivext.api.core.utils.Transport;
        
      try {
        const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
            "Authorization": "my-api-key"
        });    
        
        return { result: 0, body: body };
      } catch (e) {
        return {
            type: "error",
            message: "unknown error: " + e
        };
      }

在我的脚本中,当我这样做时

const body = new Transport().get("http://www.google.com"); 

有效,我得到了 google 页面的正文内容。然而,

const body = new Transport().get("http://${nodes.auth.master.intIP}:9011/api/key", {
  "Authorization": "my-api-key"
});

returns

ERROR: script.response: {"type":"error","message":"unknown error: JavaException: java.io.IOException: Failed to select a proxy"}

我做错了什么?如何在上面代码片段中的脚本中查询我的服务?当我 curl 通过常规 cmd 时,它会起作用:

curl -s -H "Authorization: my-api-key" http://${nodes.auth.master.intIP}:9011/api/key

另外,顺便说一句,我在哪里可以找到com.hivext.api.core.utils.Transport的文档?

您无法通过脚本中的内部 IP 访问您的环境节点(至少不能保证)。 作为解决方法,您可以通过 public IP or endpoint 访问您的节点。 如果 public IP 或端点不适用于您的情况,并且您的服务只能在内部访问,您可以尝试通过 curl 和 ExecCmd API 访问您的节点。例如:

type: install
name: My test

nodes:
- count: 1
  cloudlets: 4
  nodeGroup: auth
  nodeType: docker
  image: my-api:latest
- count: 1
  cloudlets: 16
  nodeGroup: cp
  nodeType: docker
  image: some-service:latest
  
onInstall:
  - script: |
      function execInternalApi(nodeId, url) {
        let resp = api.env.control.ExecCmdById({
          envName: '${env.name}', 
          nodeId: nodeId,
          commandList: toJSON([{
            command: 'curl -fSsl -H "Authorization: my-api-key" \'' + url + '\''
          }])
        })
        
        if (resp.result != 0) return resp
        
        return { result: 0, out: resp.responses[0].out }
      }
      
      let body = execInternalApi(${nodes.auth.master.id}, 'http://localhost:9011/api/key');
      
      return { result: 0, body: body };