在服务帐户之前创建Helm预安装作业

问题描述

作为我的应用程序掌舵图的一部分,我有一个作业,它可以运行数据库迁移。我已经用钩子"helm.sh/hook": pre-install,pre-upgrade注释了该作业,以确保在部署应用程序之前运行迁移。我想使用与应用程序部署相同的服务帐户和配置映射,但是在执行作业时尚未创建这些资源,导致出现以下错误:

Warning FailedCreate 8s job-controller Error creating: pods "db-migrate-" is forbidden: error looking up service account dev-platform/platform: serviceaccount "platform" not found

根据头盔安装order,应在作业之前创建服务帐户和配置映射。以pre-install运行作业时,行为是否无效?:

apiVersion: batch/v1
kind: Job
metadata:
  namespace: dev-platform
  name: db-migrate
  annotations:
    "helm.sh/hook": pre-install,pre-upgrade
    "helm.sh/hook-delete-policy": hook-succeeded
spec:
  activeDeadlineSeconds: 300
  backoffLimit: 1
  template:
    spec:
      # Share platform service account IAM role.
      serviceAccountName: {{ .Release.Name }}
      securityContext:
        fsGroup: 65534 #  Allow read permissions of AWS token files for IAM service account token.
      restartPolicy: Never
      containers:
        - name: db-migrate
          image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
          imagePullPolicy: {{ .Values.image.pullPolicy }}
          envFrom:
            - configMapRef:
                name: platform-config
            - secretRef:
                name: platform-secrets
          # Overwrite APP_COMMAND variable.
          env:
            - name: APP_COMMAND
              value: migrate
            - name: APP_ENVIRONMENT
              value: {{ .Values.image.appEnvironment | quote }}

解决方法

是的,在官方文档中,有一个预安装的挂钩:

在渲染模板之后但在Kubernetes中创建任何资源之前执行 (docs

我建议将迁​​移内容作为主应用程序的pod的初始化容器。这样,重用现有的configmap和服务帐户就变得微不足道了。在启动容器容器之前,初始化容器需要运行至完成。这样,您还可以确保在启动应用程序之前已迁移数据库。有关初始化容器的正式文档,请参见here

,

头盔挂钩不仅限于乔布斯。

您可以在预安装阶段本身使用与Job相同的helm-hook注释创建serviceaccount和configmap。

注意:如果在预安装阶段之后需要可用的serviceaccount和configmap,请不要将'helm.sh/hook-delete-policy'设置为'hook-succeeded'。

示例:

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 创建时,如前面的示例中一样,出现此错误(有点令人困惑):

Error: ServiceAccount "demo-33-service-account" is invalid: metadata.labels: Invalid value: "-10": a valid label must be an empty string or consist of alphanumeric characters,'-','_' or '.',and must start and end with an alphanumeric character (e.g. 'MyValue',or 'my_value',or '12345',regex used for validation is '(([A-Za-z0-9][-A-Za-z0-9_.]*)?[A-Za-z0-9])?')

这是因为helm.sh/hook-weight: "-10"

我还尝试仅使用正权重(ServiceAccount 为 0,Job 为 10),但没有运气 - Job 在创建 ServiceAccount 之前开始并且卡住了。当我手动删除由钩子成功创建的卡住的 JobServiceAccount 时。认为这是因为钩子在呈现模板之后执行,但在 Kubernetes 中创建任何资源之前(请参阅 pre-install in docs)。

也许 post-installJob 钩子会拯救,但我使用 initContainers 解决了我的迁移工作(感谢 @winston)。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...