Kubernetes 如何在helm chart预安装钩子中关闭云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

我正在gcloud上的Kubernetes集群中运行django应用程序。我将数据库迁移实现为helm pre-intall钩子,它启动我的应用程序容器并进行数据库迁移。我在官方教程中推荐的侧车模式中使用云sql代理:

基本上,这会在作业描述的pod中启动我的应用程序和云sql代理容器。问题是,云sql代理在我的应用程序完成迁移后从未终止,导致预安装作业超时并取消我的部署。在我的应用程序容器完成后,如何优雅地退出云sql代理容器,以便作业可以完成

以下是我的头盔预安装挂钩模板定义:

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,并通过从作业开始创建该文件