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

使用k8s-libsonnet批量生成Deployment清单时循环失效求助

问题分析与解决方案

你的代码之所以只会生成首个配置的重复清单,核心原因是:dev-env.jsonnet中创建的kp实例固定指向了_config.deployment(即carts的配置),循环时复用同一个kp.deployment和kp.service字段,自然无法切换到其他服务的配置。

以下是修正后的完整代码,支持批量生成任意数量的Deployment和Service:

1. 修改sample.jsonnet

将单个服务的资源生成逻辑封装为可复用的函数,并通过遍历服务配置动态生成资源:

local k = import "github.com/jsonnet-libs/k8s-libsonnet/1.25/main.libsonnet";

// 生成单个服务的Deployment和Service
local createServiceResources(serviceConfig, environment) = {
  local deploy = k.apps.v1.deployment,
  local service = k.core.v1.service,
  local container = k.core.v1.container,
  local port = k.core.v1.containerPort,

  deployment: deploy.new(
    name=serviceConfig.name, 
    containers=[
      container.new(
        name=serviceConfig.name, image=serviceConfig.image
      ) + 
      container.withEnv(
        [
          {
            "name": "JAVA_OPTS", "value": "-Xms64m -Xmx128m -XX:+UseG1GC -Djava.security.egd=file:/dev/urandom -Dspring.zipkin.enabled=false"
          }
        ]
      ) + 
      k.core.v1.resourceRequirements.withLimits(limits=({cpu: 300, memory: 500})) +
      k.core.v1.resourceRequirements.withRequests(requests=({cpu: 100, memory: 200})) +
      container.withPorts([port.new(8000)])
    ], 
    replicas=1
  ) + deploy.metadata.withNamespace(environment),

  service: service.new(
    name=serviceConfig.name,
    selector={"name": serviceConfig.name}, 
    ports=8080
  ) + service.metadata.withNamespace(environment),
};

{
  _config:: {
    environment:: error "Must provide environment name",
    services:: error "Must provide services config map",
  },

  // 生成环境对应的命名空间
  namespace: k.core.v1.namespace.new(name=$._config.environment),

  // 遍历所有服务,生成Deployment
  [serviceName + "_deployment"]: createServiceResources($._config.services[serviceName], $._config.environment).deployment
  for serviceName in std.objectFields($._config.services),

  // 遍历所有服务,生成Service
  [serviceName + "_service"]: createServiceResources($._config.services[serviceName], $._config.environment).service
  for serviceName in std.objectFields($._config.services),
}

2. 修改dev-env.jsonnet

将所有服务的配置统一放在services对象下,新增服务只需在此添加条目:

local kp = import "./sample.jsonnet" + {
  _config: {
    environment: "development",
    services: {
      carts: {
        name: "carts",
        image: "weaveworksdemos/carts:0.4.8"
      },
      carts_db: {
        name: "carts_db",
        image: "mongo"
      }
      // 继续添加更多服务,比如:
      // orders: { name: "orders", image: "weaveworksdemos/orders:0.4.7" },
      // inventory: { name: "inventory", image: "weaveworksdemos/inventory:0.4.3" }
    }
  }
};

kp

3. 执行命令验证

运行以下命令即可生成所有服务的清单:

jsonnet dev-env.jsonnet

关键修改点

  • 封装createServiceResources函数,确保每个服务的资源生成逻辑独立,根据传入的服务配置动态生成内容。
  • 采用std.objectFields遍历服务配置对象,自动识别所有新增的服务条目,无需修改循环逻辑。
  • 给Deployment和Service添加命名空间字段,确保所有资源归属到指定的环境命名空间中。

内容的提问来源于stack exchange,提问作者Praveen Mishra

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 05:10:17