即时编辑Kubernetes Pod

时间:2019-10-06 15:44:39

标签: kubernetes kubectl kubernetes-pod

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

使用命令性命令,启动部分非常容易。 正在运行

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

完全满足了我的需求:单个pod不受任何控制器(如Deployment或ReplicaSet)的管理。易于使用并在需要时进行清理。

但是,当我尝试使用

编辑规范时
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规范中,有没有更简单的选择(或可能是一些优雅的解决方法)来编辑 任意 字段? 任何建议,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

您绝对应该在此处使用部署。

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

(实际上并没有任何理由想要裸露的Pod;您几乎总是需要一个高层控制器。我可以想到的一个例外是kubectl run集群内的调试外壳。)

生成的Pod名称可能会带来一些麻烦。这里有用的一个技巧:从最近的kubectl起,您可以为kubectl logs

之类的命令赋予 deployment 名称
kubectl logs deployment/nginx-test

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

kubectl logs nginx-test<TAB>