はじめに
DockerでNode-REDを実行する方法について記事を書きました。
Play with Dockerはブラウザで使える無料のDocker実行環境で、PCにDockerをインストールする必要がありません。
Dockerはアプリケーションをコンテナに分離するために使用されますが、Kubernetesはコンテナ、スケジューラー、オーケストレーションツールで、複数のホストマシンにデプロイされた複数のコンテナを管理することによってアプリケーションをデプロイおよびスケーリングするために使用されます。
Play with Dockerと同様、Play with Kubernetesもブラウザで使える無料のコンテナ実行環境で、自分でKubernetes実行環境を構築する必要がありません。
今回はPlay with KubernetesでNode-REDを動かしてみました。
メリット
ブラウザだけで使える
制限時間は4時間
Play with Dockerと同様で、制限時間は4時間です。
起動方法の違い
Play with Dockerの場合は、ホストに対してdockerコマンドで操作します。
Play with Kubernetesの場合は、ホストをMasterとWorkerに分け、Masterに対してkubectlコマンドで操作します。
利用方法
Docker Hubアカウントの作成
Docker HubでDocker ID(アカウント)を作成します。
ログイン
Play with Kubernetesのサイトへアクセスします。
Loginボタンを押します。
Docker ID(アカウント)でログインします。
Play with Kubernetesの開始
Startボタンを押します。
インスタンスの追加
「ADD NEW INSTANCE」ボタンを3回押して、ノードを3つ追加します。
- Node 1: Mater / Control Planeノード
- Node 2: Workerノード1
- Node 3: Workerノード2
Masterノードの初期化
Node 1でkubeadmコマンドを実行して、Kubernetesクラスターを初期化します。
$ kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
kubeadmコマンドの実行が完了したら、表示された赤枠のコマンドを控えておきます。(WorkerノードのNode 2、Node 3で実行します)
例.
$ kubeadm join 192.168.0.8:6443 --token bawo53.49725gm5vm63nnzl \
--discovery-token-ca-cert-hash sha256:5c6339d32de6af998d009d55bec50c332911684b196853a1b136981b1aa8daa7
kubectlコマンドを実行して、STATUSが「NotReady」であることを確認します。
$ kubectl get nodes
以下のコマンドを実行して、ネットワークを初期化します。
$ kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
もう一度、kubectlコマンドを実行して、STATUSが「Ready」になったことを確認します。(STATUSが変わるまで少し時間が掛かります)
Workerノードの追加
Node 2、Node 3で、Node 1で控えたkubeadmコマンドを実行して、Workerノードを追加します。
例.
$ kubeadm join 192.168.0.8:6443 --token bawo53.49725gm5vm63nnzl \
--discovery-token-ca-cert-hash sha256:5c6339d32de6af998d009d55bec50c332911684b196853a1b136981b1aa8daa7
Node 1でkubectlコマンドを実行して、Node 2とNode 3がkubernetesクラスターへ組み込まれたことを確認します。(STATUSが「Ready」になるまで少し時間が掛かります)
$ kubectl get nodes -o wide
Node-REDの起動方法
マニフェストファイルの用意
以下のマニフェストファイルを用意します。
(Play with Kubernetesではviコマンドを使用してマニフェストファイルを作成します)
apiVersion: v1
kind: Service
metadata:
name: node-red
labels:
app: node-red
spec:
type: LoadBalancer
ports:
- port: 1880
selector:
app: node-red
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: node-red
spec:
replicas: 1
selector:
matchLabels:
app: node-red
template:
metadata:
labels:
app: node-red
spec:
containers:
- name: node-red
image: nodered/node-red:latest-minimal
ports:
- containerPort: 1880
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
hostPath:
path: /tmp
type: Directory
Githubにも置いておきます。
Play with Kubernetesではcurlコマンドを使用できますので、Githubからマニフェストファイルを取得することもできます。
$ curl -s -o nodered-app.yaml https://raw.githubusercontent.com/kitazaki/kubernetes_node-red/main/nodered-app.yaml
Node-REDの起動
Workerノード1台にNode-REDを起動します。
Masterノード (Node 1)で以下のコマンドを実行します。
$ kubectl apply -f nodered-app.yaml
確認方法
Node-REDの起動状態を確認します。
Masterノード (Node 1)で以下のコマンドを実行します。
$ kubectl get node,pod,deploy,svc -o wide
例.
$ kubectl get node,pod,deploy,svc -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/node1 Ready control-plane,master 40m v1.20.1 192.168.0.13 <none> CentOS Linux 7 (Core) 4.4.0-210-generic docker://20.10.1
node/node2 Ready <none> 39m v1.20.1 192.168.0.12 <none> CentOS Linux 7 (Core) 4.4.0-210-generic docker://20.10.1
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/node-red-84cf54d9d5-wzsxw 1/1 Running 0 7m41s 10.5.2.3 node3 <none> <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/node-red 1/1 1 1 7m41s node-red nodered/node-red:latest-minimal app=node-red
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40m <none>
service/node-red LoadBalancer 10.108.73.11 <pending> 1880:32322/TCP 7m41s app=node-red
URLとサービスポートを確認して、ブラウザでアクセスします。
例.
http://ip172-18-0-3-c9vh57lrie6000f92ep0.direct.labs.play-with-k8s.com:30965
Node-REDの停止
$ kubectl delete -f nodered-app.yaml
複数のNode-REDを起動
1つのマニフェストファイルで複数のNode-REDを起動 (レプリカを2以上に設定し、1つのサービスポートで複数のNode-REDヘ負荷分散)したり、複数のマニフェストファイルで複数のNode-REDを起動 (複数のサービスポートを割り当て)することができます。
例. 複数のマニフェストファイルで複数のNode-REDを起動した場合
$ kubectl get node,pod,deploy,svc -o wide
NAME STATUS ROLES AGE VERSION INTERNAL-IP EXTERNAL-IP OS-IMAGE KERNEL-VERSION CONTAINER-RUNTIME
node/node1 Ready control-plane,master 40m v1.20.1 192.168.0.13 <none> CentOS Linux 7 (Core) 4.4.0-210-generic docker://20.10.1
node/node2 Ready <none> 39m v1.20.1 192.168.0.12 <none> CentOS Linux 7 (Core) 4.4.0-210-generic docker://20.10.1
node/node3 Ready <none> 33m v1.20.1 192.168.0.11 <none> CentOS Linux 7 (Core) 4.4.0-210-generic docker://20.10.1
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod/node-red-84cf54d9d5-wzsxw 1/1 Running 0 7m41s 10.5.2.3 node3 <none> <none>
pod/node-red1-cff45cfcd-cwt8t 1/1 Running 0 91s 10.5.1.4 node2 <none> <none>
pod/node-red2-58845df784-krfr7 1/1 Running 0 9s 10.5.1.5 node2 <none> <none>
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
deployment.apps/node-red 1/1 1 1 7m41s node-red nodered/node-red:latest-minimal app=node-red
deployment.apps/node-red1 1/1 1 1 91s node-red nodered/node-red:latest-minimal app=node-red1
deployment.apps/node-red2 1/1 1 1 9s node-red nodered/node-red:latest-minimal app=node-red2
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE SELECTOR
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 40m <none>
service/node-red LoadBalancer 10.108.73.11 <pending> 1880:32322/TCP 7m41s app=node-red
service/node-red1 LoadBalancer 10.108.91.117 <pending> 1880:32615/TCP 91s app=node-red1
service/node-red2 LoadBalancer 10.101.19.118 <pending> 1880:31403/TCP 9s app=node-red2
セッションの終了
使い終わったら「CLOSE SESSION」ボタンを押してセッションを終了させます。
さいごに
良きNode-REDライフを!
参考情報