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

时间:2016-07-20 16:18:20

标签: docker google-compute-engine kubernetes google-cloud-platform 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部分here,也会出现公钥错误。

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

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

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

7 个答案:

答案 0 :(得分:54)

Kubernetes 1.5.0的命令格式:

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

答案 1 :(得分:19)

列出实例:

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  

答案 2 :(得分:14)

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

附加到docker running container

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

答案 3 :(得分:3)

  

我无法找到合适的SSH地点来更改Docker运行REPL的仓库

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

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

答案 4 :(得分:2)

如果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

答案 5 :(得分:2)

现有的答案很好,只是想提供一个非常方便的命令来列出所有容器和容器,因此您可以选择一个插入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中的pod-2

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

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

答案 6 :(得分:0)

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

如果您的最终目标是获得对私有 Kubernetes 集群节点或 Pod 的远程 SSH 访问,那么您有两个选择:

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

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

apiVersion: v1
kind: Service
metadata:
  name: my-ssh-service
spec:
  type: NodePort
  selector:
    app: MyApp
  ports:
    - port: 22
      targetPort: 22
      nodePort: 30022

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

ssh user@34.10.0.1 -p 30022

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

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

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

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