Railsサービス(mysql)をGKEにデプロイする際に秘密鍵が見つからずpodのstatusがCrashLoopBackOffになる
こちらteratailでも質問している内容(マルチポスト)です。
https://teratail.com/questions/198296
前提・実現したいこと
自作railsアプリケーション(DBはMysql)をDocker環境で動くように開発し、GKE(google kubernetes engine)にデプロイしたい
こちらのサイトを参考にしています
前提
・アプリケーションはローカル(開発環境)だとdocker-compose upで正常に起動する状態
・localのワーキングディレクトリにはkey.jsonがある
・GCPのIAMと管理「サービス アカウントの詳細」にキーは設定されていてkey.jsonのものと同じ(メールアドレスも一致)
・cloudsql-db-credentialsとcloudsql-instance-credentialsはGCP側に設定されている
GKE構成
・nodeは2つ、それぞれに同じ2つpodを入れている
・マニュフェストファイルはひとつ(deployment.yml)
#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"
}
発生している問題・エラーメッセージ
GKEにデプロイする際にエラー(podのstatusがCrashLoopBackOff)になってしまう。
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)
textPayload: "2019/07/02 14:18:29 invalid json file "./key.json": open ./key.json: no such file or directory
$ 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
該当のソースコード
#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
#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は【3】で作成)
ADD ./Gemfile $APP_ROOT/Gemfile
ADD ./Gemfile.lock $APP_ROOT/Gemfile.lock
# Gemfileのbundle install
RUN bundle install
ADD . $APP_ROOT