如何从 shell 脚本编辑 kubernetes 资源
How to edit a kubernetes resource from a shell script
我浏览了文档以使用 kubectl edit
命令编辑 kubernetes 资源。执行命令后,YAML 格式的文件将在编辑器中打开,我可以在其中根据要求更改值并保存。我正在尝试通过 sed
执行这些步骤。如何实现以下步骤?
- 为部署资源执行
kubectl edit
- 设置一个从
true
到 false
的值(使用 sed)
- 保存更改
我尝试通过以下方式实现此目的:
$ kubectl edit deployment tiller-deploy -n kube-system | \
sed -i "s/\(automountServiceAccountToken:.*$\)/automountServiceAccountToken: true/g"`
我不知道 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:\).*$/ true/g' YourConfigFile \
&& Some kubectl to send back YourConfigFile
您的命令缺少反引号。但是即使你把它放在那里,它也不起作用。原因是因为当您执行 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 文件已包含命名空间。
我通过 sed
命令通过管道将命令自动化,而不创建临时文件。以下面的例子为例,我将 nameserver 8.8.8.8
替换为 1.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 -
谢谢,@suren 提供了我真正想要的东西,但你不需要将它保存在文件中。您可以直接使用管道操作 kubectl replace
kubectl get deploy test-deploy -o yaml | sed "s/find/replace/g" | kubectl replace -f -
我刚刚找到了一种不那么复杂的方法:
KUBE_EDITOR="sed -i s/SOMETHING TO CHANGE/CHANGED/g" kubectl edit resource -n your-ns
一个简单的方法,只需使用 kubectl-patch 而不是 sed。
$ kubectl patch deployment tiller-deploy -n kube-system --patch '{"map": {"to": {"the": {"key": {"automountServiceAccountToken": "true"}}}}}'
我浏览了文档以使用 kubectl edit
命令编辑 kubernetes 资源。执行命令后,YAML 格式的文件将在编辑器中打开,我可以在其中根据要求更改值并保存。我正在尝试通过 sed
执行这些步骤。如何实现以下步骤?
- 为部署资源执行
kubectl edit
- 设置一个从
true
到false
的值(使用 sed) - 保存更改
我尝试通过以下方式实现此目的:
$ kubectl edit deployment tiller-deploy -n kube-system | \
sed -i "s/\(automountServiceAccountToken:.*$\)/automountServiceAccountToken: true/g"`
我不知道 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:\).*$/ true/g' YourConfigFile \
&& Some kubectl to send back YourConfigFile
您的命令缺少反引号。但是即使你把它放在那里,它也不起作用。原因是因为当您执行 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 文件已包含命名空间。
我通过 sed
命令通过管道将命令自动化,而不创建临时文件。以下面的例子为例,我将 nameserver 8.8.8.8
替换为 1.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 -
谢谢,@suren 提供了我真正想要的东西,但你不需要将它保存在文件中。您可以直接使用管道操作 kubectl replace
kubectl get deploy test-deploy -o yaml | sed "s/find/replace/g" | kubectl replace -f -
我刚刚找到了一种不那么复杂的方法:
KUBE_EDITOR="sed -i s/SOMETHING TO CHANGE/CHANGED/g" kubectl edit resource -n your-ns
一个简单的方法,只需使用 kubectl-patch 而不是 sed。
$ kubectl patch deployment tiller-deploy -n kube-system --patch '{"map": {"to": {"the": {"key": {"automountServiceAccountToken": "true"}}}}}'