在Minikube上掌舵:更新本地图像

时间:2019-06-02 12:40:10

标签: kubernetes-helm minikube

我已初始化了Helm(v2.13.1)在本地运行的Minikube(v1.1.0),并将本地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

2 个答案:

答案 0 :(得分:2)

当您进行这样的更改时,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并不是真正被设计为实时开发环境。

答案 1 :(得分:0)

解决此问题的一种方法是使用Google的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上运行”。

您只需要在掌舵图中进行更改,即可使用配置文件从Skaffold yaml中读取图像网址。

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

这将从配置的url读取图像,而在本地,则应从docker守护程序读取图像。但是,当您对任何文件进行任何更改时,云代码也可以提供热更新/部署。在本地测试图像标记时,不必总是提及图像标记。使用完代码后,请使用最新版本号更新映像,这将触发在集成/开发环境中的部署。

相关问题