在我的应用程序中,我有一个Rest服务器,该服务器通过命令行在本地与数据库进行交互(这是一个很长的故事)。无论如何,数据库安装在节点上的本地ssd中。我可以保证只有这种类型的Pod才能按计划在节点池中进行,因为我已经污染了节点并为Pod添加了公差。
我想知道的是,如何防止kubernetes在单个节点上调度我的pod的多个实例?我想避免这种情况,因为我希望自己的Pod能够消耗尽可能多的CPU,并且我也不希望多个Pod通过本地ssd进行交互。
如何防止将多个类型的Pod调度到该节点上?我最初是在考虑后台驻留程序设置,但我认为应该将节点池设置为自动扩展,这样当池中有n个节点并请求n + 1个副本时,节点池会自动扩展上。
答案 0 :(得分:1)
您可以将Daemonsets
与nodeSelector
or affinity
结合使用。另外,您可以在Pod
上配置podAntiAffinity
,例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: rest-server
spec:
selector:
matchLabels:
app: rest-server
replicas: 3
template:
metadata:
labels:
app: rest-server
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- rest-server
topologyKey: "kubernetes.io/hostname"
containers:
- name: rest-server
image: nginx:1.12-alpine
答案 1 :(得分:1)
取决于您要实现的目标,DaemonSets可能不是一个完整的答案,因为DaemonSet不会自动缩放,它只会将Pod放置在新节点中;当您向池中添加新节点时。
如果您希望使用n + 1个副本来修改工作负载,最好使用podAntiAffinity,controlling scheduling with node taints和集群autoscaler;这样可以保证在增加Pod时将添加一个新节点,而在按比例缩小Pod时将删除一个新节点:
apiVersion: v1
kind: ReplicationController
metadata:
name: echoheaders
spec:
replicas: 1
template:
metadata:
labels:
app: echoheaders
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- echoheaders
topologyKey: "kubernetes.io/hostname"
containers:
- name: echoheaders
image: k8s.gcr.io/echoserver:1.4
ports:
- containerPort: 8080
tolerations:
- key: dedicated
operator: Equal
value: experimental
effect: NoSchedule
答案 2 :(得分:0)
我可以提出两种解决方法。一种是限制节点上可调度的Pod的数量,另一种是在请求节点中所有可用资源的同时,将Pod分配给给定节点。
1。限制每个节点的可调度Pod数量
您可以在创建新集群时设置此限制,但是如果稍后您改变主意,则会受到限制。创建群集时,请在高级设置中找到以下字段。
2。将Pod分配到特定节点并占用所有资源
另一种选择是设置资源请求编号,以使其与节点的资源匹配,并使用nodeSelector
和labels
将其分配给给定的节点。
查看this link,了解如何将广告连播分配给特定节点。