如何通过 SSH 连接到 Kubernetes 集群中的 docker 容器? [关闭]

Posted

技术标签:

【中文标题】如何通过 SSH 连接到 Kubernetes 集群中的 docker 容器? [关闭]【英文标题】:How to SSH to docker container in kubernetes cluster? [closed] 【发布时间】:2016-11-23 22:57:20 【问题描述】:

我对 Google Cloud 平台和 Docker 还很陌生,我设置了一个节点集群,制作了一个 Dockerfile 来复制一个 repo 并在公共端口上运行 Clojure REPL。我可以从我的 IDE 连接到它并使用我的代码,太棒了!

然而,REPL 可能应该通过 SSH 进行隧道传输,但这是我的问题开始的地方。 我找不到合适的 SSH 位置来更改 Docker 运行 REPL 的存储库:

暴露的 IP 只是暴露了 REPL 服务(正确的 kubernetes 术语?)并且不允许我通过 SSH 进入。 集群主端点也没有,即使我遵循了Adding or removing SSH keys for all of the instances in your project 部分here,它也会给我一个公钥错误。

我想通过 SSH 编辑源文件,但我需要访问 docker 代码仓库。我不知道如何继续。

我知道这并不完全是部署应用程序的典型方式,所以我什至不确定是否可以让多个节点与修改后的 docker 代码库一起工作(节点是否以某种方式共享 JVM?)。

具体来说,我的问题是如何通过 SSH 进入 docker 容器以访问代码库?

【问题讨论】:

【参考方案1】:

对于更新的 Kubernetes 版本,shell 命令应该用 -- 分隔:

kubectl exec -it <POD NAME> -c <CONTAINER NAME> -- bash

请注意bash 需要可用于在容器内执行。对于不同的操作系统风格,您可能需要改用/bin/sh/bin/bash(或其他)。

Kubernetes 1.5.0 的命令格式:

kubectl exec -it <POD NAME> -c <CONTAINER NAME> bash

【讨论】:

效果很好。如果您收到“来自服务器的错误 (NotFound): pods "blabla" not found',您可能需要添加 -n 这行得通,但我必须使用 sh 而不是 bash 这取决于您的容器内有哪个外壳可用。 看来这个选项已经被弃用了。我建议改用这个:kubectl exec --stdin --tty &lt;POD_NAME&gt; -- /bin/bash @spotHound 什么?昨天刚用过,可以分享一下链接吗【参考方案2】:

列出实例:

gcloud compute instances list

SSH 进入实例:

gcloud compute ssh <instance_name> --zone=<instance_zone>

在实例中,列出正在运行的进程及其容器 ID:

sudo docker ps -a

附加到容器:

sudo docker exec -it <container_id> bash  

【讨论】:

谢谢!我有一个gcr.io/cloudsql-docker/gce-proxy 一直无法启动,我正在尝试诊断。我用了docker run -it &lt;image_id&gt; sh,但我需要看看我的坐骑。知道docker run 在节点上的秘密卷参数是什么样的吗? SSH 对我不起作用:$ gcloud compute ssh --zone us-west1-b gke-xxx-default-pool-yyy-3q77 -- ps ssh:连接到主机 35.100.100.10 端口22: 连接超时【参考方案3】:

通过 exec 命令附加到容器的最佳方式。

附加到 docker 运行容器

docker exec -it YOUR_CONTAINER_ID bash

附加到 Kubernetes 运行容器。

kubectl exec -it YOUR_CONTAINER/POD_NAME bash

附加到给定命名空间中运行的 Kubernetes 容器。

kubectl exec -it YOUR_CONTAINER/POD_NAME -n YOUR_NAMESPACE bash

【讨论】:

【参考方案4】:

如果 pod 在您当前的命名空间中,则获取 pod 列表:

kubectl get pods

选择一个吊舱。在其上执行 bash 会话:

kubectl exec -it [POD_NAME] -- /bin/bash

或者,在不同的命名空间中找到您想要的 pod:

kubectl get pods --all-namespaces

选择一个 pod 并在其上执行 bash 会话:

kubectl exec -it [POD_NAME] --namespace [NAMESPACE] -- /bin/bash

【讨论】:

kubectl exec -it [POD_NAME] sh 为我工作 kubectl exec -it [POD_NAME] --namespace [NAMESPACE] -- /bin/bash 为我工作【参考方案5】:

我找不到合适的 SSH 位置来更改 Docker 在其上运行 REPL 的存储库

创建集群时,您会在您的谷歌云项目中配置多个节点虚拟机。如果您查看https://console.cloud.google.com/compute/instances,您应该会看到它们,并且每个都有一个外部 IP 地址,您可以通过 ssh 进入。然后创建一个到节点 VM 的 ssh 隧道,将本地端口转发到 pod IP 地址。

请注意,如果您正在运行 clojure 应用的多个副本,则必须分别连接到每个副本以更新应用。

【讨论】:

【参考方案6】:

现有的答案很棒,只是想提供一个非常方便的命令,列出所有 pod 和容器,因此您可以选择一个插入 kubectl exec 命令。

kubectl get pods -o=custom-columns=POD:.metadata.name,CONTAINERS:.spec.containers[*].name

提供这样的输出

POD     CONTAINERS
pod-1   service-1,service-2
pod-2   service-1,service-2
pod-3   service-3
pod-4   service-3

然后只需插入名称即可 ssh 到任何这些容器中

kubectl exec -it POD -c CONTAINER /bin/sh

例如service-2 in pod-2

kubectl exec -it pod-2 -c service-2 /bin/sh

注意在上述任何命令中添加-n namespace 以在必要时指定命名空间。

【讨论】:

【参考方案7】:

根据您的描述,我相信您正在尝试设置一个基于 Kubernetes 云的开发工作区。这样您就可以使用 pod 或节点或集群的公共 IP 地址通过 SSH 连接到包含您的代码库的 pod,并使用笔记本电脑上的 IDE 编辑 docker 容器/pod 中的代码。

如果您的最终目标是通过远程 SSH 访问您的私有 Kubernetes 集群节点或 pod,那么您有 2 个选项:

选项#1: 在 docker 容器 pod 中安装并运行 OpenSSH 服务器。 SSH 服务器侦听端口 22,您需要将其公开给外部网络。 使用 Kubernetes 服务配置,通过 clusterPort 或 nodePort 服务公开 pod 目标端口 22,如下所示。

参考:https://kubernetes.io/docs/concepts/services-networking/service/

api版本:v1 种类:服务 元数据: 名称:我的 ssh 服务 规格: 类型:节点端口 选择器: 应用程序:我的应用程序 端口: - 端口:22 目标端口:22 节点端口:30022

现在您可以使用 NodeIP(工作节点的公共 IP 地址,例如 34.100.0.1)和 NodePort SSH 到您的 pod,如下所示

ssh 用户@34.10.0.1 -p 30022

这里唯一的问题是您需要使用公共 IP 地址将工作程序节点公开到互联网,以便您可以从网络外部访问您的 pod。通过公共 IP 向 Internet 公开您的节点或集群不是安全最佳做法,因为这会增加您的云的攻击面。

选项 #2: 另一种更好的方法(从安全角度来看)是使用 Kubernetes 集群远程 SSH 访问解决方案,例如 SocketXP,它不需要为您的节点或集群分配任何公共 IP。您可以将集群保留为私有集群。您可以使用 IDE 或其他工具通过 SSH 连接到您的 pod 并访问您的代码库。

参考:https://www.socketxp.com/docs/guide/kubernetes-pod-remote-ssh-access.html

免责声明:我是 SocketXP Kubernetes 远程访问解决方案的创始人。所以我不想在这里详细讨论我的解决方案。如果您需要详细信息和设置说明,可以转到上面的参考链接。

【讨论】:

以上是关于如何通过 SSH 连接到 Kubernetes 集群中的 docker 容器? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何在 kubernetes pod 中正确创建用于创建 SSH 隧道的 sidecar 容器

如何通过 ssh 连接到连接到 *** 的工作笔记本电脑

如何通过 SSH 连接到 MySQL Docker 容器?

如何让 SSH 在 Kubernetes 上运行?

我如何通过 ssh 连接到谷歌合作虚拟机?

如何通过主机从外部通过 SSH 连接到 VirtualBox 来宾? [关闭]