无法连接到Kubernetes中的容器(通过Rest API创建)

时间:2019-01-13 17:24:04

标签: docker kubernetes google-cloud-platform

我正在通过调用rest API在kubernetes环境中创建一个docker容器(使用docker run)。
我已经安装了主机的docker.sock,并且正在构建映像并从RESTAPI运行该映像。.
现在,我需要从实际上由Kubectl从Deployment.yml文件启动的其他某个容器连接到该容器。
但是,当使用kubeclt描述pod(Pod名称)时,我的容器不是使用Rest API创建的。.因此,该容器在哪里运行以及如何从其他容器连接到它

2 个答案:

答案 0 :(得分:1)

您是否在与deploy.yml相同的命名空间中运行容器?检查运行的选项之一-

kubectl get pods --all-namespaces

如果您在那里找不到docker容器,我建议执行以下步骤-

  1. docker ps -a {验证运行中的docker status}
  2. 确保在安装docker.sock时没有权限错误
  3. 如果出现权限错误,请将特权升级到适当的级别

要回答第二个问题,应通过以下格式引用群集DNS来实现两个容器之间的连接-

"<servicename>.<namespacename>.svc.cluster.local"

我还请您详细说明步骤,代码和错误(如果有),以便我更好地回答问题。

答案 1 :(得分:1)

您可能不应该从Kubernetes的任何地方直接访问Docker API。 Kubernetes将完全不知道您手动docker run(或等效版本)所做的任何事情,并且正如您所注意到的,像kubectl get pods这样的常规管理调用将看不到它。节点接口将无法得知Pod使用的CPU和内存,这可能导致节点被过度利用。 Kubernetes网络环境也相当复杂,除非您知道特定CNI提供程序的详细信息,否则将很难使您的容器完全可访问,更不用说从在其他节点上运行的pod了。

在pod中运行的进程可以access the Kubernetes API directly。该页面指出,所有正式的客户端库都知道其使用的约定。这意味着您应该能够直接创建启动目标Pod的Job和与之连接的Service,并获得与此相关的常规Kubernetes功能。 (例如,servicename.namespacename.svc.cluster.local是一个有效的DNS名称,可以到达连接到该服务的任何Pod。)

您还应该考虑您是否真的需要这种界面。对于许多应用程序来说,部署某种消息队列系统(例如,RabbitMQ)并启动与其连接的工作池也将同样有效。您可以使用“部署”控制工作队列的大小。由于避免了对Kubernetes的硬性依赖,因此更易于开发,并且由于可以防止大量动态作业淹没您的集群,因此更易于管理。