有没有办法告诉 kubectl 我的 pod 应该只部署在某个实例池上?
例如:
nodeSelector:
pool: poolname
假设我已经使用以下内容创建了我的池:
gcloud container node-pools create poolname --cluster=cluster-1 --num-nodes=10 --machine-type=n1-highmem-32
有没有办法告诉 kubectl 我的 pod 应该只部署在某个实例池上?
例如:
nodeSelector:
pool: poolname
假设我已经使用以下内容创建了我的池:
gcloud container node-pools create poolname --cluster=cluster-1 --num-nodes=10 --machine-type=n1-highmem-32
好的,我找到了解决方案:
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
您也可以使用taints和tolerations。这样,您不必知道/硬编码特定的池名称,而只需知道它将具有taint high-cpu
,例如。然后你给你的 pod 一个对这个污点的容忍度,他们可以在那个目标池上调度。
这允许您拥有多个池,或进行 HA 池部署,您可以通过更改池上的污点从一个池迁移到另一个池。
然而,这里的问题是,虽然容忍允许 pod 在受污染的池上进行调度,但它不会阻止它们在其他地方进行调度。因此,您需要pool-a
使用taint-a
、 和pool-b
进行taint taint-b
,并为 podpool-a
和pool-b
适当的 taint 提供适当的 taint 以防止它们进入彼此的池中。
如果您使用的是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 作为值。
或者你两个都做!
这意味着您不需要在每个池上都进行 taint-n-tolerate(例如,如果您有一个“默认池”,您希望默认情况下运行该池(即,如果用户对他们的 pod 没有做任何特别的事情,他们将在这里部署)和“其他池”用于更特殊/受限制的用例。
此模型允许 pod 运行而无需对配置进行任何特殊调整,而不是 tain-n-tolerate 一切,这意味着如果没有配置,则 pod 永远不会运行 tolerations。
取决于您/您的用户需求,您需要的所有东西的锁定程度等。
与往常一样,从猫科动物身上剥离真皮的方法不止一种。