在过去的几年中,我在Docker上进行了很多工作,但是在Kubernetes方面我是一个新手。我从今天开始,与以前使用Docker swarm进行思考的方式相比,我在Pod概念的实用性方面苦苦挣扎。
假设我们有一个包含7台强大机器的集群,并且我拥有以下堆栈:
我使用docker swarm来处理带有节点标签的容器分发,例如我将三台机器和Cassandra容器配置标记为C_HOST,将两台机器和Kafka配置标记为K_HOST,...群部署将正确放置每个容器。
我有以下问题:
与我以前的方法相比(例如简单性),Kubernetes Pod是否带来任何优势?我了解我仍然需要配置标签,如果这样,我看不到吸引力。
配置这些容器的正确方法是什么?是用于Cassandra副本的一个容器,用于Kafka副本的一个容器,用于MyConsumer副本的一个容器以及用于MyProducer的一个容器吗?
答案 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