如何通过Bash脚本在Kubernetes YAML中增删指定键值对
解决Kubernetes Deployment YAML的键值对修改问题
针对你的需求——删除Deployment YAML中containers.ports下的hostPort: 3003和protocol: TCP,并在spec下添加RollingUpdate策略,以下是几个可行方案:
方案1:使用yq(推荐,专门处理YAML的工具)
yq是专门针对YAML/JSON的命令行处理工具,能精准处理层级结构,比awk/sed更可靠。
步骤1:安装yq
如果是mikefarah/yq(v4版本,目前主流),可以用以下方式安装:
- Linux:
sudo wget https://github.com/mikefarah/yq/releases/latest/download/yq_linux_amd64 -O /usr/bin/yq && sudo chmod +x /usr/bin/yq - macOS:
brew install yq
步骤2:执行修改命令
假设你的Deployment YAML文件名为deploy.yaml,执行以下命令一次性完成删除和添加操作:
yq eval ' del( .spec.template.spec.containers[].ports[] | select(.hostPort == 3003).hostPort, .spec.template.spec.containers[].ports[] | select(.protocol == "TCP").protocol ) | .spec.strategy = { "type": "RollingUpdate", "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 0 } } ' deploy.yaml > updated-deploy.yaml
del(...)部分:精准删除指定端口条目里的hostPort:3003和protocol:TCP键值对.spec.strategy = ...部分:在spec下添加RollingUpdate策略,你可以根据需求调整maxSurge和maxUnavailable的值
方案2:使用sed(无yq时的文本处理方案)
sed是通用文本处理工具,适合简单的YAML修改,但要注意YAML的缩进敏感性:
删除指定键值对
# 删除hostPort: 3003行 sed -i '/hostPort: 3003/d' deploy.yaml # 删除protocol: TCP行 sed -i '/protocol: TCP/d' deploy.yaml
添加RollingUpdate策略
找到spec:行,在其下方插入策略配置(注意缩进要和YAML原有格式一致):
sed -i '/spec:/a\ strategy:\n type: RollingUpdate\n rollingUpdate:\n maxSurge: 1\n maxUnavailable: 0' deploy.yaml
方案3:使用kubectl patch(直接修改集群中的Deployment)
如果你的Deployment已经部署到Kubernetes集群,可以直接用kubectl patch修改,无需编辑本地YAML:
删除指定键值对
kubectl patch deployment <你的Deployment名称> --type json -p ' [ {"op": "remove", "path": "/spec/template/spec/containers/0/ports/0/hostPort"}, {"op": "remove", "path": "/spec/template/spec/containers/0/ports/0/protocol"} ] '
注意:路径中的0是容器和端口的索引,如果有多个容器或端口,需要对应调整索引值。
添加RollingUpdate策略
kubectl patch deployment <你的Deployment名称> --type merge -p ' { "spec": { "strategy": { "type": "RollingUpdate", "rollingUpdate": { "maxSurge": 1, "maxUnavailable": 0 } } } } '
为什么awk没生效?
awk是按行处理的文本工具,无法理解YAML的层级结构。如果hostPort:3003的行有特定缩进、或者存在于不同层级的相同行,awk可能无法精准匹配;另外,awk处理嵌套结构时逻辑会变得复杂,容易误删或漏改,所以处理YAML这类层级化数据,优先用专门的工具(比如yq)。
内容的提问来源于stack exchange,提问作者Vansh Kumar Madan
相关产品推荐
相关产品推荐

