我正在通过调用rest API在kubernetes环境中创建一个docker容器(使用docker run)。
我已经安装了主机的docker.sock,并且正在构建映像并从RESTAPI运行该映像。.
现在,我需要从实际上由Kubectl从Deployment.yml文件启动的其他某个容器连接到该容器。
但是,当使用kubeclt描述pod(Pod名称)时,我的容器不是使用Rest API创建的。.因此,该容器在哪里运行以及如何从其他容器连接到它?
答案 0 :(得分:1)
您是否在与deploy.yml相同的命名空间中运行容器?检查运行的选项之一-
kubectl get pods --all-namespaces
如果您在那里找不到docker容器,我建议执行以下步骤-
要回答第二个问题,应通过以下格式引用群集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的硬性依赖,因此更易于开发,并且由于可以防止大量动态作业淹没您的集群,因此更易于管理。