Kubernetes 如何在helm chart预安装钩子中关闭云sql代理
我正在gcloud上的Kubernetes集群中运行django应用程序。我将数据库迁移实现为helm pre-intall钩子,它启动我的应用程序容器并进行数据库迁移。我在官方教程中推荐的侧车模式中使用云sql代理: 基本上,这会在作业描述的pod中启动我的应用程序和云sql代理容器。问题是,云sql代理在我的应用程序完成迁移后从未终止,导致预安装作业超时并取消我的部署。在我的应用程序容器完成后,如何优雅地退出云sql代理容器,以便作业可以完成 以下是我的头盔预安装挂钩模板定义:Kubernetes 如何在helm chart预安装钩子中关闭云sql代理,kubernetes,gcloud,kubernetes-helm,cloud-sql-proxy,Kubernetes,Gcloud,Kubernetes Helm,Cloud Sql Proxy,我正在gcloud上的Kubernetes集群中运行django应用程序。我将数据库迁移实现为helm pre-intall钩子,它启动我的应用程序容器并进行数据库迁移。我在官方教程中推荐的侧车模式中使用云sql代理: 基本上,这会在作业描述的pod中启动我的应用程序和云sql代理容器。问题是,云sql代理在我的应用程序完成迁移后从未终止,导致预安装作业超时并取消我的部署。在我的应用程序容器完成后,如何优雅地退出云sql代理容器,以便作业可以完成 以下是我的头盔预安装挂钩模板定义: apiVer
apiVersion: batch/v1
kind: Job
metadata:
name: database-migration-job
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
app.kubernetes.io/version: {{ .Chart.AppVersion }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": pre-install,pre-upgrade
"helm.sh/hook-weight": "-1"
"helm.sh/hook-delete-policy": hook-succeeded,hook-failed
spec:
activeDeadlineSeconds: 230
template:
metadata:
name: "{{ .Release.Name }}"
labels:
app.kubernetes.io/managed-by: {{ .Release.Service | quote }}
app.kubernetes.io/instance: {{ .Release.Name | quote }}
helm.sh/chart: "{{ .Chart.Name }}-{{ .Chart.Version }}"
spec:
restartPolicy: Never
containers:
- name: db-migrate
image: {{ .Values.my-project.docker_repo }}{{ .Values.backend.image }}:{{ .Values.my-project.image.tag}}
imagePullPolicy: {{ .Values.my-project.image.pullPolicy }}
env:
- name: DJANGO_SETTINGS_MODULE
value: "{{ .Values.backend.django_settings_module }}"
- name: SENDGRID_API_KEY
valueFrom:
secretKeyRef:
name: sendgrid-api-key
key: sendgrid-api-key
- name: DJANGO_SECRET_KEY
valueFrom:
secretKeyRef:
name: django-secret-key
key: django-secret-key
- name: DB_USER
value: {{ .Values.postgresql.postgresqlUsername }}
- name: DB_PASSWORD
{{- if .Values.postgresql.enabled }}
value: {{ .Values.postgresql.postgresqlPassword }}
{{- else }}
valueFrom:
secretKeyRef:
name: database-password
key: database-pwd
{{- end }}
- name: DB_NAME
value: {{ .Values.postgresql.postgresqlDatabase }}
- name: DB_HOST
{{- if .Values.postgresql.enabled }}
value: "postgresql"
{{- else }}
value: "127.0.0.1"
{{- end }}
workingDir: /app-root
command: ["/bin/sh"]
args: ["-c", "python manage.py migrate --no-input"]
{{- if eq .Values.postgresql.enabled false }}
- name: cloud-sql-proxy
image: gcr.io/cloudsql-docker/gce-proxy:1.17
command:
- "/cloud_sql_proxy"
- "-instances=<INSTANCE_CONNECTION_NAME>=tcp:<DB_PORT>"
- "-credential_file=/secrets/service_account.json"
securityContext:
#fsGroup: 65532
runAsNonRoot: true
runAsUser: 65532
volumeMounts:
- name: db-con-mnt
mountPath: /secrets/
readOnly: true
volumes:
- name: db-con-mnt
secret:
secretName: db-service-account-credentials
{{- end }}
apiVersion:batch/v1
种类:工作
元数据:
名称:数据库迁移作业
标签:
app.kubernetes.io/managed-by:{{.Release.Service | quote}
app.kubernetes.io/instance:{{.Release.Name | quote}
app.kubernetes.io/version:{{.Chart.AppVersion}
helm.sh/chart:“{{.chart.Name}}-{{.chart.Version}”
注释:
#这就是将此资源定义为钩子的原因。如果没有这条线
#作业被认为是发布的一部分。
“舵手/吊钩”:预安装、预升级
“舵轮/钩重”:“-1”
“掌舵/钩子删除策略”:钩子成功,钩子失败
规格:
活动死线秒数:230
模板:
元数据:
名称:“{.Release.name}”
标签:
app.kubernetes.io/managed-by:{{.Release.Service | quote}
app.kubernetes.io/instance:{{.Release.Name | quote}
helm.sh/chart:“{{.chart.Name}}-{{.chart.Version}”
规格:
餐馆政策:永不
容器:
-名称:db迁移
图像:{.Values.my-project.docker_repo}{{.Values.backend.image}}:{{.Values.my project.image.tag}
imagePullPolicy:{{.Values.my-project.image.pullPolicy}}
环境:
-名称:DJANGO_设置_模块
值:“{{.Values.backend.django_设置_模块}”
-名称:SENDGRID\u API\u密钥
价值来源:
secretKeyRef:
名称:sendgrid api密钥
密钥:sendgrid api密钥
-名称:DJANGO_密钥
价值来源:
secretKeyRef:
姓名:django密钥
密钥:django密钥
-姓名:DB_用户
值:{{.Values.postgresql.postgresqlUsername}
-名称:DB_密码
{{-if.Values.postgresql.enabled}
值:{{.Values.postgresql.postgresqlPassword}}
{{-else}
价值来源:
secretKeyRef:
名称:数据库密码
关键字:数据库pwd
{{-end}
-姓名:DB_姓名
值:{{.Values.postgresql.postgresqlDatabase}}
-名称:DB_主机
{{-if.Values.postgresql.enabled}
值:“postgresql”
{{-else}
值:“127.0.0.1”
{{-end}
工作目录:/app root
命令:[“/bin/sh”]
args:[“-c”,“python manage.py migrate--无输入”]
{{-if eq.Values.postgresql.enabled false}
-名称:云sql代理
图片:gcr.io/cloudsqldocker/gce代理:1.17
命令:
-“/cloud\u sql\u proxy”
-“-实例==tcp:”
-“-credential_file=/secrets/service_account.json”
securityContext:
#金融服务组:65532
runAsNonRoot:true
runAsUser:65532
体积数量:
-姓名:db con mnt
挂载路径:/机密/
只读:正确
卷数:
-姓名:db con mnt
秘密:
secretName:db服务帐户凭据
{{-end}
有趣的是,如果我在迁移完成后用“kubectl delete jobs database migration job”终止任务,helm升级就完成了,并且安装了我的新应用程序版本。好吧,我有一个解决方案可以工作,但可能有问题。首先,这是库伯内特斯缺乏的特点,这是在讨论这一点 对于Kubernetes v1.17,容器位于相同的位置。这使我们能够从应用程序容器中删除代理容器。因为这是Kubernetes的工作,所以应用程序容器不应该有任何异常
使用此解决方案,当您的应用程序正常(或异常)完成并退出时,Kubernetes将从即将死亡的容器中运行最后一个命令,在这种情况下,该命令将是
杀死另一个进程。这将导致作业完成,成败取决于您将如何终止该过程。进程退出代码将是容器退出代码,然后它将基本上是作业退出代码。好吧,我有一个解决方案可以工作,但可能有问题。首先,这是库伯内特斯缺乏的特点,这是在讨论这一点
对于Kubernetes v1.17,容器位于相同的位置。这使我们能够从应用程序容器中删除代理容器。因为这是Kubernetes的工作,所以应用程序容器不应该有任何异常
使用此解决方案,当您的应用程序正常(或异常)完成并退出时,Kubernetes将从即将死亡的容器中运行最后一个命令,在这种情况下,该命令将是杀死另一个进程。这将导致作业完成,成败取决于您将如何终止该过程。进程退出代码将是容器退出代码,然后基本上是作业退出代码。非常好的信息。“POD可以共享进程名称空间”特别有用。在命令中完成迁移后,我使用进程共享通过简单的“kullall”终止“cloudsqlproxy”可执行文件。这就成功了。然而,当我尝试“preStop”时,我想我遇到了这个bug:。基本上,我的preStop从未执行过。也许我错过了什么。谢谢。是的,我不知道在工作中会有什么不同。您可以将dockerfile命令字段转换为script.sh,并通过从作业开始创建该文件