Kubernetes:使用gce-proxy的initContainer?

时间:2017-04-13 15:00:54

标签: kubernetes google-cloud-sql google-kubernetes-engine

我需要在运行我们的应用程序之前更新我的数据库架构。对于基于this threadthis answer的问题,我决定使用init容器来完成这项工作。

由于我的SQL实例是托管的Google Cloud SQL实例,因此我需要appendChild才能连接到数据库。我的initContainers看起来像这样:

gce-proxy

但我的吊舱卡住了:

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]

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

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)

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

3 个答案:

答案 0 :(得分:2)

您希望init容器彼此相邻,就像pod中的普通容器一样。

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

  

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

     
      
  • 他们总是跑完。
  •   
  • 每一个必须在下一个启动之前成功完成。
  •   

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

解决方案是构建一个包含二进制文件的容器,然后使用shell脚本来代理代理并运行应用程序。

答案 1 :(得分:-2)

您正在使用需要运行完成的init容器。在您查询数据库时,云SQL代理需要始终运行。为此,推荐的运行方式是使用第二个容器并将其作为中的 sidecar容器运行。

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

答案 2 :(得分:-6)

你正在使用Init Containers而没有阅读文档并正确理解它们的用途,遇到错误时,当其他人指出时,态度不好。

解决方案: 在执行任何实现之前,请阅读有关Init Containers的文档。