skaffold + helm 集成
skaffold + helm integration
我正在尝试使用 skaffold
和 helm
进行内部项目。在我提出实际问题之前,这里是 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
作为标签,因此 deploy
将失败,因为找不到这样的图像。
公平地说,我的解决方案并不复杂。只需解析${IMAGE}
,找出标签:
export MY_TAG=...
并将其与 skaffold deploy --image
...
一起使用
问题是,是这样吗?
所以你似乎有几个问题:你如何确定图像标签?您如何测试图像和清单?
您可以使用 skaffold build --tag xxx
覆盖标签策略并使用固定标签名称构建图像。
与其尝试将 运行 测试作为构建的一部分,这会大大减慢您的正常开发循环,不如使用 Skaffold 的测试阶段。您可以使用 skaffold test
(docs) 运行 图像测试。 自定义测试 允许运行ning 任意命令。您可以 运行 将验证列为此测试阶段的一部分。
图片中使用 Helm,您需要 render(或 hydrate)清单,然后才能验证它们。你可以 skaffold build --file-output images.json && skaffold render --build-artifacts=images.json > manifests.yaml && validate manifests.yaml
.
如果您的清单验证器希望检索图像,但无法从本地 Docker 守护程序检索图像,那么您可以改为构建私有注册表。您可以使用 registry:2
图像创建一个临时注册表;临时注册表还有助于确保图像不会逃逸。
我正在尝试使用 skaffold
和 helm
进行内部项目。在我提出实际问题之前,这里是 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
作为标签,因此 deploy
将失败,因为找不到这样的图像。
公平地说,我的解决方案并不复杂。只需解析${IMAGE}
,找出标签:
export MY_TAG=...
并将其与 skaffold deploy --image
...
问题是,是这样吗?
所以你似乎有几个问题:你如何确定图像标签?您如何测试图像和清单?
您可以使用 skaffold build --tag xxx
覆盖标签策略并使用固定标签名称构建图像。
与其尝试将 运行 测试作为构建的一部分,这会大大减慢您的正常开发循环,不如使用 Skaffold 的测试阶段。您可以使用 skaffold test
(docs) 运行 图像测试。 自定义测试 允许运行ning 任意命令。您可以 运行 将验证列为此测试阶段的一部分。
图片中使用 Helm,您需要 render(或 hydrate)清单,然后才能验证它们。你可以 skaffold build --file-output images.json && skaffold render --build-artifacts=images.json > manifests.yaml && validate manifests.yaml
.
如果您的清单验证器希望检索图像,但无法从本地 Docker 守护程序检索图像,那么您可以改为构建私有注册表。您可以使用 registry:2
图像创建一个临时注册表;临时注册表还有助于确保图像不会逃逸。