node.js - Kubernetes Websockets API pod exec node.js 客户端发送方法

标签 node.js websocket kubernetes

我很难使用 node.js websockets 向交互式 bash shell 发送命令客户。我正在使用 kops 运行集群,并且能够与 pod 建立连接并获得提示,但我无法发送命令并接收响应。

所以我的连接看起来像:

const WebSocket = require('ws');
const fs = require('fs');
const readline = require('readline');
const unescape = require('querystring').unescape;
const escape = require('querystring').escape;

const channel = '0';
const access_token = "[the_api_token]";
const pod_name = 'nginx-726417742-s1nv2';
const host_address = 'wss://[the_api_url]';
const cmd = `${escape('/bin/bash')}&command=-i`;
const params = `stdout=1&stdin=1&stderr=1&tty=1&container=nginx&command=${cmd}`;
const url = `${host_address}/api/v1/namespaces/default/pods/${pod_name}/exec?${params}`;
const options = {
  headers: {
    'Authorization': `Bearer ${access_token}`
  },
  ca: fs.readFileSync('ca.crt'),
}
const ws = new WebSocket(url, options);
ws.on('open', () => {
  console.log('connected');
});
ws.on('message', (data, flags) => {
  process.stdout.write(data);
});
const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout
});
rl.on('line', function (cmd) {
  const data = channel + cmd;
  if (ws && ws.readyState === 1) {
    ws.send(data);
  }
});
ws.on('message', (data, flags)部分完美打印 shell 提示 root@nginx-726417742-s1nv2:/#但是我可以输入任何内容,然后它就会进入 ws.send(data)但没有收到任何消息,也没有产生错误。我已经尝试将数据转换为 base64 并逐个字符而不是整行发送字符,但结果和行为始终相同。

如果我通过 kubectl proxy --disable-filter=true --port=8080 代理 API并使用 https://github.com/kubernetes-ui/container-terminal指向ws://localhost:8080并使用 /api/v1/namespaces/default/pods/${pod_name}/exec我可以获得一个工作终端,但本地代理不是我的选择。

任何帮助都感激不尽。

最佳答案

我知道我的回答来晚了。但也许我可以帮助其他人。我注意到,在使用 websocket 时,Kubernetes API 通常需要设置一个来源。否则 API 有时会返回奇怪的错误。在您的情况下,您可以尝试如下完成您的选项:

const options = {
  headers: {
    'Authorization': `Bearer ${access_token}`
  },
  ca: fs.readFileSync('ca.crt'),
  origin: 'https://<the_api_url>:<port>'
}
此外,我认为不需要设置 wss作为协议(protocol)(在您的 host_address 变量中)。通常协议(protocol)应该从https自动升级。至wss在连接过程中。

关于node.js - Kubernetes Websockets API pod exec node.js 客户端发送方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47781794/

相关文章:

python - Django 1.10 服务器到服务器 websockets

kubernetes - 如何将Kubernetes集群添加到Spinnaker

javascript - 将 PDF 二进制数据编码为 base64 不适用于 NodeJS

node.js - 在 Nodejs 中使用 postgresql 时,我应该如何从网络服务器查询数据库?

javascript - GET 请求不会仅在 Node.JS 内返回?

javascript - 是否可以通过 URL 从 NPM 下载并安装 JS 文件(不是 NPM 包)?

websocket - 在 AWS ApiGateway 中设置基本的 WebSocket 模拟

ios - 如何使用 webRTC 进行视频聊天

kubernetes - 无法访问 RPI 上运行的 K8 集群中的 NGINX nodePort 服务

amazon-web-services - 如何在具有持久卷的 EKS 集群之上设置可扩展的 Jenkins?