【问题标题】:skaffold + helm integrationskaffold + helm 集成
【发布时间】:2021-09-18 05:01:21
【问题描述】:

我正在尝试使用 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作为标签,所以deploy会失败,因为这样的图片不能找到了。

公平地说,我的解决方案并不复杂。只需解析${IMAGE},找出标签:

export MY_TAG=...

并将其与skaffold deploy --image...一起使用...

问题是,是这样吗?

【问题讨论】:

  • 我对这里发生的事情感到很困惑。您能解释一下为什么要明确地将图像加载到实物中吗?并且回复:“deploy 将失败,因为找不到这样的图像”——为什么找不到图像?
  • @BriandeAlwis 我应该为你感到困惑的事实负责。 1)“您能解释一下为什么要明确地将图像加载到实物中吗?” - 我计划在构建图像之前静态验证 k8s 清单。所以我这样做:“验证、构建、加载到实物”。当我想到它时,这对我来说是有道理的……我可能错了。 2)“部署将失败,因为找不到这样的图像” - 最终加载到 kind 的图像是123-dirty,清单试图加载的图像是带有sha 作为标签的图像.

标签: kubernetes-helm skaffold


【解决方案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 映像创建一个临时注册表;临时注册表还有助于确保图像不会逃逸。

【讨论】:

  • 谢谢,这很有帮助。我最终做的是skaffold build --file-output=tag.json deploy_tag="$(cat tag.json | jq '.builds[].tag' | cut -d '"' -f 2)" kind load docker-image "${deploy_tag}" --name spring-k8s skaffold deploy -a tag.json
  • 为了让 skaffold 表现得像我想要的那样,我必须做的“舞蹈”的数量有点违反直觉;但这很可能是因为我不完全明白。例如,skaffold delete 不会删除它刚刚创建的 docker 镜像。我必须用手来做——还有很多像这样的小事让我挠头两次。它可能是一个很棒的工具,但我还没有发现它的美。
  • 我们有一个名为hooks 的即将推出的功能,它可能会让您更轻松地完成其中的某些部分github.com/GoogleContainerTools/skaffold/issues/1441>。我还是不明白你为什么要手动将图像加载到kind 中?需要明确的是:Skaffold 会自动将您的图像加载到kind,作为skaffold deploy 的一部分。顺便说一句:skaffold run 结合了 skaffold buildskaffold deploy
  • 好的,所以我可能完全错过了一些东西。 how about this question?
猜你喜欢
  • 2022-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-12
  • 2021-09-25
  • 1970-01-01
  • 2019-09-10
  • 2022-12-17
相关资源
最近更新 更多