脚手架+掌舵集成

时间:2021-07-07 16:13:37

标签: kubernetes-helm skaffold

我正在尝试在内部项目中使用 skaffoldhelm。在我提出实际问题之前,这里是 skaffold.yaml:

apiVersion: skaffold/v2beta17
kind: Config
build:
  tagPolicy:
    gitCommit: {}
  artifacts:
    - image: my-image
      custom:
        buildCommand: ./build.sh
  local:
    useDockerCLI: false
    useBuildkit: false
    push: false


deploy:
  helm:
    releases:
      - name: config-map-it
        chartPath: src/main/helm
        artifactOverrides:
          # skaffold will override this with a different tag
          image: my-image
        valuesFiles:
          - src/main/helm/values.yaml
        wait: true
        setValues:
          namespace: my-namespace

您可能会注意到,我有一种自定义方式来构建映像。它实际上是多个步骤,但最终它会做这样的事情:

#!/usr/bin/env bash

# build jar only, no tests, no chart
gradle clean build -x test -x helmChartBuild --quiet

#  ... more steps here    
docker build --build-arg JAR_FILE='build/libs/*.jar'  -t ${IMAGE} .

# load docker image into kind 
kind load docker-image ${IMAGE} --name my-namespace

特别注意 ${IMAGE}。我需要这个,因为我要调用:

skaffold build
skaffold deploy

(是的,由于其他不相关的原因,这就是我需要它的方式)

所以,我先调用 skaffold build。我得到的图像如下:

myimage/a3eadcc-dirty

下一步:skaffold deploy 将失败:

no tag provided for image [my-image] 

我明白为什么,我现在稍微改变了命令:

skaffold build --file-output=tag.json
kind load docker-image ${IMAGE} --name my-namespace
skaffold deploy -a tag.json

不幸的是,这也不起作用。

问题是 ${IMAGE} 将是 myimage/a3eadcc-dirty,而 tag.json 将包含图像的 sha 作为标签,所以 {{1} } 会失败,因为找不到这样的图像。

就我而言,公平的解决方案并不复杂。只需解析deploy,找出标签:

${IMAGE}

并将其与 export MY_TAG=... ...

一起使用

问题是,这样吗?

1 个答案:

答案 0 :(得分:1)

所以您似乎有几个问题:您如何确定图片标签?您如何测试图像和清单?

您可以使用 skaffold build --tag xxx 来覆盖标记策略并使用固定标记名称构建图像。

与其尝试将测试作为构建的一部分运行,这会大大减慢您的正常开发循环,不如使用 Skaffold 的测试阶段。您可以使用 skaffold test (docs) 运行图像测试。 自定义测试 允许运行任意命令。您可以在此测试阶段运行清单验证。

在图片中使用 Helm 后,您需要先渲染(或水合物)清单,然后才能对其进行验证。你可以skaffold build --file-output images.json && skaffold render --build-artifacts=images.json > manifests.yaml && validate manifests.yaml

如果您的清单验证器希望检索图像,但无法从本地 Docker 守护程序检索图像,那么您可以改为构建到私有注册表。您可以使用 registry:2 图像创建临时注册表;临时注册表还有助于确保图像不会逃逸。