作为我的应用程序掌舵图的一部分,我有一个作业,它可以运行数据库迁移。我已经用钩子"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 }}
答案 0 :(得分:1)
是的,在官方文档中,有一个预安装的挂钩:
在渲染模板之后但在Kubernetes中创建任何资源之前执行 (docs)
我建议将迁移内容作为主应用程序的pod的初始化容器。这样,重用现有的configmap和服务帐户就变得微不足道了。在启动容器容器之前,初始化容器需要运行至完成。这样,您还可以确保在启动应用程序之前已迁移数据库。有关初始化容器的正式文档,请参见here。
答案 1 :(得分:1)
头盔挂钩不仅限于乔布斯。
您可以在预安装阶段本身使用与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"
答案 2 :(得分:0)
当我使用 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
之前开始并且卡住了。当我手动删除由钩子成功创建的卡住的 Job
、ServiceAccount
时。认为这是因为钩子在呈现模板之后执行,但在 Kubernetes 中创建任何资源之前(请参阅 pre-install in docs)。
也许 post-install
的 Job
钩子会拯救,但我使用 initContainers
解决了我的迁移工作(感谢 @winston)。