【问题标题】:Helm on Minikube: update local imageMinikube 上的 Helm:更新本地镜像
【发布时间】:2019-10-18 06:52:36
【问题描述】:

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

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

我在本地构建映像并使用 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-helm minikube


    【解决方案1】:

    当您进行这样的更改时,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"
    

    如果您正在积极开发您的组件,您可能会发现尽可能地将“黑客攻击代码”与“部署到 Kubernetes”区分开来会更容易。这在一定程度上是不可避免的,但 Kubernetes 确实不是为实时开发环境而设计的。

    【讨论】:

    • 虽然这并不能完全解决问题,但我相信这是一个很好的开发实践
    【解决方案2】:

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

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

    现在,当您单击可视代码编辑器(或任何编辑器)底部的云代码时,它应该为您提供以下选项: [1]:https://i.stack.imgur.com/vXK4U.png 从列表中选择“在 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 daemon 读取。当您对任何文件进行任何更改时,云代码也提供热更新/部署。在本地测试时无需总是提及图像标签。熟悉代码后,使用最新版本号更新映像,这应该会在您的集成/开发环境中触发部署。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-01-06
      • 2023-03-18
      • 2017-07-22
      • 2019-03-10
      • 2019-12-05
      • 2021-11-29
      • 2018-02-14
      • 2015-07-14
      相关资源
      最近更新 更多