Kubernetes:带有 gce-proxy 的 initContainer?

问题描述 投票:0回答:3

我需要在运行我们的应用程序之前更新我的数据库架构。对于基于这个线程这个答案我决定使用init容器来完成这项工作。

由于我的 SQL 实例是托管的 Google Cloud SQL 实例,因此我需要

gce-proxy
才能连接到数据库。我的 initContainers 看起来像这样:

 initContainers:
    - name: cloudsql-proxy-init
      image: gcr.io/cloudsql-docker/gce-proxy:1.09
      command: ["/cloud_sql_proxy"]
      args:
        - --dir=/cloudsql
        - -instances=xxxx:europe-west1:yyyyy=tcp:5432
        - -credential_file=/secrets/cloudsql/credentials.json
      volumeMounts:
        - name: dev-db-instance-credentials
          mountPath: /secrets/cloudsql
          readOnly: true
        - name: ssl-certs
          mountPath: /etc/ssl/certs
        - name: cloudsql
          mountPath: /cloudsql
    - name: liquibase
      image: eu.gcr.io/xxxxx/liquibase:v1
      imagePullPolicy: Always
      command: ["./liquibase.sh"]
      env:
        - name: DB_TYPE
          value: postgresql
        - name: DB_URL
          value: jdbc:postgresql://localhost/test
        - name: DB_PASSWORD
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: password
        - name: DB_USER
          valueFrom:
            secretKeyRef:
              name: db-credentials
              key: username

但是我的 Pod 卡住了:

containers with incomplete status: [cloudsql-proxy-init liquibase]

如果我查看 pod 描述:

Init Containers:
  cloudsql-proxy-init:
    Container ID:   docker://0373fa6528ec3768d46a1c59ca45f12d9fc46d1f0d199b7eb3772545701e1b1d
    Image:      gcr.io/cloudsql-docker/gce-proxy:1.09
    Image ID:       docker://sha256:66c58ef63dbfe239ff95416d62635559498ebb395abb8a4b1edee78e48e05fe4
    Port:
    Command:
      /cloud_sql_proxy
    Args:
      --dir=/cloudsql
      -instances=xxxxx:europe-west1:yyyyyy=tcp:5432
      -credential_file=/secrets/cloudsql/credentials.json
    State:      Running
      Started:      Thu, 13 Apr 2017 17:40:02 +0300
    Ready:      False
    Restart Count:  0
    Mounts:
      /cloudsql from cloudsql (rw)
      /etc/ssl/certs from ssl-certs (rw)
      /secrets/cloudsql from dev-db-instance-credentials (ro)
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-th58c (ro)
 liquibase:
    Container ID:
    Image:      eu.gcr.io/xxxxxx/liquibase:v1
    Image ID:
    Port:
    Command:
      ./liquibase.sh
    State:      Waiting
      Reason:       PodInitializing
    Ready:      False
    Restart Count:  0
    Environment:
      DB_TYPE:      postgresql
      DB_URL:       jdbc:postgresql://localhost/test
      DB_PASSWORD:  <set to the key 'password' in secret 'db-credentials'>  Optional: false
      DB_USER:      <set to the key 'username' in secret 'db-credentials'>  Optional: false
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-th58c (ro)

并且 cloud-sql-proxy-init 似乎正在运行:

2017/04/13 14:40:02 using credential file for authentication; [email protected]
2017/04/13 14:40:02 Listening on 127.0.0.1:5432 for xxxxx:europe-west1:yyyyy
2017/04/13 14:40:02 Ready for new connections

这可能是问题所在,因为 init 容器应该退出以便初始化可以继续?那么如何从 liquibase 连接到 Google Cloud SQL 实例呢?

kubernetes google-cloud-sql google-kubernetes-engine
3个回答
4
投票

您期望 init 容器都像 Pod 中的普通容器一样彼此相邻运行。

但不幸的是,当前一个容器完成时,初始化容器会一个接一个地启动。看 https://kubernetes.io/docs/concepts/workloads/pods/init-containers/#understanding-init-containers

Init 容器与常规容器完全相同,除了:

  • 他们总是能完成。
  • 每一项都必须成功完成才能开始下一项。

因此您将无法与应用程序容器一起运行代理容器。

解决方案是构建一个包含两个二进制文件的容器,然后使用 shell 脚本将代理置于后台并运行应用程序直至完成。


0
投票

自 kubernetes

v1.29
起,sidecar 容器作为
initContainer
得到支持。请参阅https://kubernetes.io/docs/concepts/workloads/pods/sidecar-containers/#sidecar-containers-and-pod-lifecycle


-3
投票

您正在使用需要运行才能完成的初始化容器。当您查询数据库时,Cloud SQL 代理需要始终运行。为此,建议的运行方法是拥有第二个容器并将其作为 pod 中的 sidecar 容器 运行。

您可以在此处找到示例:https://github.com/GoogleCloudPlatform/container-engine-samples/tree/master/cloudsql

© www.soinside.com 2019 - 2024. All rights reserved.