2017-04-13 8 views
1

Google 애플리케이션을 실행하기 전에 데이터베이스 스키마를 업데이트해야합니다. this threadthis answer을 기반으로하는 경우 init 컨테이너를 사용하여 작업을 수행하기로 결정했습니다.Kubernetes : gce-proxy가있는 initContainer입니까?

내 SQL 인스턴스가 호스팅 된 Google Cloud SQL 인스턴스이므로 데이터베이스에 연결할 수 있으려면 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 

하지만 내 포드가 붙어 : 내 initContainers은 다음과 같습니다

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

내가 포드 보면

는 설명 :

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) 

그리고 그것은 보인다 클라우드 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 인스턴스에 연결할 수 있습니까?

답변

1

초기 컨테이너가 포드의 일반 컨테이너처럼 서로 옆에 실행될 것으로 예상됩니다.

하지만 안타깝게도 init 컨테이너는 이전 컨테이너가 완료 될 때마다 차례대로 시작됩니다.

따라서 앱 컨테이너와 함께 프록시 컨테이너를 실행할 수 없습니다.

해결 방법은 바이너리가 들어있는 컨테이너를 작성한 다음 쉘 스크립트를 사용하여 프록시를 백그라운드로 실행하고 응용 프로그램을 완료로 실행하는 것입니다.

+0

대만족을 – gerasalus

+0

또한 물론 다른 포드에서 프록시를 실행할 수 있지만, 난 당신이에 그 일을하지 않는 이유가 있었다 가정 ... 커플 링을 피하기 위해 호핑 된 첫번째 장소 –

0

완료까지 실행해야하는 초기화 컨테이너를 사용 중입니다. 클라우드 SQL 프록시는 데이터베이스를 쿼리하는 동안 항상 실행되어야합니다. 이를 위해 두 번째 컨테이너를 가지고 실행하려면 사이드카 컨테이너을 포드에 넣는 것이 좋습니다.

당신은 여기에서 예를 찾을 수 있습니다

: https://github.com/GoogleCloudPlatform/container-engine-samples/tree/master/cloudsql

+0

나는 당신이 질문을 완전히 이해했다고 생각하지 않는다. :) 정규 컨테이너에 대한 설정이 있습니다. 그러나 정규 컨테이너를 시작하기 전에 데이터베이스를 업데이트해야합니다. – gerasalus