はじめに
Kubernetesはバズワードになりつつあるが、スケールアップ・ローリングアップデートを含む運用のノウハウはまだまだそれほど多くないのでまとめる。
Node.js サーバーを作成する
var http = require('http'); var handleRequest = function(request, response) { response.writeHead(200); response.end("Hello World!"); } var www = http.createServer(handleRequest); www.listen(8080);
起動
node server.js
Docker コンテナ イメージを作成する
FROM node:6.9.2 EXPOSE 8080 COPY server.js . CMD node server.js
docker hubからnodeのversion 6.9.2をダウンロード。
8080ポートを外部に公開、
先ほど作ったserver.jsをdocker内にコピー、
nodeコマンドでserver.jsを起動する。と言った内容。
Dockerイメージをビルドする
docker build -t gcr.io/PROJECT_ID/hello-node:v1 .
動作確認
docker run -d -p 8080:8080 gcr.io/PROJECT_ID/hello-node:v1
curlで自身に接続し接続確認をする
curl http://localhost:8080
非公開リポジトリ Google Container Registry にpushする
gcloud docker -- push gcr.io/PROJECT_ID/hello-node:v1
Kubernetesのクラスタを作成する
クラスタはGCPで用意する。
gcloud config set project PROJECT_ID
2 つの n1-standard-1 ノードのあるクラスタ
gcloud container clusters create hello-world \ --num-nodes 2 \ --machine-type n1-standard-1 \ --zone us-central1-a
ポッドを作成する
こちらは先ほど作ったクラスタの中につくられる。
Kubernetesのコマンドkubectlを使って作っていく。
kubectl run hello-node \ --image=gcr.io/PROJECT_ID/hello-node:v1 \ --port=8080
デプロイメントオブジェクトが作成される。
確認のコマンドはこちら
kubectl get deployments
デプロイメントによって作成されたポッドは以下のコマンドで確認
kubectl get pods
Kubernetesの状態を確認するコマンド
kubectl cluster-info kubectl config view kubectl get events kubectl logs <pod-name>
外部トラフィックを許可する
デフォルトではポッドにはクラスタ内部IPからしかアクセスできないようになっている。kubectl exposeコマンドと –type=”LoadBalancer”で公開する事ができる。
kubectl expose deployment hello-node --type="LoadBalancer"
(ポッドを直接公開する手順ではなく、デプロイメントを公開の手順)
公開IPを確認
kubectl get services
サービスのスケールアップ
今までは2つのレプリカを用意していたが、それをさらに増やしたい場合以下のコマンドでスケールアップする事が可能
kubectl scale deployment hello-node --replicas=4
確認
kubectl get deployment
podの状態を確認
kubectl get pods
新しいコンテナをデプロイする
再度nodeで作ったserver.jsを適当に編集し、保存する。
その後buildしてpush
docker build -t gcr.io/PROJECT_ID/hello-node:v2 . gcloud docker -- push gcr.io/PROJECT_ID/hello-node:v2
その後、kubectlコマンドでデプロイするコンテナイメージのタグを変更する
kubectl edit deployment hello-node
変更するフィールドは
spec.template.spec.containers.image
containers: - image: gcr.io/PROJECT_ID/hello-node:v1
をv1からv2へ変更する
kubectl get deployments
を行うと順次ポッドがローリングアップデートされる。
古いポッドは削除されてしまうので注意。
管理画面を見る
gcloud container clusters get-credentials hello-world \ --zone us-central1-a --project <PROJECT_ID>
トークンを取得する
kubectl -n kube-system describe $(kubectl -n kube-system \ get secret -n kube-system -o name | grep namespace) | grep token:
8081ポートを使うことにする(どこでもよい)
kubectl proxy --port 8081
コンソール画面でchange portをクリックし、8081ポートに変更する。
?authuser=0を削除し、以下のとおり/uiに変更する
例:
https://8081-dot-6387619-dot-devshell.appspot.com/ui
参考情報
https://google.qwiklabs.com/focuses/564?locale=ja&parent=catalog