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

Posted

技术标签:

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

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

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

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

    在另一个会话中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 命令发送到集群?

【问题讨论】:

【参考方案1】:

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

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

注意:

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

您也可以参考Service account creation 和Get 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_configServerAliveIntervalServerAliveCountMax 将间隔设置为值 60 并尝试ServerAliveInterval 60

【讨论】:

不确定您是否理解问题所在,我不希望执行远程命令,我只需要端口 8888 转发工作,因此将kubectl 命令发送到远程目标。跨度> 很遗憾您的解决方案不起作用

以上是关于通过 ssh 堡垒主机使用 kubectl 从 bitbucket 管道进行部署的主要内容,如果未能解决你的问题,请参考以下文章

如何使用代理跳转(堡垒主机)通过 ssh 隧道连接到 mongodb 服务器

如何通过 ssh 隧道使用 kubectl 通过我的 kubernetes API 访问我的内部 ELB?

通过堡垒主机到 VPC 中的 Elasticsearch 集群的 ssh 端口转发不起作用

从 MySQL 客户端通过 AWS 堡垒主机连接到 MySQL RDS 实例

SSH 隧道到 EKS 上的 FushionAuth

Mobaxterm通过代理方式跳过堡垒机实现远程ssh登录