以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号!
目录
一、背景介绍
笔者原先在 Kubernetes 环境下部署了一套测试服务,包含前端、后端、数据库三个模块,采用 Helm Chart 方式分别进行安装,对应的 Chart 实例名称分别为 front、backend、database,管理的资源对象涵盖了 deployment、pvc、service、ingress、configmap 等类型。
近期笔者打算将其部署形式进行改造,由一个 Chart 实例统一管理三个模块所有的资源对象,并且在部署完成后该 Chart 实例可以直接纳管之前已经创建好的资源对象。
本文将介绍如何在不清理已有资源对象、不迁移已有数据的情况下,变更已有资源对象所属 Chart 实例的兼容性解决方案。
二、解决方案
如果想让改造后的新 Chart 实例(以下简称为 application)可以直接纳管之前已经创建好的资源对象,首先需要将原先三个模块的 Chart 改造为新 Chart 的子 Charts,这样相关资源对象的定义就不会变化,安装时也不会创建出新的资源对象。
但是直接执行 helm upgrade 命令安装 application 会报错:
Error: rendered manifests contain a resource that already exists.
Unable to continue with install:
ConfigMap "front" in namespace "xxxx" exists and cannot be imported into the current release:
invalid ownership metadata; annotation validation error:
key "meta.helm.sh/release-name" must equal "application":
current value is "front"
报错信息表明,当前资源对象的定义中已经存在注解 "meta.helm.sh/release-name" ,且值还是已有 Chart 实例的名称(如 front、backend、database),但是新实例 application 要求资源对象的注解 "meta.helm.sh/release-name" 值必须是 application,所以导致 application 安装失败。
先尝试移除相关资源对象的注解 "meta.helm.sh/release-name",命令如下:
kubectl annotate deploy --all meta.helm.sh/release-name-
kubectl annotate pvc --all meta.helm.sh/release-name-
kubectl annotate svc --all meta.helm.sh/release-name-
kubectl annotate ing --all meta.helm.sh/release-name-
kubectl annotate cm --all meta.helm.sh/release-name-
出现新的报错,表明注解 "meta.helm.sh/release-name" 缺失了:
Error: rendered manifests contain a resource that already exists.
Unable to continue with install:
ConfigMap "front" in namespace "xxxx" exists and cannot be imported into the current release:
invalid ownership metadata; annotation validation error:
missing key "meta.helm.sh/release-name": must be set to "application"
再次尝试覆盖相关资源对象的注解 "meta.helm.sh/release-name" 的值为 application,命令如下:
kubectl annotate deploy --all meta.helm.sh/release-name=application --overwrite
kubectl annotate pvc --all meta.helm.sh/release-name=application --overwrite
kubectl annotate svc --all meta.helm.sh/release-name=application --overwrite
kubectl annotate ing --all meta.helm.sh/release-name=application --overwrite
kubectl annotate cm --all meta.helm.sh/release-name=application --overwrite
执行 helm upgrade 命令安装 application 成功!所有资源对象运行状态正常,服务状态正常。
三、遗留问题
此时,原先的 Chart 实例 front、backend、database 仍然存在,且执行 helm uninstall 命令还是会移除相关资源对象,说明实质的管理关系没有完全解除。
新 Chart 实例直接纳管已有资源对象的预期已经实现了,虽然这种处理方案在生产环境下还是存在未知隐患的,但对于测试环境来说已经足够了,后续有空再深入研究其中的问题。