25

有没有办法告诉 kubectl 我的 pod 应该只部署在某个实例池上?

例如:

nodeSelector:
      pool: poolname

假设我已经使用以下内容创建了我的池:

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

4 回答 4

48

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

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

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

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:
        #<labelname>:value
        cloud.google.com/gke-nodepool: pool-highcpu32
于 2016-10-20T14:06:21.880 回答
5

您也可以使用taintstolerations。这样,您不必知道/硬编码特定的池名称,而只需知道它将具有taint high-cpu,例如。然后你给你的 pod 一个对这个污点的容忍度,他们可以在那个目标池上调度。

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

然而,这里的问题是,虽然容忍允许 pod 在受污染的池上进行调度,但它不会阻止它们在其他地方进行调度。因此,您需要pool-a使用taint-a、 和pool-b进行taint taint-b,并为 podpool-apool-b适当的 taint 提供适当的 taint 以防止它们进入彼此的池中。

于 2018-12-10T20:15:05.267 回答
1

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

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

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

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

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期望池名称作为值,您也可以使用doks.digitalocean.com/node-pool-id期望池的 id 作为值。

于 2020-09-07T00:12:42.030 回答
1

或者你两个都做!

  • 使用标签选择要在哪个池上运行
  • 使用taintstolerations确保只有其他 pod 不会尝试在此节点池上运行

这意味着您不需要每个池上都进行 taint-n-tolerate(例如,如果您有一个“默认池”,您希望默认情况下运行该池(即,如果用户对他们的 pod 没有做任何特别的事情,他们将在这里部署)和“其他池”用于更特殊/受限制的用例。

此模型允许 pod 运行而无需对配置进行任何特殊调整,而不是 tain-n-tolerate 一切,这意味着如果没有配置,则 pod 永远不会运行 tolerations

取决于您/您的用户需求,您需要的所有东西的锁定程度等。

与往常一样,从猫科动物身上剥离真皮的方法不止一种。

于 2020-08-21T22:24:48.290 回答