【问题标题】:Update Node Selector field for PODs on the fly动态更新 POD 的节点选择器字段
【发布时间】:2019-08-16 20:16:12
【问题描述】:

这些天我一直在围绕 k8s 尝试不同的东西。我想知道 POD 规范中的字段 nodeSelector 。 据我了解,我们必须为节点分配一些标签,这些标签可以进一步用于 POD 规范的 nodeSelector 字段部分。

基于 nodeSelector 将节点分配给 pod 工作正常。但是,在创建 pod 之后,现在我想更新/覆盖 nodeSelector 字段,该字段将根据更新的新 nodeSelector 标签将我的 pod 部署到新节点。

我的想法与使用kubectl label 命令处理普通标签的方式相同。

是否有任何技巧可以实现这种情况?

如果当前最新版本的 kubernetes 无法做到这一点,我们为什么不考虑呢?

谢谢。

【问题讨论】:

  • 您可以通过kubectl edit deploy [DEPLOYMENT] -n [NAMESPACE] -o yaml 更改nodeSelector 的值。一旦更改,旧的 Pod 将被终止,新的 Pod 将被调度到新的节点上。

标签: kubernetes kubectl


【解决方案1】:

虽然按照 cookiedough 的建议手动编辑部署是其中一种选择,但我相信使用 kubctl patch 会是更好的解决方案。

您可以使用yaml 文件或JSON 字符串进行修补,这样更容易将事物集成到脚本中。这是一个完整的reference


示例

下面是我使用的nginx的简单部署,会在node-1上创建:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
  labels:
    app: nginx
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.7.9
        ports:
        - containerPort: 80
      nodeSelector:
        kubernetes.io/hostname: node-1

JSON 补丁

您可以按如下方式修补部署以更改所需的节点:
kubectl patch deployments nginx-deployment -p '{"spec": {"template": {"spec": {"nodeSelector": {"kubernetes.io/hostname": "node-2"}}}}}'

YAML 补丁

通过运行kubectl patch deployment nginx-deployment --patch "$(cat patch.yaml)",其中patch.yaml准备如下:

spec:
  template:
    spec:
      nodeSelector:
        kubernetes.io/hostname: node-2

两者都会导致调度程序在请求的节点上调度新的 Pod,并在新 Pod 准备好后立即终止旧 Pod。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多