如何SSH到kubernetes集群中的docker容器?

bbs*_*bbs 38 google-compute-engine docker google-cloud-platform kubernetes google-kubernetes-engine

我是Google云平台和Docker的新手,并设置了一个节点集群,制作了一个Dockerfile,用于复制repo并在公共端口上运行Clojure REPL.我可以从我的IDE连接到它并使用我的代码,真棒!

然而,REPL应该通过SSH进行隧道传输,但这是我的问题开始的地方.我找不到一个适合SSH的地方来更改Docker运行REPL的repo:

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

我想通过SSH编辑源文件,但我需要访问docker代码库.我不知道该怎么办.

我知道这不是部署应用程序的典型方式,因此我甚至不确定多个节点是否可以使用修改后的docker代码库(节点是否以某种方式共享JVM?).

具体来说,我的问题是如何通过SSH连接到docker容器来访问代码库?

Ser*_*kov 60

Kubernetes 1.5.0的命令格式:

kubectl exec -it <POD NAME> -c <CONTAINER NAME> bash
Run Code Online (Sandbox Code Playgroud)

  • 效果很好.你可能需要添加-n <NAMESPACE>如果你得到'来自服务器的错误(NotFound):pods"blabla"not found' (4认同)
  • 这可行,只是我必须使用“sh”而不是“bash”。 (2认同)

Yos*_*yts 20

列表实例:

gcloud compute instances list
Run Code Online (Sandbox Code Playgroud)

SSH到实例:

gcloud compute ssh <instance_name> --zone=<instance_zone>
Run Code Online (Sandbox Code Playgroud)

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

sudo docker ps -a
Run Code Online (Sandbox Code Playgroud)

附加到容器:

sudo docker exec -it <container_id> bash  
Run Code Online (Sandbox Code Playgroud)


Nit*_*tin 15

通过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


Joh*_*hee 8

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

kubectl get pods
Run Code Online (Sandbox Code Playgroud)

选择一个豆荚。在上面执行bash会话?:

kubectl exec -it [POD_NAME] -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

或者,在其他名称空间中找到所需的Pod:

kubectl get pods --all-namespaces
Run Code Online (Sandbox Code Playgroud)

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

kubectl exec -it [POD_NAME] --namespace [NAMESPACE] -- /bin/bash
Run Code Online (Sandbox Code Playgroud)

  • `kubectl exec -it [POD_NAME] sh`代替了我 (3认同)

dav*_*wil 7

现有的答案很好,只是想贡献一个非常方便的命令,列出所有 pod 和容器,这样您就可以选择一个插入到命令中kubectl exec

kubectl get pods -o=custom-columns=POD:.metadata.name,CONTAINERS:.spec.containers[*].name
Run Code Online (Sandbox Code Playgroud)

给出这样的输出

POD     CONTAINERS
pod-1   service-1,service-2
pod-2   service-1,service-2
pod-3   service-3
pod-4   service-3
Run Code Online (Sandbox Code Playgroud)

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

kubectl exec -it POD -c CONTAINER /bin/sh
Run Code Online (Sandbox Code Playgroud)

例如service-2pod-2

kubectl exec -it pod-2 -c service-2 /bin/sh
Run Code Online (Sandbox Code Playgroud)

注意:如有必要,请添加-n namespace到上述任何命令中以指定命名空间。


Rob*_*ley 5

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

创建集群时,您需要在Google云项目中配置许多节点VM。如果您查看https://console.cloud.google.com/compute/instances,您应该会看到它们,并且每个人都有一个外部IP地址,您可以使用该地址登录。然后创建到节点VM的ssh隧道,该节点将本地端口转发到Pod IP地址。

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