我是Google云平台和Docker的新手,并设置了一个节点集群,制作了一个Dockerfile,用于复制repo并在公共端口上运行Clojure REPL。我可以从我的IDE连接到它并使用我的代码,真棒!
然而,REPL应该通过SSH进行隧道传输,但这是我的问题开始的地方。 我找不到合适的SSH进入的地方来更改Docker运行REPL的repo:
Adding or removing SSH keys for all of the instances in your project
部分here,也会出现公钥错误。我想通过SSH编辑源文件,但我需要访问docker代码库。我不知道该怎么办。
我知道这不是部署应用程序的典型方式,因此我甚至不确定多个节点是否可以使用修改后的docker代码库(节点是否以某种方式共享JVM?)。
具体来说,我的问题是如何通过SSH连接到docker容器来访问代码库?
答案 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 远程访问解决方案的创始人。所以我不想在这里详细讨论我的解决方案。如果您需要详细信息和设置说明,可以转到上面的参考链接。