Kubernetesでスケールアップ・ローリングアップデートを行う

はじめに

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