Google Contaier Engine(GKE)でコンテナをローリングアップデートしてみます。
コンテナのビルド
以前、このあたりに書いたとおりです。
Google Container Engineに移行した その2 | A-tak-dot-com
[bash]
#作業ディレクトリ
dockerwork=/Users/a-tak/Dropbox/docker
#プロジェクトID
projectid=myproject-99
#nginxイメージビルドしてアップしておく
docker build -t asia.gcr.io/${projectid}/nginx:v23 ${dockerwork}/nginx
gcloud docker push asia.gcr.io/${projectid}/nginx:v23
#php-fpmのイメージ作ってアップする
docker build -t asia.gcr.io/${projectid}/php-fpm:v5 ${dockerwork}/php-fpm
gcloud docker push asia.gcr.io/${projectid}/php-fpm:v5
[/bash]
v23とかv5はイメージ作る度にカウントアップしてください。Dockerfileの場所とプロジェクトのIDも自分の環境に合わせる。
ちなみに今回コンテナをyum updateしたいだけだったけど、その場合はビルドするときにキャッシュ使わないオプション指定しないと、Dockerfileに変更がないとキャッシュが使われて結局イメージ更新されないはずです。
ローリングアップデート
ぶっちゃけ、ここに書いてあるのを真似した。ただ、yamlをソース管理したかったのでバージョンは自分で毎回書き換える運用にしている。
レプリケーションコントローラーにイメージのバージョン指定してあるのでこれも合わせて更新。
レプリケーションコントローラーに関しては以前記事に書きました。
Google Container Engineに移行した その4 | A-tak-dot-com
Google Container Engineに移行した その5 オートスケール | A-tak-dot-com
[yaml]
—
kind: “ReplicationController”
apiVersion: “v1”
metadata:
name: “web-rc-09”
labels:
name: “web-rc-09”
spec:
replicas: 1
selector:
name: “web-pods”
version: “9”
template:
metadata:
labels:
name: “web-pods”
version: “9”
spec:
volumes:
– name: www
nfs:
server: “db.my-project-99.internal”
path: “/var/contents”
readOnly: false
containers:
–
name: “nginx”
image: “asia.gcr.io/a-tak-blog/nginx:v23”
ports:
–
containerPort: 80
volumeMounts:
– name: www
mountPath: “/var/contents”
–
name: “php-fpm”
image: “asia.gcr.io/a-tak-blog/php-fpm:v5”
ports:
–
containerPort: 9000
volumeMounts:
– name: www
mountPath: “/var/contents”
[/yaml]
今動いているレプリケーションコントローラーが、web-rc-08とするとこんな感じ↓
[bash]
kubectl rolling-update web-rc-08 -f ${dockerwork}/kubernetes/web.yml
[/bash]
これで無停止でアップデートできる。自動で新しいPodが起動して古いPodは消去されていく。いいね。
serviceのselectorにweb-podsを指定していて、そこは不変なままなのがポイント。
オートスケールも再設定がたぶん必要
[bash]
kubectl delete hpa web-rc-08
kubectl autoscale rc web-rc-09 –min=1 –max=10 –cpu-percent=80
[/bash]