Kubernetes荚分发

时间:2019-03-01 12:32:26

标签: docker kubernetes docker-swarm

在过去的几年中,我在Docker上进行了很多工作,但是在Kubernetes方面我是一个新手。我从今天开始,与以前使用Docker swarm进行思考的方式相比,我在Pod概念的实用性方面苦苦挣扎。

假设我们有一个包含7台强大机器的集群,并且我拥有以下堆栈:

  • 我想要三个Cassandra副本,每个副本都在专用计算机(3/7)中运行
  • 我想要两个分别在专用计算机(5/7)中运行的Kafka副本
  • 我想要一个MyProducer副本在自己的计算机上运行,​​从网络上接收消息并将其推送到Kafka(6/7)
  • 我想要3个MyConsumer副本全部在最后一台计算机(7/7)中运行,它们从Kafka中拉出并插入Cassandra中。

我使用docker swarm来处理带有节点标签的容器分发,例如我将三台机器和Cassandra容器配置标记为C_HOST,将两台机器和Kafka配置标记为K_HOST,...群部署将正确放置每个容器。

我有以下问题:

  • 与我以前的方法相比(例如简单性),Kubernetes Pod是否带来任何优势?我了解我仍然需要配置标签,如果这样,我看不到吸引力。

  • 配置这些容器的正确方法是什么?是用于Cassandra副本的一个容器,用于Kafka副本的一个容器,用于MyConsumer副本的一个容器以及用于MyProducer的一个容器吗?

2 个答案:

答案 0 :(得分:2)

您仍然可以使用节点标签并使用nodeSelector参数。

  

您可以使用kubectl添加节点标签...

     

kubectl label nodes <node-name> <label-key>=<label-value>为您选择的节点添加标签。

但是更高级的方法是使用affinity进行广告连播分发...

答案 1 :(得分:2)

使用pod亲和力,可以确保一个pod与其他带有特定标签的pod不在同一位置。

所以说您有一个标签“ app”,其值为“ cassandra”,“ kafka”,“ my-producer”和“ my-consumer”。

由于您希望自己在专用节点上都拥有cassandra,kafka和my-producer,因此您只需为所有现有标签配置反亲和力即可:

(有关完整架构,请参见https://kubernetes.io/docs/concepts/configuration/assign-pod-node/

app.use(express.json());
app.use(express.urlencoded({ extended: false }));

这是针对“ Pod”资源的,因此您可以在Pod模板的部署中(也定义多少个副本)进行定义。

由于您要让我的消费者的三个实例在同一节点上运行(或者实际上,您不在乎它们在哪里运行,因为到目前为止只剩下一个节点),因此您无需定义任何有关亲和性或反亲和力:

  podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
      matchExpressions:
      - key: app
        operator: In
        values:
        - cassandra
        - kafka
        - my-producer
        - my-consumer