Tamanyan.net

10 分でローカルの Kubernetes クラスタに Node.js で構築した Web App をデプロイする。

この記事で分かる事

  • Node.js Web App を Kubernetes クラスタ上に構築する方法
  • Docker for Mac Kubernetes の使い方
  • Kubernetes Dashboard のインストール方法

今回使ったサンプルは tamanyan/k8s-node-sample にある。

Kubernetes を知る

Docker は触っていても Kubernetes は初めてという人は結構多いのではないだろうか?

「Kubernetes は、コンテナ化したアプリケーションのデプロイ、スケーリング、および管理を行うための、オープンソースのコンテナオーケストレーションシステムである」

と書かれていても全くピンと来ない。まずオーケストレーションってなんだよ、曲でも作るのか?と冗談のように考える人もいるだろう。

オーケストレーション (コンピュータ)

オーケストレーション(英: Orchestration)は、複雑なコンピュータシステム/ミドルウェア/サービスの配備/設定/管理の自動化を指す用語。

Pod, Service, Node など一般用語にもあるような独自の概念が出てきてイマイチとっつきにくい Kubernetes を理解するために、 まず以下の Video を見て雰囲気を感じてもらいたい。 英語だが、字幕をつけて絵だけ見ていても雰囲気を感じ取れると思う。

Docker for Mac をインストール

Docker Community Edition for Mac に行き、以下の Get Docker CE for Mac (Stable) からダウンロードする。

Docker for Mac のインストール

Kubernetes を有効にする

Docker アプリから Preferences を開き、Apply を押して有効にする。

Docker for Mac の設定

使用する Cluster を docker-for-desktop に変更する。

$ kubectl config use-context docker-for-desktop

Kubernetes Dashboard をインストール

Kubernetes Cluster の状態確認するために Web UI kubernetes/dashboard をインストールする。

$ kubectl apply -f https://raw.githubusercontent.com/kubernetes/dashboard/master/src/deploy/recommended/kubernetes-dashboard.yaml
echo "apiVersion: rbac.authorization.k8s.io/v1beta1                                                                                                                                                       
kind: ClusterRoleBinding
metadata:
  name: kubernetes-dashboard
  labels:
    k8s-app: kubernetes-dashboard
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: kubernetes-dashboard
  namespace: kube-system" | kubectl apply -f -
$ kubectl proxy

以下の URL にアクセスする

http://localhost:8001/api/v1/namespaces/kube-system/services/https:kubernetes-dashboard:/proxy/

Kubernetes Dashboard

Node.js Web App を Kubernetes クラスタにデプロイ

ようやく準備が完了したので、以下のアーキテクチャを構築を目標にする。今回は ServiceDeployment のみを使用する。

Kunerbetes アーキテクチャ

1. サンプルプロジェクトを Clone

サンプルプロジェクトを Github から Clone する

$ git clone https://github.com/tamanyan/k8s-node-sample.git

プロジェクトのディレクトリ構成

$ tree -L 2 -I 'node_modules' .
.
├── Makefile # command list
├── README.md
├── k8s
│   ├── deployment.yaml # Kubernetes Deployment
│   └── service.yaml # Kubernetes Service
└── node-app
    ├── Dockerfile # Dockerfile for Node.js app
    ├── index.js
    ├── package-lock.json
    └── package.json

Dockerfile

FROM node:8.12.0-alpine

ENV NODE_ENV=development

ARG project_dir=/app/

WORKDIR /app/

ADD index.js $project_dir
ADD package.json $project_dir
ADD package-lock.json $project_dir

RUN npm install

EXPOSE 3000

CMD ["npm", "start"]

index.js

const express = require('express')
const app = express()
const port = process.env.PORT || 3000

app.get('/', (req, res) => {
  res.json({
    message: 'Hello Sample Node.js app',
    localAddress: req.connection.localAddress,
  });
})

app.listen(port, () => console.log(`Sample app listening on port ${port}!`))

2. Node App の Docker Image をビルド

$ make build
docker build --no-cache -t gcr.io/myproject/node-app:v1 node-app

3. Node App のデプロイ

$ make deploy
kubectl apply -f k8s/deployment.yaml
deployment.apps/sample-node-app configured
kubectl apply -f k8s/service.yaml
service/sample-node-app-service configured

4. Node.js Web App のデプロイ

http://localhost にアクセス

Node.js サンプルアプリ

5. Node.js Web App の削除

$ make clean
kubectl delete -f k8s/deployment.yaml
deployment.apps "sample-node-app" deleted
kubectl delete -f k8s/service.yaml
service "sample-node-app-service" deleted

Kubernetes のマニフェストファイルの中身

deployment.yaml

apiVersion: apps/v1beta1
kind: Deployment
metadata:
  name: sample-node-app
  labels:
    app: sample-node-app
spec:
  replicas: 2
  template:
    metadata:
      labels:
        app: sample-node-app
    spec:
      containers:
      - name: sample-node-app
        image: gcr.io/myproject/node-app:v1
        command:
        ports:
          - containerPort: 3000

service.yaml

kind: Service
apiVersion: v1
metadata:
  name: sample-node-app-service
spec:
  type: LoadBalancer
  selector:
    app: sample-node-app
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

まとめ

今回はほぼ最小の構成で Node.js Web App を Kubernetes クラスタにデプロイした。DeploymentService は Kubernetes 上に構築したアプリを公開するのに最も基礎的な事である。

参考URL


たまにゃん・バンコクで働くエンジニア🇹🇭
バンコク(タイ)のフルスタックエンジニア。前職では日本経済新聞社で iOS エンジニアとして働き、2018 年からタイの自動車系の会社に転職する。一からデジタル組織を作るべく奔走中。タイの事、エンジニアの事のついて情報発信する。