以下を目指す
- 第一段階 : Railsアプリをminikubeで動かせる(hello yay)
- 第二段階 : Railsアプリのコードベースを変更したら、それがminikube上で反映されていることが確認できる
- 第三段階 : RailsアプリをGKEにデプロイして公開できる
- 第四段階 : RailsアプリのIPを固定化し、domainを与え、https化する
- 第五段階 : GitOps式のCICD pipeline を実現する
.gitignore
にて、Railsのファイルを無視しています。
適宜、外してください。
- docker for mac がインストールされていること
- kubectl がインストールされていること
- minikube がインストールされていること
Docker buildする
docker build . -t rails-on-k8s
docker run --rm -v $PWD:$PWD -w $PWD rails-on-k8s bundle exec rails new . --database=mysql --skip-test
DB設定、config/database.ymlを開いて、password
とhost
を修正する
password: <%= ENV.fetch("RAILS_DB_PASSWORD") %>
host: mysql
minikube start
(必要なら、minikube delete
してから )
3. skaffoldを利用する
skaffoldは、kubernetesに対して、Google製のビルド〜デプロイまでを行ってくれるコマンドラインツール。 開発環境において、ビルドしたイメージをレジストリにアップせずに、直接kubernetesのpodに入れてくれる。
インストール
brew install skaffold
skaffold.yamlを設置、build.artifacts.imageを、任意の<IMAGE_NAME>に書き換える。deploy.kubectl.manifestsの位置をk8sディレクトリ以下に設定する。
skaffold dev --cache-artifacts
--cache-artifacts : キャッシュする ($HOME/.skaffold/cache) これで、ローカルで変更があるたびに、kubernetesの<IMAGE_NAME>を使うpod内のcontainerが置き換わる。
リソース配置
kubectl create secret generic mysql-pass --from-literal=password=<PASSWORD>
kubectl apply -f .k8s/k8s-mysql.yaml
kubectl apply -f .k8s/k8s-rails.yaml
DBを作成する。 <POD_NAME>を確認し、コンテナにログインし、
kubectl get pods
kubectl exec -it <POD_NAME> /bin/bash
db:createを実行する
# bundle exec rails db:create
Created database 'rails-on-k8s_development'
Created database 'rails-on-k8s_test'
リソース確認
kubectl get pvc
kubectl get deployments
kubectl get pods
kubectl describe pods -l app=rails
kubectl get services
describeで詳細を見てみると、この時点では、rails server起動できないので、railsのpodがCrashLoopBackOff
になっているが、Eventsのイメージをpullできていれば問題なし(予定通り)。
minikubeから、rails serviceに対して、EXTERNAL-IPを与える(その後にkubectl get services
をしても出てこないが..)
minikube service rails --url
なお、 minikube service rails
でブラウザが開く。
- クラスタ内で完結させたかったので、docker-composeを使わずに、k8s内のコンテナに入ってdb:createをする作業が入ってしまった。つまり、もっと綺麗な流れにしたい。
- database設定のhostも、Secretsリソースから読み取るようにしたい
設定変更が反映されている
gcloud projects create <PROJECT-ID>
gcloud projects list
gcloud config list
gcloud config set project <PROJECT-ID>
gcloud config get-value project
支払い情報を設定(Billing設定)後に以下の設定を行う
gcloud services enable container.googleapis.com
gcloud services list --available
(現時点で、予算設定を超えているとサービスをenableできないようなので、サービス追加できない場合は確認してみてください。)
gcloud container clusters create <CLUSTER-NAME> --num-nodes=2 --preemptible
クラスタのサイズと、リソースの使用量によって値段が変わってくるみたい。
品質保証のないバージョンでの、デフォルトのn1-standard-1
ノードを2つ注文で、$14.60の予定(¥1,600)
最新の状況を固めて、
docker build . -t rails-on-k8s
dockerをgcloudで認証し、
$gcloud auth configure-docker
The following settings will be added to your Docker config file located at [~/.docker/config.json]:
{
"credHelpers": {
"gcr.io": "gcloud",
"us.gcr.io": "gcloud",
"eu.gcr.io": "gcloud",
"asia.gcr.io": "gcloud",
"staging-k8s.gcr.io": "gcloud",
"marketplace.gcr.io": "gcloud"
}
}
Do you want to continue (Y/n)? Y
Docker configuration file updated.
imageにtagをつける
docker tag [SOURCE_IMAGE] [HOSTNAME]/[PROJECT-ID]/[IMAGE]
docker tag rails-on-k8s asia.gcr.io/shirofune-labo-rails-on-k8s/rails-on-k8s
pushする
docker push [HOSTNAME]/[PROJECT-ID]/[IMAGE]
docker push asia.gcr.io/shirofune-labo-rails-on-k8s/rails-on-k8s
skaffoldを使うパターン
...検証予定
まず、つながり先を確認
kubectl config current-context
railsは、イメージ名がローカルと違うので、ファイルを分けた
kubectl create secret generic mysql-pass --from-literal=password=<PASSWORD>
kubectl apply -f .k8s/k8s-mysql.yaml
kubectl apply -f .k8s/gke-rails.yaml
DBを作成する。 <POD_NAME>を確認し、コンテナにログインし、
kubectl get pods
kubectl exec -it <POD_NAME> /bin/bash
db:createを実行する
# bundle exec rails db:create
Created database 'rails-on-k8s_development'
Created database 'rails-on-k8s_test'
リソース確認
kubectl get pvc
kubectl get deployments
kubectl get pods
kubectl describe pods -l app=rails
kubectl get services
EXTERNAL-IPが発行されるのを待ち、発行されたら、そこへアクセスする
Does not have minimum availability
の場合には、以下のようにして、ノード数を増やしてみる(課金増える)が、実は、imageを取れてないだけだったりとかもする。
gcloud container clusters resize rails-on-k8s --size=3