

こちらteratailでも質問している内容（マルチポスト）です。  
<https://teratail.com/questions/198296>

### 前提・実現したいこと

自作railsアプリケーション（DBはMysql）をDocker環境で動くように開発し、GKE(google kubernetes
engine)にデプロイしたい

[こちらのサイト](https://qiita.com/ryu-yama/items/dc640c35a56e42ebdba8)を参考にしています

前提  
・アプリケーションはローカル（開発環境）だとdocker-compose upで正常に起動する状態  
・localのワーキングディレクトリにはkey.jsonがある  
・GCPのIAMと管理「サービス アカウントの詳細」にキーは設定されていてkey.jsonのものと同じ（メールアドレスも一致）  
・cloudsql-db-credentialsとcloudsql-instance-credentialsはGCP側に設定されている

GKE構成  
・nodeは2つ、それぞれに同じ2つpodを入れている  
・マニュフェストファイルはひとつ(deployment.yml)

[code]

    #key.json
    {
      "type": "service_account",
      "project_id": "プロジェクト名",
      "private_key_id": "・・・8a8c5",
      "private_key": "-----BEGIN PRIVATE KEY-----\n・・・BfYN\nMkTAtnTgtiC77mllNDhONA==\n-----END PRIVATE KEY-----\n",
      "client_email": "test-user@プロジェクト名.iam.gserviceaccount.com",
      "client_id": "・・・06700",
      "auth_uri": "https://accounts.google.com/o/oauth2/auth",
      "token_uri": "https://oauth2.googleapis.com/token",
      "auth_provider_x509_cert_url": "https://www.googleapis.com/oauth2/v1/certs",
      "client_x509_cert_url": "https://www.googleapis.com/robot/v1/metadata/x509/test-user%40プロジェクト名.iam.gserviceaccount.com"
    }
    
[/code]

### 発生している問題・エラーメッセージ

GKEにデプロイする際にエラー（podのstatusがCrashLoopBackOff）になってしまう。

[code]

    textPayload:  "/usr/local/bundle/gems/railties-5.2.3/lib/rails/application.rb:585:in `validate_secret_key_base': Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit` (ArgumentError)
    
[/code]

[code]

    textPayload:  "2019/07/02 14:18:29 invalid json file "./key.json": open ./key.json: no such file or directory
    
[/code]

[code]

    $ kubectl get pods
    NAME                         READY   STATUS             RESTARTS   AGE
    rails-api-798fd446db-c6jwc   1/2     CrashLoopBackOff   1          5s
    rails-api-798fd446db-d8g8k   1/2     CrashLoopBackOff   1          5s
    
[/code]

### 該当のソースコード

[code]

    #deployment.yml
    apiVersion: extensions/v1beta1
    kind: Deployment
    metadata:
      name: rails-api
    spec:
      replicas: 2
      template:
        metadata:
          labels:
            app: rails-api
        spec:
          containers:
            - image: gcr.io/プロジェクト名/rails_api
              name: web
              env:
                - name: DB_USER
                  valueFrom:
                    secretKeyRef:
                      name: cloudsql-db-credentials
                      key: username
                - name: DB_PASS
                  valueFrom:
                    secretKeyRef:
                      name: cloudsql-db-credentials
                      key: password
                - name: DB_NAME
                  value: SQLのインスタンス
                - name: DB_HOST
                  value: 127.0.0.1
                - name: RAILS_ENV
                  value: production
                - name: RACK_ENV
                  value: production
                - name: RAILS_SERVE_STATIC_FILES
                  value: 'true'
              ports:
                - containerPort: 3000
                  name: rails-api
              command: ["rm", "-f", "/rails_api/tmp/pids/server.pid"]
              command: ["bundle", "exec", "rails", "server", "-p", "3000", "-b", "0.0.0.0"]
            - image: b.gcr.io/cloudsql-docker/gce-proxy:1.11
              name: cloudsql-proxy
              command: ["/cloud_sql_proxy",
                        "-instances=プロジェクト名:asia-northeast1:SQLのインスタンス=tcp:3306",
                        "-credential_file=./key.json"]
              volumeMounts:
                - name: cloudsql-instance-credentials
                  mountPath: /secrets/cloudsql
                  readOnly: true
          volumes:
            - name: cloudsql-instance-credentials
              secret:
                secretName: cloudsql-instance-credentials
    
[/code]

[code]

    #Dockerfile
    FROM ruby:2.6.2
    
    
    # 必要なパッケージのインストール（基本的に必要になってくるものだと思うので削らないこと）
    RUN apt-get update -qq && \
        apt-get install -y build-essential \
                           libpq-dev \
                           nodejs
    
    # 作業ディレクトリの作成、設定
    RUN mkdir /rails_api
    ##作業ディレクトリ名をAPP_ROOTに割り当てて、以下$APP_ROOTで参照
    ENV APP_ROOT /rails_api
    WORKDIR $APP_ROOT
    
    # ホスト側（ローカル）のGemfileを追加する（ローカルのGemfileは【３】で作成）
    ADD ./Gemfile $APP_ROOT/Gemfile
    ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock
    
    # Gemfileのbundle install
    RUN bundle install
    ADD . $APP_ROOT
    
[/code]


CC BY-SA 4.0
2019-07-03T01:46:43.370
56334
2019-07-03T04:28:17.630
2019-07-03T04:28:17.630
34956
34956
question
ruby-on-rails sql docker kubernetes google-kubernetes-engine
Railsサービス(mysql)をGKEにデプロイする際に秘密鍵が見つからずpodのstatusがCrashLoopBackOffになる