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