使用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
相关产品推荐
相关产品推荐

