Kubernetes 在服务帐户之前创建头盔预安装作业
作为我的应用程序helm chart的一部分,我有一项运行数据库迁移的工作。我已经用hook helm.sh/hook注释了这个作业:预安装、预升级,以确保在部署应用程序之前运行迁移。我希望使用与我的应用程序部署使用的相同的服务帐户和配置映射,但是在执行作业时尚未创建这些资源,导致以下错误: 警告失败创建8s作业控制器错误创建:pods db迁移-被禁止:查找服务帐户时出错开发平台/平台:未找到serviceaccount平台 根据helm安装,应在作业之前创建服务帐户和配置映射。作为预安装运行作业时,行为是否无效Kubernetes 在服务帐户之前创建头盔预安装作业,kubernetes,kubernetes-helm,Kubernetes,Kubernetes Helm,作为我的应用程序helm chart的一部分,我有一项运行数据库迁移的工作。我已经用hook helm.sh/hook注释了这个作业:预安装、预升级,以确保在部署应用程序之前运行迁移。我希望使用与我的应用程序部署使用的相同的服务帐户和配置映射,但是在执行作业时尚未创建这些资源,导致以下错误: 警告失败创建8s作业控制器错误创建:pods db迁移-被禁止:查找服务帐户时出错开发平台/平台:未找到serviceaccount平台 根据helm安装,应在作业之前创建服务帐户和配置映射。作为预安装运行
是的,根据官方文档,预安装挂钩: 在呈现模板之后,但在Kubernetes中创建任何资源之前执行
我建议将迁移作为init容器迁移到主应用程序的pod。这样,重用现有的configmaps和服务帐户就变得微不足道了。在pods容器启动之前,Init容器需要运行到完成。这样,您还可以确保在启动应用程序之前迁移数据库。有关init容器的官方文档,请参阅。是的,从官方文档中,预安装挂钩: 在呈现模板之后,但在Kubernetes中创建任何资源之前执行
我建议将迁移作为init容器迁移到主应用程序的pod。这样,重用现有的configmaps和服务帐户就变得微不足道了。在pods容器启动之前,Init容器需要运行到完成。这样,您还可以确保在启动应用程序之前迁移数据库。有关init容器的官方文档,请参阅。头盔挂钩不限于作业 您可以在预安装阶段使用与作业相同的helm hook注释创建serviceaccount和configmap 注意:如果在预安装阶段后需要可用的serviceaccount和configmap,请不要将“helm.sh/hook删除策略”设置为“hook successed” 例如:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
annotations:
helm.sh/hook: pre-install
helm.sh/hook-delete-policy: before-hook-creation
helm.sh/hook-weight: "-10"
舵钩不限于工作 您可以在预安装阶段使用与作业相同的helm hook注释创建serviceaccount和configmap 注意:如果在预安装阶段后需要可用的serviceaccount和configmap,请不要将“helm.sh/hook删除策略”设置为“hook successed” 例如:
apiVersion: v1
kind: ServiceAccount
metadata:
name: my-sa
annotations:
helm.sh/hook: pre-install
helm.sh/hook-delete-policy: before-hook-creation
helm.sh/hook-weight: "-10"
当我使用Helm钩子运行ServiceAccount创建时(如前一个示例中所示),会有点混淆此错误:
错误:ServiceAccount demo-33-service-account无效:元数据。标签:无效值:-10:有效标签必须是空字符串或由字母数字字符“-”、“u”或“.”组成,并且必须以字母数字字符开头和结尾,例如“MyValue”或“my_value”或“12345”,用于验证的正则表达式是“[a-Za-z0-9][a-Za-z0-9]”*?[A-Za-z0-9]?'
这是因为头盔。sh/钩重:-10
我还尝试对ServiceAccount仅使用正权重0,对作业仅使用正权重10,但运气不好-作业在ServiceAccount创建和阻塞之前启动。当我手动删除阻塞的作业时,由挂钩创建的ServiceAccount成功。我想这是因为挂钩在呈现模板之后,但在K中创建任何资源之前执行优步网见
也许安装后的hook for Job会起到解救作用,但我使用initContainers为迁移作业解决了这个问题,谢谢@winston。当我使用Helm hooks创建ServiceAccount时,就像前面的示例一样,这个错误让人有点困惑:
错误:ServiceAccount demo-33-service-account无效:元数据。标签:无效值:-10:有效标签必须是空字符串或由字母数字字符“-”、“u”或“.”组成,并且必须以字母数字字符开头和结尾,例如“MyValue”或“my_value”或“12345”,用于验证的正则表达式是“[a-Za-z0-9][a-Za-z0-9]”*?[A-Za-z0-9]?'
这是因为头盔。sh/钩重:-10
我还尝试对ServiceAccount仅使用正权重0,对作业仅使用正权重10,但运气不好-作业在ServiceAccount创建和阻塞之前启动。当我手动删除阻塞的作业时,由挂钩创建的ServiceAccount成功。我想这是因为挂钩在呈现模板之后,但在K中创建任何资源之前执行优步网见
也许作业的安装后钩子会起到解救作用,但我在迁移作业中使用initContainers解决了这个问题,谢谢@winston。谢谢@winston。由于部署的每个pod都运行Init容器,我偏离了这种方法。如果超过ne吊舱正在创建中
d同时?如果我继续执行预安装钩子路径,看起来我必须以不同的方法传递数据库配置,可能需要创建作业自己的配置映射,该映射从与applicationHey@JamesDowning相同的值文件中提取!这一切都取决于你正在部署的应用程序。理想情况下,运行迁移的容器应该在这样做时锁定数据库,而pod的其他副本则等待迁移完成。然而,这需要一个特别健壮的应用程序,它并不总是可行的。初始化作业的另一种方法是,还可以部署一个普通的、带有helm的旧作业来运行迁移,并让初始化作业检查所述迁移作业是否已经完成,有点像这样:谢谢@winston。由于部署的每个pod都运行Init容器,所以我偏离了这种方法。如果同时创建多个pod,在执行数据库迁移时,这难道不会导致问题吗?如果我继续执行预安装钩子路径,看起来我必须以不同的方法传递数据库配置,可能需要创建作业自己的配置映射,该映射从与applicationHey@JamesDowning相同的值文件中提取!这一切都取决于你正在部署的应用程序。理想情况下,运行迁移的容器应该在这样做时锁定数据库,而pod的其他副本则等待迁移完成。然而,这需要一个特别健壮的应用程序,它并不总是可行的。init作业的另一种方法是部署一个普通的旧作业,该作业带有运行迁移的helm,并具有检查所述迁移作业是否已完成的init作业,有点像这样:这正是我最终实现的方法。但是,您能否澄清一下,没有设置钩子删除策略。巧合的是,我为作业所需的confimap和secrets文件设置了helm.sh/hook-delete-policy:hook successed,它似乎可以工作,我只希望configmap和secrets可用于作业,一旦作业完成,它们就可以被删除。是的,如果在预安装阶段后没有使用configmap和serviceccount,您可以将删除策略设置为hook successed。它将适用于您的工作,但不会在以后使用。这正是我最终实现的方法。但是,您能否澄清一下,没有设置钩子删除策略。巧合的是,我为作业所需的confimap和secrets文件设置了helm.sh/hook-delete-policy:hook successed,它似乎可以工作,我只希望configmap和secrets可用于作业,一旦作业完成,它们就可以被删除。是的,如果在预安装阶段后没有使用configmap和serviceccount,您可以将删除策略设置为hook successed。它将适用于您的工作,但不适用于以后的工作。