通过 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 端口转发不起作用