通过 ssh 堡垒主机使用 kubectl 从 bitbucket 管道部署
Use kubectl via ssh bastion host do deploy from bitbucket pipelines
我们有两个 GKE 私有集群,只能通过 ssh 代理访问。
在本地环境中,这是这样工作的:
打开8888端口转发到堡垒机的ssh连接
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
本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 的推荐方法是:
- 创建一个 Service Account , and refer to this 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 and Get started with Bitbucket-pipeline了解更多信息。
我们有两个 GKE 私有集群,只能通过 ssh 代理访问。
在本地环境中,这是这样工作的:
打开8888端口转发到堡垒机的ssh连接
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
本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 的推荐方法是:
- 创建一个 Service Account , and refer to this 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 and Get started with Bitbucket-pipeline了解更多信息。