Weitere ähnliche Inhalte Ähnlich wie 普通のRailsアプリをdockerで本番運用する知見 (20) Mehr von zaru sakuraba (13) Kürzlich hochgeladen (10) 普通のRailsアプリをdockerで本番運用する知見25. vagrant / docker 比較
起動時間
vagrant up 50sec
docker-compose up 15sec
VM立ちあげるのと、コンテナ立ち上げるのでは違うのは当然だ
けど、毎日やる作業だからこそ高速にしたい気持ちがある。
なぜかVagrant環境がぶっ壊れることがあった…。
発症する人しない人がいて原因究明が非常につらい。
35. kubernetes + GKEの簡単便利なところ
- GKEがOSやkubernetesの面倒を見てくれる
- クラスタ作成からデプロイまで簡単なコマンドで完結
$ gcloud container clusters create example --num-nodes=3
$ gcloud docker -- push gcr.io/${PROJECT_ID}/${IMAGE}:${TAG}
$ kubectl create -f ./k8s/deployment.yaml
38. apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: example
spec:
replicas: 1
template:
metadata:
labels:
application: rails
spec:
containers:
- image: gcr.io/${PROJECT_ID}/${IMAGE_RAILS}:${TAG}
name: rails
ports:
- containerPort: 3000
command: ["bundle", "exec", "rails", "s", "puma", "-b", "0.0.0.0", "-p", "3000",
"-e", "production"]
47. steps:
# 略
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud container clusters get-credentials example --zone asia-northeast1-a
apt-get update && apt-get -y install gettext
envsubst < ./k8s/k8s_job.yml | kubectl create -f -
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- './k8s/migration_status_check.sh'
- name: 'gcr.io/cloud-builders/gcloud'
entrypoint: 'bash'
args:
- '-c'
- |
gcloud container clusters get-credentials example --zone asia-northeast1-a
kubectl delete jobs/migrate
GCBのdb:migrate設定例
ジョブ作成
ジョブ監視
ジョブ削除
48. ジョブの状態を監視するスクリプト
while true; do
status=`kubectl get pods --selector=job-name=migrate
-o jsonpath='{.items[*].status
.containerStatuses[?(@.name=="rails")]
.state.terminated.reason}'`
if [ "$status" = "Completed" ]; then
break
fi
if [ "$status" = "Error" ]; then
echo "migration error." 1>&2
break
fi
sleep 2
done
54. いくつかの方法
- crondコンテナを立てる
- sidekiq-cronを使う
- kuroko2などのジョブスケジューラを使う
- AWS CloudWatch Events + LambdaでECS Taskを叩く
- GAE schedule task + Functionsでkubectlを叩く
- kubernetes CronJobを使う(まだアルファ)
項目 crond sidekiq-cron ジョブスケジューラ CloudWatch / GAE
機能性 ✕ ✕ ◯ ✕
コード化 △ ◯ ✕ △
汎用性 △ ✕ ◯ ✕
スケール ✕ ◯ ◯ ◯
コスト ◯ △ ✕ ◯
58. ログの取得
kubernetes + GKE
- 開発時にログを見るならsternが最高
- StackDriver Logging -> BigQuery
ECS
- CloudWatch logs -> lambda -> S3 -> Athena
その他
- papertrailやlogDNAなど
69. Multi Stage buildで軽量に
Docker CE 17.05からサポートされたMulti Stage buildを使って
Railsイメージを軽量にできる。
image 通常 Multi Stage build
ruby:2.4.1-slim-stretch 287MB 153MB
ruby:2.4.1-alpine 246MB 189MB
Goと違ってライブラリの依存関係とかを把握していないと動かな
いケースとか出てきそう…
1/7
70. FROM ruby:2.4.1-alpine3.6 as builder
RUN apk update && apk upgrade && apk add --update
build-base
libxml2-dev
libxslt-dev
linux-headers
mysql-dev
nodejs
WORKDIR /app
COPY Gemfile ./Gemfile
COPY Gemfile.lock ./Gemfile.lock
RUN bundle install --jobs 4
COPY . .
FROM ruby:2.4.1-alpine3.6
ENV LANG ja_JP.UTF-8
COPY --from=builder /usr/local/bundle /usr/local/bundle
RUN apk update && apk upgrade && apk add --update
mysql-dev
nodejs
WORKDIR /app
COPY . .
72. Docker for Macファイル同期遅い問題
CE17.05で cachedフラグに対応したことでreadが改善された
cachedなし cachedあり マウントなし
ab (Requests per second) 50 73 80
docker-syncは同期がコケる事があるのでオススメしません
MacからLinuxに移行すると幸せになるかも
3/7
75. 6/7
kubernetes オートスケール
Horizontal Pod Autoscaling・Cluster Autoscalerを設定
- Podはすぐ立ち上がる・ノードは30秒くらいかかる
- 最小起動数は予測できるトラフィックに合わせる
- ノード数はデプロイ時のPod数も考慮に入れる
$ kubectl autoscale deployment pod_name --cpu-percent=70 --min=1 --max=3
$ gcloud container clusters update cluster_name
--enable-autoscaling --min-nodes=3 --max-nodes=20