如何确保只有一个Pod在GKE中的节点上运行?

时间:2019-03-08 16:30:42

标签: kubernetes google-kubernetes-engine

在我的应用程序中,我有一个Rest服务器,该服务器通过命令行在本地与数据库进行交互(这是一个很长的故事)。无论如何,数据库安装在节点上的本地ssd中。我可以保证只有这种类型的Pod才能按计划在节点池中进行,因为我已经污染了节点并为Pod添加了公差。

我想知道的是,如何防止kubernetes在单个节点上调度我的pod的多个实例?我想避免这种情况,因为我希望自己的Pod能够消耗尽可能多的CPU,并且我也不希望多个Pod通过本地ssd进行交互。

如何防止将多个类型的Pod调度到该节点上?我最初是在考虑后台驻留程序设置,但我认为应该将节点池设置为自动扩展,这样当池中有n个节点并请求n + 1个副本时,节点池会自动扩展上。

3 个答案:

答案 0 :(得分:1)

您可以将DaemonsetsnodeSelector 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个副本来修改工作负载,最好使用podAntiAffinitycontrolling 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数量

您可以在创建新集群时设置此限制,但是如果稍后您改变主意,则会受到限制。创建群集时,请在高级设置中找到以下字段。

enter image description here

2。将Pod分配到特定节点并占用所有资源

另一种选择是设置资源请求编号,以使其与节点的资源匹配,并使用nodeSelectorlabels将其分配给给定的节点。

查看this link,了解如何将广告连播分配给特定节点。