2

Cloud SQL (Postgres)으로 마이그레이션하려고합니다. 저는는 Kubernetes에 다음과 같은 배치는이 지침 https://cloud.google.com/sql/docs/mysql/connect-container-engine 따라 한 한 :Kubernetes의 컨테이너에 Cloud SQL 자격 증명을 마운트하는 데 문제가 발생했습니다.

apiVersion: extensions/v1beta1 
kind: Deployment 
metadata: 
    name: menu-service 
spec: 
    replicas: 1 
    template: 
    metadata: 
     labels: 
     app: menu-service 
    spec: 
     volumes: 
     - name: cloudsql-instance-credentials 
      secret: 
      secretName: cloudsql-instance-credentials 
     - name: cloudsql 
      emptyDir: 
     - name: ssl-certs 
      hostPath: 
      path: /etc/ssl/certs 
     containers: 
     - image: gcr.io/cloudsql-docker/gce-proxy:1.11 
     name: cloudsql-proxy 
     command: ["/cloud_sql_proxy", "--dir=/cloudsql", 
        "-instances=tabb-168314:europe-west2:production=tcp:5432", 
        "-credential_file=/secrets/cloudsql/credentials.json"] 
     volumeMounts: 
      - name: cloudsql-instance-credentials 
      mountPath: /secrets/cloudsql 
      readOnly: true 
      - name: ssl-certs 
      mountPath: /etc/ssl/certs 
      - name: cloudsql 
      mountPath: /cloudsql 
     - name: menu-service 
     image: eu.gcr.io/tabb-168314/menu-service:develop 
     imagePullPolicy: Always 
     env: 
     - name: MICRO_BROKER 
      value: "nats" 
     - name: MICRO_BROKER_ADDRESS 
      value: "nats.staging:4222" 
     - name: MICRO_REGISTRY 
      value: "kubernetes" 
     - name: ENV 
      value: "staging" 
     - name: PORT 
      value: "8080" 
     - name: POSTGRES_HOST 
      value: "127.0.0.1:5432" 
     - name: POSTGRES_USER 
      valueFrom: 
      secretKeyRef: 
       name: cloudsql-db-credentials 
       key: username 
     - name: POSTGRES_PASS 
      valueFrom: 
      secretKeyRef: 
       name: cloudsql-db-credentials 
       key: password 
     - name: POSTGRES_DB 
      value: "menus" 
     ports: 
     - containerPort: 8080 

을하지만 불행하게도 나는 배치 업데이트하려고이 오류 받고 있어요 :

MountVolume.SetUp failed for volume "kubernetes.io/secret/69b0ec99-baaf-11e7-82b8-42010a84010c-cloudsql-instance-credentials" (spec.Name: "cloudsql-instance-credentials") pod "69b0ec99-baaf-11e7-82b8-42010a84010c" (UID: "69b0ec99-baaf-11e7-82b8-42010a84010c") with: secrets "cloudsql-instance-credentials" not found 
Error syncing pod, skipping: timeout expired waiting for volumes to attach/mount for pod "staging"/"menu-service-1982520680-qzwzn". list of unattached/unmounted volumes=[cloudsql-instance-credentials] 

내가 여기서 뭔가를 놓친를?

답변

2

이 포드를 시작하는 데 필요한 비밀 중 하나가 누락되었습니다 (즉, cloudsql-instance-credentials). https://cloud.google.com/sql/docs/mysql/connect-container-engine에서

는 :

당신은 당신의 클라우드 SQL 인스턴스의 데이터에 액세스하기 위해 컨테이너 Engine 애플리케이션을 사용하려면 두 가지 비밀이 필요합니다

  • cloudsql-instance-credentials 비밀은 서비스 계정이 포함되어 있습니다.
  • cloudsql-db-credentials 비밀은 프록시 사용자 계정과 암호를 제공합니다.

이 당신의 비밀을 만들려면 (나는이 일에 대한 오류 메시지를 볼 수 없습니다, 당신이 만든 생각) :

클라우드 SQL에 인증을 가능하게하는 서비스 계정을 포함하는 비밀을 만듭니다

kubectl create secret generic cloudsql-instance-credentials \ 
        --from-file=credentials.json=[PROXY_KEY_FILE_PATH] 

[...]

또한이없는 경우,이 목적을 위해 GCP 서비스 계정을 만드는 방법을 설명합니다 위의 링크 이미 만들어졌습니다.

+0

실제로이 두 단계를 모두 성공적으로 완료 했으므로 (5.1 및 5.2) 존재해야합니다. 내 서비스 계정에 잘못된 권한이있는 경우를 제외하고는 관리 사용자로 만들었습니다. 이상한! 다시 끝내려면 프로세스 끝을 시도해 볼 수 있습니다. 아무 것도 놓친 경우 참조하십시오. –

+1

'kubectl get secret '을 실행하여 비밀이 실제로 만들어 졌는지 확인할 수 있습니까? 이 명령은 성공해야합니다 :'kubectl secret cloudsql-instance-credentials' –

+0

두 사람 모두 성공적으로 비밀을 반환합니다. 그들은'kubectl get secret'도 같이 나타납니다. –