如何从shell脚本中编辑一个kubernetes资源

20

我查阅了文档,使用kubectl edit命令来编辑Kubernetes资源。执行该命令后,YAML格式的文件将在编辑器中打开,您可以根据需求更改值并保存。我试图通过sed来执行这些步骤。如何实现以下步骤?

  1. 对部署资源执行kubectl edit
  2. 使用sed将值从true设置为false
  3. 保存更改

我尝试以下方式实现:

$ kubectl edit deployment tiller-deploy -n kube-system | \
   sed -i "s/\(automountServiceAccountToken:.*$\)/automountServiceAccountToken: true/g"`

请在您的帖子中发布输入和期望输出的示例。 - RavinderSingh13
这个命令该怎么才能正常工作? - hek2mgl
6个回答

17

你的命令缺少一个反引号。即使你把它放在那里,它也无法正常工作。原因是当你使用 kubectl edit ... 命令时,它会在 vim 上编辑文件。我不确定 sed 是否可用于 vim。即使它可以,输出也会被写入文件,所以你会得到 Vim: Warning: Output is not to a terminal 错误,我不知道如何解决。

我建议你获取该文件并保存它。替换所需的参数后再次运行文件:

kubectl get deploy tiller-deploy -n kube-system -o yaml > tiller.yaml && sed -i "s/automountServiceAccountToken:.*$/automountServiceAccountToken: true/g" tiller.yaml && kubectl replace -f tiller.yaml

我尝试了上面的命令,它起作用了。

注意:不需要添加-n kube-system,因为yaml文件已经包含了该命名空间。


11
我刚刚找到了一种更简单的方法:
KUBE_EDITOR="sed -i s/SOMETHING TO CHANGE/CHANGED/g" kubectl edit resource -n your-ns

1
我收到了这个错误信息:编辑器“sed -i s/role: webserver/role: apache2/g”出现问题。 - Andrew
@Andrew 当使用sed与KUBE_EDITOR环境变量时可能会带来一些方便,但请注意分隔符('/')。要么您用单引号引起来,例如KUBE_EDITOR="sed -i 's/role: webserver/role: apache2/g'" kubectl ...,要么选择除'/'之外的其他分隔符,例如'%'. - Ming Hsieh

7

我通过将命令通过sed命令进行管道传输而不创建临时文件来自动化。看下面的例子,我将替换nameserver 8.8.8.81.1.1.1

$ kubectl -n kube-system get configmap/kube-dns -o yaml | sed "s/8.8.8.8/1.1.1.1/" | kubectl replace -f -

4

一种简单的方法是,使用 kubectl-patch 来替代 sed。

$ kubectl patch deployment tiller-deploy -n kube-system --patch '{"map": {"to": {"the": {"key": {"automountServiceAccountToken": "true"}}}}}'

3

感谢@suren提供我需要的内容,但您不需要将其保存在文件中。 您可以直接使用管道操作进行kubectl replace

kubectl get deploy test-deploy  -o yaml | sed "s/find/replace/g" | kubectl replace -f -


1
我不了解 kubectl,但文档似乎解释了它可以从编辑器中提取数据并进行编辑,然后发送回去,不确定在这种情况下是否可以使用 sed 管道。
如果管道有效,请勿使用 -i,因为您不会在管道中更改文件。
kubectl edit deployment tiller-deploy -n kube-system | \
 sed 's/automountServiceAccountToken:.*$/automountServiceAccountToken: true/g'

如果编辑一个文件(并在sed中使用组)。
kubectl edit deployment tiller-deploy -n kube-system > YourCOnfigFile && \
 sed -i 's/\(automountServiceAccountToken:\).*$/\1 true/g' YourConfigFile \
 && Some kubectl to send back YourConfigFile

kubectl edit deployment tiller-deploy -n kube-system > YourCOnfigFile 会抛出错误。 - suren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接