日: 2019年2月17日

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

    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