【问题标题】:Use kubectl via ssh bastion host do deploy from bitbucket pipelines通过 ssh 堡垒主机使用 kubectl 从 bitbucket 管道进行部署
【发布时间】:2021-11-21 06:36:52
【问题描述】:

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

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

  1. 打开 ssh 连接,端口 8888 转发到堡垒主机
    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

这将返回正在运行的 pod 的列表。

当我们在 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 命令发送到集群?

【问题讨论】:

    标签: ssh google-kubernetes-engine bitbucket-pipelines ssh-tunnel


    【解决方案1】:

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

    1. 创建一个Service Account,并参考这个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 creationGet started with Bitbucket-pipeline 了解更多信息。

    【讨论】:

      【解决方案2】:

      修复此错误不会分配伪终端,因为 stdin 不是终端。执行以下步骤之一:

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

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

      要修复此错误client_loop: send disconnect: Connection reset by peer请按照以下步骤操作:

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

      【讨论】:

      • 不确定您是否理解问题所在,我不希望执行远程命令,我只需要端口 8888 转发工作,因此将kubectl 命令发送到远程目标。跨度>
      • 很遗憾您的解决方案不起作用
      猜你喜欢
      • 2019-01-17
      • 2020-11-11
      • 2018-12-19
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2021-08-17
      • 2020-12-22
      • 1970-01-01
      相关资源
      最近更新 更多