Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何SSH到kubernetes集群中的docker容器?_Docker_Google Compute Engine_Kubernetes_Google Cloud Platform_Google Kubernetes Engine - Fatal编程技术网

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

如何SSH到kubernetes集群中的docker容器?,docker,google-compute-engine,kubernetes,google-cloud-platform,google-kubernetes-engine,Docker,Google Compute Engine,Kubernetes,Google Cloud Platform,Google Kubernetes Engine,我对谷歌云平台和Docker是相当陌生的,我建立了一个节点集群,制作了一个Dockerfile来复制repo,并在公共端口上运行Clojure REPL。我可以从我的IDE连接到它,并使用我的代码玩游戏,太棒了 然而,REPL可能应该通过SSH进行隧道传输,但我的问题就从这里开始我找不到合适的地方可以通过SSH进入来更改Docker运行REPL的回购协议: 公开的IP只公开REPL服务(正确的kubernetes术语?),不允许我使用SSH 集群主端点也没有,它会给我一个公钥错误,即使我已经按

我对谷歌云平台和Docker是相当陌生的,我建立了一个节点集群,制作了一个Dockerfile来复制repo,并在公共端口上运行Clojure REPL。我可以从我的IDE连接到它,并使用我的代码玩游戏,太棒了

然而,REPL可能应该通过SSH进行隧道传输,但我的问题就从这里开始我找不到合适的地方可以通过SSH进入来更改Docker运行REPL的回购协议:

  • 公开的IP只公开REPL服务(正确的kubernetes术语?),不允许我使用SSH
  • 集群主端点也没有,它会给我一个公钥错误,即使我已经按照
    为项目中的所有实例添加或删除SSH密钥
我想通过SSH编辑源文件,但我需要访问docker代码repo。我不知道如何继续

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

具体地说,我的问题是如何SSH到docker容器中访问代码库

我找不到一个合适的SSH位置来更改Docker运行REPL的repo

当您创建集群时,您将在您的google cloud项目中提供许多节点VM。如果您查看,您应该会看到它们,并且每个都有一个外部IP地址,您可以通过ssh将其连接到其中。然后创建到节点VM的ssh隧道,该节点VM将本地端口转发到pod IP地址


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

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

连接到docker运行容器

docker exec -it YOUR_CONTAINER_ID bash docker exec-它是您的容器ID bash 连接到Kubernetes运行容器

kubectl exec -it YOUR_CONTAINER/POD_NAME bash kubectl exec-它是您的容器/容器名称bash 附加到给定命名空间中运行容器的Kubernetes

kubectl exec -it YOUR_CONTAINER/POD_NAME -n YOUR_NAMESPACE bash kubectl exec-它是您的容器/容器名称-n您的名称空间bash列出实例:

gcloud compute instances list
SSH到实例:

gcloud compute ssh <instance_name> --zone=<instance_zone>
附在容器上:

sudo docker exec -it <container_id> bash  
sudo docker exec-it bash

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


如果pod位于当前命名空间中,请获取pod列表:

kubectl get pods
挑一个豆荚。在其上执行bash会话:

kubectl exec -it [POD_NAME] -- /bin/bash
kubectl exec -it [POD_NAME] --namespace [NAMESPACE] -- /bin/bash
或者,在不同的命名空间中查找所需的pod:

kubectl get pods --all-namespaces
选择一个pod并在其上执行bash会话:

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

现有的答案很好,只是想提供一个非常方便的命令,列出所有的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
e、 g.
service-2
in
pod-2

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

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

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

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

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

参考:

版本:v1 种类:服务 元数据: 名称:我的ssh服务 规格: 类型:节点端口 选择器: 应用程序:MyApp 端口: -港口:22 目标港:22 节点端口:30022 现在,您可以使用NodeIP(工作节点的公共IP地址,比如34.100.0.1)和NodePort通过SSH连接到pod中,如下所示

ssh user@34.10.0.1 -p 30022 sshuser@34.10.0.1-第30022页 这里唯一需要注意的是,您需要使用公共IP地址将您的工作节点公开到internet,以便可以从网络外部访问您的pod。通过公共IP向internet公开节点或群集不是安全最佳做法,因为这会增加云的攻击面

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

参考:


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

谢谢!我有一个
gcr.io/cloudsqldocker/gce代理一直无法启动,我正在尝试诊断。我使用了docker run-it sh
,但我需要查看我的坐骑。知道docker运行的卷参数在节点上的秘密是什么样子吗?SSH对我不起作用:$gcloud compute SSH--zone us-west1-b gke-xxx-default-pool-yyy-3q77--ps SSH:connect to host 35.100.100.10端口22:Connection timed outWorks很棒。如果你得到'Error from server(NotFound)'pods“blabla”NotFound'就可能需要添加-n,除非我不得不使用
sh
而不是
bash
。这取决于你的容器中有哪个外壳可用。看起来 apiVersion: v1 kind: Service metadata: name: my-ssh-service spec: type: NodePort selector: app: MyApp ports: - port: 22 targetPort: 22 nodePort: 30022 ssh user@34.10.0.1 -p 30022