【问题标题】:Run Docker Containers on Different Machines with Kubernetes使用 Kubernetes 在不同的机器上运行 Docker 容器
【发布时间】:2018-08-07 19:16:16
【问题描述】:

Kubernetes 新手,但想在不同机器上快速运行一些 Docker 容器,例如,节点 1(物理机 1)上的容器 1、2 和 3 以及节点 2(物理机 2)上的容器 4、5 和 6 .有人可以帮助我使用配置文件和命令来启动并运行它,并且所有容器都可以相互通信吗?

我在https://gettech1.wordpress.com/2016/10/03/kubernetes-forcefully-run-pod-on-specific-node/ 中找到了我想要的示例,但只有一个 pod。如何使用两个 pod(假设我可以在每个 pod 中添加更多容器)并在一个部署中一起运行两个 pod(以便容器在同一个网络中,因此可以相互通信)?

我还想运行一个带有“共享”绑定传播的绑定挂载的 Docker 容器,我该如何指定它?

就个人而言,我发现 Kubernetes 文档在相互引用的概念层中有点难以浏览。任何人都可以指出一个干净的教程也会有所帮助。我想学习如何在多台机器上运行容器,然后如何通过在 pod 中添加更多容器、在节点上添加更多 pod 以及在集群中添加更多节点来自动扩展。然后是不同类型的网络和卷管理。

【问题讨论】:

  • 这是一个很好的问题,因为它表明了一些概念上的混乱。听起来在问题中应该用术语 pod 代替术语容器。 Pod 是调度单元,而不是单个容器。容器可以通过多种方式与其他容器通信 - 例如通过服务名称 - 即使它们没有一起打包在同一个 pod 中。看起来 k8s 只支持 rshared 绑定传播,不支持共享。一些背景:medium.com/kokster/kubernetes-mount-propagation-5306c36a4a2d
  • 也许将绑定挂载部分拆分为一个单独的问题?
  • 这是我的困惑,在 Kubernetes 文档前面有点无能为力。我的理解是,一个 Pod 可以有多个容器,但不能跨节点(物理机)。首先,我只想配置 Pod1(容器 1、2 和 3)在 Node1 上运行,Pod2(容器 4、5 和 6)在 Node2 上运行,并让所有这些容器能够通信彼此,但我只是找不到一个简单的例子来说明如何做到这一点。我可以在一台机器上使用 docker-compose 轻松运行这些容器,并且容器之间可以正常通信。
  • @hanaZ 容器 1、2、3 和 4、5、6 之间需要进行什么样的通信?使用http调用每个?还是别的什么?
  • 例如容器1是管理节点,所有其他节点都需要注册。容器 4 服务于元数据,容器 2 和 5 服务于存储,容器 3 和 6 是访问存储的客户端。存储和客户端从管理容器中获取元数据容器的 IP 地址和端口,然后进行元数据查询。客户端也从管理容器中获取存储地址。

标签: docker kubernetes


【解决方案1】:

分配Pods to Nodes 的简单方法是使用label selectors

Labels and Selectors 是您需要在整个 Kubernetes 中理解的概念。

首先给节点添加标签:

kubectl local nodes node-a podwants=somefeatureon-nodea
kubectl local nodes node-b podwants=somefeatureon-nodeb

然后可以在 Pod 定义 spec 中设置 nodeSelector

apiVersion: v1
kind: Pod
metadata:
  name: nginx
  labels:
    app: my-app
spec:
  nodeSelector:
    podwants: somefeatureon-nodea
  container:
    - name: nginx
      image: nginx:1.8
      ports:
      - containerPort: 80

Pod 将始终位于 Kubernetes 中,Pod 中的容器都将能够相互访问,PodPod 的通信是通过将 Pod 暴露为Service。注意Service 也使用标签选择器来查找它的Pods

kind: Service
apiVersion: v1
metadata:
  name: web-svc
spec:
  selector:
    app: my-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80

然后您可以通过环境变量在其他Podsdiscover the available Services,如果您的集群中有added CoreDNS,则可以通过DNS。

 WEB_SVC_SERVICE_HOST=x.x.x.x
 WEB_SVC_SERVICE_PORT=80

您不会经常自己定义和安排Pods。您可能会使用描述您的PodsDeployment 并将帮助您扩展它们。

一旦您了解了简单的案例,文档将继续描述Node affinity,它允许您定义更复杂的规则集。甚至可以根据Pods 当前在Node 上安排的内容做出安排决策。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-07
    • 2019-08-28
    • 2021-08-06
    • 2015-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多