Kubernetes assign pods to pool

时间:2016-10-20 12:46:28

标签: kubernetes gcloud kubectl

is there a way to tell kubectl that my pods should only deployed on a certain instance pool?

For example:

nodeSelector:
      pool: poolname

Assumed i created already my pool with something like:

gcloud container node-pools create poolname --cluster=cluster-1 --num-nodes=10 --machine-type=n1-highmem-32

4 个答案:

答案 0 :(得分:25)

好的,我找到了解决方案:

gcloud为池名称创建标签。在我的清单中,我只是将它放在节点选择器下面。很容易。

这是我的manifest.yaml:我使用kubernetes部署ipyparallel

\d

答案 1 :(得分:2)

您还可以使用污点公差。这样,您不必知道/硬编码特定的池名称,只需简单地将其带有 taint high-cpu。然后,您为豆荚赋予该污渍的容忍度,他们可以在该目标池中进行调度。

这使您可以拥有多个池,或进行HA池部署,在其中可以通过更改池上的污点从一个池迁移到另一个池。

这里的 gotcha 是,尽管容忍度允许Pod在受污染的池上进行调度,但不会阻止它们在其他地方进行调度。因此,您需要用pool-a污染taint-a,并用pool-b污染taint-b,并给pool-apool-b适当的豆荚将它们挡在彼此池外的污点。

答案 2 :(得分:1)

或者两者都做!

  • 使用标签选择要在哪个池上运行
  • 使用污点容差以确保个其他容器不会尝试在此节点池上运行

这意味着您不必不需要对每个池进行污染N容忍(例如,如果您有一个“默认池”,则您希望默认情况下运行该程序(即,如果用户不执行任何操作)对于他们的豆荚来说很特殊,他们将在这里部署)和“其他池”以用于更特殊/受限制的用例。

此模型允许Pod在运行时无需对配置进行任何特殊的调整,而不必对所有内容进行n-n容忍,这意味着如果在没有容忍的情况下进行配置,pod将永远不会运行

取决于您/您的用户需求,对所有需求的严格锁定等等。

和往常一样,有多种方法可以将真皮从猫身上剥下来。

答案 3 :(得分:0)

如果您使用的是Digital ocean Kubernetes,则可以访问下面每个节点池的标签。

type GenericType = {
  [key: string]: {
    prop1: string,
    prop2?: string,
    prop3?: number,
  };
};

const enforce = <T extends GenericType>(obj: T): T => obj;

const Obj1 = enforce({
  key1: {
    prop1: "hi",
  },
  key2: {
    prop1: "bye",
    prop2: "sup",
  },
});


Obj1.key1.prop1; // Ok
Obj1.key2.prop1; // Ok

/** 
 * ERROR: does not match passed in object
 */
Obj1.key1.prop2 // Error 
Obj1.key2.prop3 // Error
Obj1.key2.prop321 // Error

Obj1.key3; // Error 

/**
 * ERRORS: Does not match GenericType
 */
const Obj2 = enforce({
  key1: { // Error 
  }
});
const Obj3 = enforce({
  key1: {
    prop1: 123, // Error
  }
});

您可以将nodeSelector与提供的任何标签一起使用。第一个标签允许一个将部署分配给特定节点,而后两个则将节点池作为目标。

我会说以NodePool为目标而不是特定的Pod是可取的,因为Pod可以被销毁并创建新的Pod。下面的快速示例

doks.digitalocean.com/node-id
doks.digitalocean.com/node-pool
doks.digitalocean.com/node-pool-id

标签apiVersion: extensions/v1beta1 kind: Deployment metadata: name: ipengine spec: replicas: 1 template: metadata: labels: app: ipengine spec: containers: - name: ipengine image: <imageaddr.> args: - ipengine - --ipython-dir=/tmp/config/ - --location=ipcontroller.default.svc.cluster.local - --log-level=0 resources: requests: cpu: 1 #memory: 3Gi nodeSelector: doks.digitalocean.com/node-pool: pool-highcpu32 期望将池名称作为值,您也可以使用doks.digitalocean.com/node-pool将期望池的ID作为值。