Helm on Minikube:更新本地镜像

Helm on Minikube: update local image

我在本地使用 Helm (v2.13.1) 初始化了 Minikube (v1.1.0) 运行ning 并将本地 docker 守护进程与 Minikube 运行ning eval $(minikube docker-env).在我的应用程序的代码库中,我使用 helm create chart 创建了一个图表。 ./chart/values.yml的前几行我改成了:

image:
  repository: app-development
  tag: latest
  pullPolicy: Never

我在本地构建镜像,install/upgrade 使用 Helm 构建图表:

docker build . -t app-development
helm upgrade --install example ./chart

现在,这第一次完美运行,但如果我对应用程序进行更改,我想 运行 以上两个命令来升级图像。有什么方法可以让它工作吗?

解决方法

为了获得预期的行为,我可以从 Minikube 中删除图表并重新安装它:

docker build . -t app-development
helm del --purge example
helm install example ./chart

当您进行这样的更改时,Kubernetes 会在 Deployment 对象中寻找一些更改。如果它看到你想要 1 个 Pod 运行 app-development:latest,并且它已经有 1 个 Pod 运行 一个名为 app-development:latest 的图像,那么它处于正确的状态,但它没有需要做任何事情(即使具有该标签的本地图像已更改)。

这里的规范建议是永远不要在 Kubernetes 中使用 :latest 标签。每次构建图像​​时,使用不同的标签(时间戳或当前源代码控制提交 ID 很容易唯一)。使用 Helm 可以很容易地根据您传入的值注入它:

image: app-development:{{ .Values.tag | default "latest" }}

这种构建顺序看起来更像

TAG=$(date +%Y%m%d-%H%m%S)
docker build -t "app-development:$TAG" .
helm upgrade --install --set "tag=$TAG"

如果您正在积极开发您的组件,您可能会发现尽可能多地尝试将 "hacking on code" 与 "deploying into Kubernetes" 分开会更容易。其中一些往往是不可避免的,但 Kubernetes 实际上并不是为实时开发环境而设计的。

解决此问题的一种方法是使用来自 google 的 minikube 和云代码。当您在项目中初始化云代码时,它会在根位置创建 skaffold yaml。您可以将同一项目的 helm chart 放在同一代码库中。继续并编辑此配置以匹配 helm chart 的文件夹位置:

deploy: helm:
releases:
- name: <chart_name>
  chartPath: <folder path relative to this file>

现在,当您单击可视化代码编辑器(或任何编辑器)底部的云代码时,它应该会为您提供以下选项: [1]: https://i.stack.imgur.com/vXK4U.png Select 列表中的“运行 on Kubernetes”。

您需要在 helm chart 中做的唯一更改是使用配置文件从 Skaffold yaml 中读取图像 url。

profiles:
- name: prod
  deploy:
    helm:
      releases:
      - name: <helm_chart_name>
        chartPath: helm
        skipBuildDependencies: true
        artifactOverrides:
          image: <url_production_image_url>

这将从配置的 url 中读取图像,而在本地,它应该从 docker 守护进程中读取。当您对任何文件进行任何更改时,云代码还提供热更新/部署 though.No 在本地测试时需要始终提及图像标签。熟悉代码后,使用最新版本号更新映像,这会触发集成/开发环境中的部署。