You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:22:54