【问题标题】:Editing Kubernetes pod on-the-fly即时编辑 Kubernetes pod
【发布时间】:2020-02-04 02:48:58
【问题描述】:

出于调试和测试目的,我想找到一种最方便的方式来启动 Kubernetes pod 并即时更改其规范。

使用命令式命令很容易启动。 运行

kubectl run nginx-test --image nginx --restart=Never

给了我我想要的东西:不受任何控制器(如 Deployment 或 ReplicaSet)管理的单个 pod。在需要时易于使用和清理。

但是,当我尝试使用

编辑规范时
kubectl edit po nginx-test

我收到以下警告:

pods "nginx-test" was not valid:
 * spec: Forbidden: pod updates may not change fields other than spec.containers[*].image, spec.initContainers[*].image, spec.activeDeadlineSeconds or spec.tolerations (only additions to existing tolerations)

即只有有限的 Pod 规范集在运行时是可编辑的。

目前发现的选项:

  1. 将 Pod 规范保存到文件中:

    kubectl get po nginx-test -oyaml > nginx-test.yaml
    

    编辑和重新创建
    kubectl apply -f
    

    虽然只更改一个字段有点重。

  2. 创建一个 Deployment 而不是单个 Pod,然后在 Deployment 本身中编辑 spec 部分。

    缺点是:

    • 需要额外的 API 对象(部署),完成后不要忘记清理
    • Pod 名称以nginx-test-xxxxxxxxx-xxxx 和更少的形式自动生成 方便工作。

那么在 Pod 规范中编辑 arbitrary 字段是否有更简单的选项(或者可能是一些优雅的解决方法)? 如有任何建议,我将不胜感激。

【问题讨论】:

    标签: kubernetes kubectl kubernetes-pod


    【解决方案1】:

    您绝对应该在这里使用部署。

    对于您描述的用例,Pod cannot be updated 上的大多数有趣字段,因此您需要自己手动删除并重新创建 pod。部署为您管理。如果一个 Deployment 拥有一个 Pod,而您删除了该 Deployment,Kubernetes 自己知道要删除匹配的 Pod,所以实际上没有更多工作了。

    (实际上没有任何理由想要一个裸 pod;您几乎总是想要一个更高级别的控制器。我能想到的一个例外是 kubectl run 集群内的调试 shell。)

    生成的 Pod 名称可能是个小麻烦。在这里有用的一个技巧:从最近的 kubectl 开始,您可以将 deployment 名称赋予像 kubectl logs

    这样的命令
    kubectl logs deployment/nginx-test
    

    还有各种“仪表板”类型的工具可让您浏览当前的 pod 集,因此您无需复制和粘贴完整的 pod 名称即可执行阅读日志等操作。您还可以为kubectl 设置tab completion,然后输入

    kubectl logs nginx-test<TAB>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-07
      • 2011-01-10
      • 1970-01-01
      • 2020-11-03
      • 2012-10-15
      • 1970-01-01
      • 2020-11-15
      • 2015-12-25
      相关资源
      最近更新 更多