Kubernetes将Pod分配到池中。

34

有没有办法告诉kubectl,我的pod只能部署在特定的实例池上?

例如:

nodeSelector:
      pool: poolname

假设我已经创建了我的池,类似于以下内容:

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

56

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

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

6
您还可以使用污点容忍。这样,您不必了解/硬编码特定的池名称,而只需知道它将具有例如高CPU污点。然后,您为您的pod提供针对该污点的容忍度,它们可以在该目标池上进行调度。
这使您可以拥有多个池,或者拥有HA池部署,您可以通过更改池上的污点从一个池迁移到另一个池。
然而,这里需要注意的是,虽然容忍允许pod在有污点的池上调度,但它不能阻止它们在其他地方调度。因此,您需要用taint-apool-a涂上污点,并用taint-bpool-b涂上污点,并为pool-apool-b的pod提供适当的污点以使它们不进入彼此的池中。

5
一个例子会让你的回答更有帮助。如果有人对这个解决方案感兴趣(我相信这是更好的),请参考https://kubernetes.io/docs/concepts/configuration/taint-and-toleration/。 - Fábio

3
如果您正在使用Digital Ocean Kubernetes,则每个节点池都可以访问以下标签。
doks.digitalocean.com/node-id
doks.digitalocean.com/node-pool
doks.digitalocean.com/node-pool-id

你可以使用nodeSelector与提供的任何标签配合使用。第一个标签允许将部署分配到特定节点,而最后两个标签则针对节点池。
我会说,与特定Pod相比,针对NodePool是更可取的,因为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作为值。

1

或者你可以两者都做!

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

这意味着您不需要对每个池进行污点容忍(例如,如果您有一个“默认池”,您希望默认情况下运行事物(即如果用户对其pod未做任何特殊处理,则将其部署在此处),以及用于更特殊/受限用例的“其他池”。

这种模型允许pod在不需要特殊配置调整的情况下运行,而不是对所有内容进行污点容忍,这意味着如果没有容忍配置,pod永远不会运行

取决于您/您的用户需求,您需要多么严格地锁定所有内容等等。

像往常一样,剥离猫皮有多种方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接