即时编辑 Kubernetes Pod

esb*_*ych 10 kubernetes kubectl kubernetes-pod

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

使用命令式命令启动部分非常简单。跑步

kubectl run nginx-test --image nginx --restart=Never
Run Code Online (Sandbox Code Playgroud)

给了我我想要的东西:不受 Deployment 或 ReplicaSet 等任何控制器管理的单个 Pod。易于玩耍和需要时清理。

但是,当我尝试使用以下命令编辑规范时

kubectl edit po nginx-test
Run Code Online (Sandbox Code Playgroud)

我收到以下警告:

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

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

到目前为止找到的选项:

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

    kubectl get po nginx-test -oyaml > nginx-test.yaml
    
    Run Code Online (Sandbox Code Playgroud)

    编辑并重新创建

    kubectl apply -f
    
    Run Code Online (Sandbox Code Playgroud)

    不过,只改变一个字段有点重。

  2. 创建部署而不是单个 Pod,然后编辑spec部署本身的部分。

    缺点是:

    • 需要额外的 API 对象(部署),完成后不要忘记清理它
    • Pod 名称以 的形式自动生成nginx-test-xxxxxxxxx-xxxx,使用起来不太方便。

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

Dav*_*aze 6

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

对于您描述的用例,Pod 上的大多数有趣字段都无法更新,因此您需要自己手动删除并重新创建 Pod。部署会为您管理该操作。如果某个 Deployment 拥有一个 Pod,并且您删除了该 Deployment,那么 Kubernetes 会自行删除匹配的 Pod,因此实际上不再需要任何工作。

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

生成的 Pod 名称可能会带来一些小麻烦。此处有用的一个技巧:从最近的情况来看kubectl,您可以将部署名称指定给以下命令:kubectl logs

kubectl logs deployment/nginx-test
Run Code Online (Sandbox Code Playgroud)

还有各种“仪表板”类型的工具可让您浏览当前的 pod 集,因此您可以执行读取日志等操作,而无需复制并粘贴完整的 pod 名称。您还可以为、 和类型设置制表符补全kubectl

kubectl logs nginx-test<TAB>
Run Code Online (Sandbox Code Playgroud)