通过 ssh 堡垒主机使用 kubectl 从 bitbucket 管道部署

Use kubectl via ssh bastion host do deploy from bitbucket pipelines

我们有两个 GKE 私有集群,只能通过 ssh 代理访问。

在本地环境中,这是这样工作的:

  1. 打开8888端口转发到堡垒机的ssh连接
    gcloud compute ssh dev-cluster-bastion --project client-dev --zone xxxx -- -L 8888:127.0.0.1:8888

  2. 在另一个会话中
    HTTPS_PROXY=localhost:8888 kubectl get pods

本returns列表运行pods.

当我们在 bitbucket 管道内执行此操作时,ssh 会连接,但随后会关闭并且 kubectl 调用失败。 来自 ssh 连接的消息是:

Pseudo-terminal will not be allocated because stdin is not a terminal

所以端口转发也关闭了。

-fN 添加到 ssh 启动没有帮助,端口转发不起作用。

gcloud compute ssh dev-cluster-bastion --project client-dev --zone xxxx -- -fN -L 8888:127.0.0.1:8888

ssh 然后告诉我 client_loop: send disconnect: Connection reset by peer

知道如何在 bitbucket 管道中打开端口 8888 tcp 隧道,以便我们可以将 kubectl 命令发送到集群吗?

修复此错误伪终端将不会被分配,因为标准输入不是终端。按照以下步骤之一操作:

发生错误是因为您运行使用单个 -t 选项连接 SSH,而 SSH 进程的标准输入不是 TTY。 SSH 在这种情况下专门打印该消息 单个 -t 相当于“RequestTTY yes”,而其中两个相当于“RequestTTY force”。

如果您希望使用 TTY 向 运行 发送远程命令,请指定 -t 两次。如果你这样做,那么在你的命令中而不是 -t 使用 -t -t 或使用 -tt .

要修复此错误 client_loop:发送断开连接:对等方重置连接 请按照以下步骤操作:

你应该在客户端上查看这些参数 边 /etc/ssh/ssh_config
ServerAliveInterval
ServerAliveCountMax
将间隔设置为值 60 并尝试
ServerAliveInterval 60

在非交互式设置(如 Bitbucket 管道、GitHub 操作等)中使用 Google 云 API 的推荐方法是:

  1. 创建一个 Service Account , and refer to this link 用于创建服务帐户。
  2. 为此服务帐户创建密钥文件并下载。创建文件请参考link
  3. 授予此帐户所需的 IAM 权限,以便能够通过 SSH 连接到 Bastion 主机
  4. 使密钥文件可用于管道环境安全地(大多数CI/CD系统允许加密秘密文件或敏感环境变量的方法)
  5. 在管道中,使用 gcloud auth activate-service-account --key-file=... 使 gcloud 使用服务帐户
  6. 现在 运行 gcloud compute ssh 在管道中并像往常一样使用 SSH 端口转发。

注意:

  • 步骤 1.--4。仅限一次;
  • 步骤 5. 和 6. 是管道的一部分,每次管道 运行
  • 时都会 运行
  • 唯一的区别是存在 -fN 标志,它在后台执行 SSH 并使其 运行 在远程主机上没有命令(即只进行端口转发)。

您也可以参考Service account creation and Get started with Bitbucket-pipeline了解更多信息。