即时更新POD的节点选择器字段

Per*_*t8S 2 pod kubernetes kubectl

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

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

我在想,这与使用kubectl label命令对普通标签所做的方式相同。

是否有破解这种情况的技巧?

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

谢谢。

MWZ*_*MWZ 5

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

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


这是我使用的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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

两者都将导致调度程序在请求的节点上调度新的Pod,并在新的Pod准备就绪时终止旧的Pod。