Helm 让 Kubernetes 应用程序的管理工作变得毫不费力。Helm Charts 使 Kubernetes 应用程序的安装和升级更加容易。本文将讨论 Helm 的一个极妙的技巧:如何使用 Helm,简单快速地更新那些使用 ConfigMap 的应用程序。
更新部署
上图的示例就是一个部署的配置文件。我们假设它是用于运行应用程序的。您可以在 spec.template 部分下指定 pod 模板。现在,如果您想更新应用程序,则必须从此 spec.template 部分更改内容。这意味着,容器镜像更改之后,部署将更新,但 spec.replicas 不会发生任何改变。
更新使用 ConfigMap 的部署
某些应用需要某些特定的配置文件和值,我们不建议将这些配置文件或配置值打包进容器镜像中,因为如果这么做的话,那每次配置文件发生更改时,都必须重新创建容器镜像。而 Kubernetes 提供了一种管理配置文件/值的好方法——使用 ConfigMap 资源。
有两种方法可以将 ConfigMap 数据暴露给一个 pod:
Env vars
Volume mounts
下面我们将重点关注暴露 ConfigMap 的卷挂载方式。
我创建了一个非常简单的 chart 作为例子来讨论这个问题。在这个 chart 中,我有一个如下的 ConfigMap 的配置文件:
如您所见,ConfigMap 的名称是 nginx-cm,一个名为 default.conf 的文件正在读取其数据。这个 default.conf 是一个 nginx 配置文件。
现在我想为我的应用程序使用这个 ConfigMap nginx-cm。所以我将通过我的应用程序的部署的配置文件中的 Volume Mounts 来暴露它。
如上面的示例,我们需要在 【volumes】 部分下添加 ConfigMap,并为其指定一个唯一的名称(config-volume,如示例中所示)。然后,我们需要将这个卷添加到 【containers】 部分下的卷挂载中。volumeMounts.mountPath 字段是容器中可供容器使用的配置文件的确切位置。
因此,使用这些配置文件,我们就可以运行使用 ConfigMap 提供的 nginx 配置文件内容的应用程序了。
下面我们需要更改 nginx 配置文件。更改此配置文件后,不要忘了还需要相应地更新 ConfigMap,不然的话,那些使用此 ConfigMap 的应用程序将不会使用更新后的内容。
我们当然也可以使用kubectl update
命令来更新 ConfigMap。按理说,同样的,接下来我们应该更新部署。那么,kubectl update
命令可以用来更新部署吗?
在我尝试这么做的时候,我收到了下面这条消息:
这是因为即使在更新 ConfigMap 资源之后,部署的 spec.template 部分也没有更改。即使 ConfigMap 的数据部分发生了变化,但这并没有引起部署 spec.template 的任何变化。对此的一种解决方法,是删除这一部署所管理的所有 pod,之后部署就会创建新的 pod,这些新 pod 使用的就是更新后的 configMap 了。
但我不太喜欢这种方法,因为你必须手动删除所有的 pod,正因为如此我才开始寻找更好的解决方案,也就是本文所说的 Helm 的这个小技巧。
正如你在注释中看到的那样, 你可以提供 configmap 文件的路径,并将其传递给 sha256 sum 函数。这样一来,每次 configmap 文件发生更改时,注释部分也会得到相应的更新,进而更新部署的 spec.template 部分。我发现这一招非常妙,因为如此一来,你就可以 经常更改您的配置文件内容 了。因为这个诀窍,Helm 能够确保你的应用程序将一直及时地反映这些变化。
我已经做好了一个 Helm chart 放在 GitHub 上,你可以自行下载使用,体验一下我在本文中分享的这个窍门~ 相信你一定也会发现它对你的应用程序非常有用:
https://github.com/mrajashree/helm-cm1
英文原文:
https://rancher.com/blog/2018/helm-tips-and-tricks-updating-app-with-configmap/
评论