rules_k8s-k8s_deploy模板离开图像

时间:2018-09-03 21:51:33

标签: kubernetes bazel

我们有一个项目,其中包含20多个小服务,这些小服务全部驻留在同一存储库中,并使用bazel构建。

为了减少管理开销,我们希望自动生成尽可能多的内容,包括映像和k8s部署。 所以问题是:

有没有办法避免通过规则或功能在k8s_deploy步骤中设置图像键?

我们已经有了一条规则,可以在清单中对图像进行模板处理,使其具有基于标签的图像名称(和k8s对象名称):

_TEMPLATE = "//k8s:deploy.yaml"

def _template_manifest_impl(ctx):
  name = '{}'.format(ctx.label).replace("//cmd/", "").replace("/", "-").replace(":manifest", "")
  ctx.actions.expand_template(
    template = ctx.file._template,
    output = ctx.outputs.source_file,
    substitutions = {
      "{NAME}": name,
    },
  )

template_manifest = rule(
  implementation = _template_manifest_impl,
  attrs = {
    "_template": attr.label(
      default = Label(_TEMPLATE),
      allow_single_file = True,
    ),
  },
  outputs = {"source_file": "%{name}.yaml"},
)

这样,//cmd/endpoints/customer/log下的服务将产生图像eu.gcr.io/project/endpoints-customer-log

虽然目前为止效果很好,但我们仍然必须像这样手动为images设置k8s_deploy字典:

k8s_deploy(
    name = "dev",
    images = {
        "eu.gcr.io/project/endpoints-customer-log:dev": ":image",
    },
    template = ":manifest",
)

摆脱这个问题将是很棒的,但是我还没有找到办法。 使用规则不起作用,因为图像没有标签,而使用函数不起作用,因为我发现那里没有访问上下文的方法。

我想念什么吗?

1 个答案:

答案 0 :(得分:0)

我发现从构建步骤中删除容器注册表名称的解决方案是使用bazel进行构建,使用skaffold进行部署。这两个步骤都在同一CI管道中执行。

我的skaffold.yaml非常简单,并提供了bazel目标到gcr名称的映射。

apiVersion: skaffold/v2alpha4
kind: Config
metadata:
  name: my_services
build:
  tagPolicy:
    gitCommit: 
      variant: AbbrevCommitSha
  artifacts:
  - image: gcr.io/jumemo-dev/service1
    bazel:
      target: //server1/src/main/java/server1:server1.tar
  - image: gcr.io/jumemo-dev/service2
    bazel:
      target: //server2/src/main/java/server2:server2.tar

使用以下命令调用

$ skaffold build