Play with KubernetesでNode-REDを動かしてみた。

# はじめに

DockerでNode-REDを実行する方法について記事を書きました。

https://qiita.com/kitazaki/items/8502f10fff3e22314d39

Play with Dockerはブラウザで使える無料のDocker実行環境で、PCにDockerをインストールする必要がありません。
Dockerはアプリケーションをコンテナに分離するために使用されますが、Kubernetesはコンテナ、スケジューラー、オーケストレーションツールで、複数のホストマシンにデプロイされた複数のコンテナを管理することによってアプリケーションをデプロイおよびスケーリングするために使用されます。
Play with Dockerと同様、Play with Kubernetesもブラウザで使える無料のコンテナ実行環境で、自分でKubernetes実行環境を構築する必要がありません。

https://labs.play-with-k8s.com/

今回はPlay with KubernetesでNode-REDを動かしてみました。

![スクリーンショット 2022-05-13 22.14.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/1c78c2ee-e63c-7530-867d-c23ea754f3ec.png)

## メリット

### ブラウザだけで使える

### 制限時間は4時間

Play with Dockerと同様で、制限時間は4時間です。

![image_01.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/b2e8475d-77fb-aad7-bcf3-330b02ba8eb9.jpeg)

## 起動方法の違い

Play with Dockerの場合は、ホストに対してdockerコマンドで操作します。
Play with Kubernetesの場合は、ホストをMasterとWorkerに分け、Masterに対してkubectlコマンドで操作します。

![スクリーンショット 2022-05-14 9.23.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/cf449682-bacd-4540-4af0-906926b6d8cb.png)

# 利用方法

## Docker Hubアカウントの作成

Docker HubでDocker ID(アカウント)を作成します。

https://hub.docker.com/

## ログイン

Play with Kubernetesのサイトへアクセスします。

https://labs.play-with-k8s.com/

Loginボタンを押します。
Docker ID(アカウント)でログインします。

![Screenshot 2022-05-13 at 22-05-03 Play with Kubernetesのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/baf4324a-eafa-9ecd-a26b-3d6d6a20eae8.png)

## Play with Kubernetesの開始

Startボタンを押します。

![Screenshot 2022-05-13 at 22-17-02 Play with Kubernetesのコピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/50961937-64a4-4bae-586d-ba32d934df9b.png)

## インスタンスの追加

「ADD NEW INSTANCE」ボタンを3回押して、ノードを3つ追加します。

- Node 1: Mater / Control Planeノード
- Node 2: Workerノード1
- Node 3: Workerノード2

![image_02.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/9d93ca6a-2d31-706e-8924-b0278f618b4d.jpeg)

![image_03.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/bf92760f-7fec-40dd-58c3-73596c657478.jpeg)

## Masterノードの初期化

Node 1でkubeadmコマンドを実行して、Kubernetesクラスターを初期化します。

```bash
$ kubeadm init --apiserver-advertise-address $(hostname -i) --pod-network-cidr 10.5.0.0/16
```

![image_04.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/21e1e545-2c94-712b-8252-ed49975ae909.jpeg)

kubeadmコマンドの実行が完了したら、表示された赤枠のコマンドを控えておきます。(WorkerノードのNode 2、Node 3で実行します)

例.

```bash
$ kubeadm join 192.168.0.8:6443 --token bawo53.49725gm5vm63nnzl \
    --discovery-token-ca-cert-hash sha256:5c6339d32de6af998d009d55bec50c332911684b196853a1b136981b1aa8daa7
```

kubectlコマンドを実行して、STATUSが「NotReady」であることを確認します。

```bash
$ kubectl get nodes
```

![image_06.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/6a20e30c-2012-097f-1c99-8f233e64d596.jpeg)

以下のコマンドを実行して、ネットワークを初期化します。

```bash
$ kubectl apply -f https://raw.githubusercontent.com/cloudnativelabs/kube-router/master/daemonset/kubeadm-kuberouter.yaml
```

![image_07.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/4f6febdf-5f50-5b6b-991b-1d2fcb3a1669.jpeg)

もう一度、kubectlコマンドを実行して、STATUSが「Ready」になったことを確認します。(STATUSが変わるまで少し時間が掛かります)

![image_08.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/780d7b14-eec2-a597-b547-c29fdc41b14f.jpeg)

## Workerノードの追加

Node 2、Node 3で、Node 1で控えたkubeadmコマンドを実行して、Workerノードを追加します。

例.

```bash
$ kubeadm join 192.168.0.8:6443 --token bawo53.49725gm5vm63nnzl \
    --discovery-token-ca-cert-hash sha256:5c6339d32de6af998d009d55bec50c332911684b196853a1b136981b1aa8daa7
```

![image_09.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/db2b628a-f351-8a52-bf37-b3a2659cbf17.jpeg)

![image_10.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/19dcc6d1-8eb2-61d7-3f12-ea4aa3e46291.jpeg)

Node 1でkubectlコマンドを実行して、Node 2とNode 3がkubernetesクラスターへ組み込まれたことを確認します。(STATUSが「Ready」になるまで少し時間が掛かります)

```bash
$ kubectl get nodes -o wide
```

![image_11.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/8465691c-fb71-285e-7ad5-178056217a52.jpeg)

# Node-REDの起動方法

## マニフェストファイルの用意

以下のマニフェストファイルを用意します。
(Play with Kubernetesではviコマンドを使用してマニフェストファイルを作成します)

```yaml: nodered-app.yaml
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にも置いておきます。

https://raw.githubusercontent.com/kitazaki/kubernetes_node-red/main/nodered-app.yaml

Play with Kubernetesではcurlコマンドを使用できますので、Githubからマニフェストファイルを取得することもできます。

```bash
$ 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)で以下のコマンドを実行します。

```bash
$ kubectl apply -f nodered-app.yaml
```

## 確認方法

Node-REDの起動状態を確認します。
Masterノード (Node 1)で以下のコマンドを実行します。

```bash
$ kubectl get node,pod,deploy,svc -o wide
```

例.

```bash
$ 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
```

![image_20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/99109598-82a0-ed8a-ace4-ff0f366e53e0.jpeg)

URLとサービスポートを確認して、ブラウザでアクセスします。

![image_20 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/f020b161-7a79-7648-67f6-96ecb61d7898.jpeg)

例.
http://ip172-18-0-3-c9vh57lrie6000f92ep0.direct.labs.play-with-k8s.com:30965

## Node-REDの停止

```bash
$ kubectl delete -f nodered-app.yaml
```

## 複数のNode-REDを起動

1つのマニフェストファイルで複数のNode-REDを起動 (レプリカを2以上に設定し、1つのサービスポートで複数のNode-REDヘ負荷分散)したり、複数のマニフェストファイルで複数のNode-REDを起動 (複数のサービスポートを割り当て)することができます。

例. 複数のマニフェストファイルで複数のNode-REDを起動した場合

```bash
$ 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
```

![image_31.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/bb0918dd-6498-d881-60ee-6026fca2a4cd.jpeg)

![image_32.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/97d66738-6625-b123-0d30-3ed0b663ff72.jpeg)

# セッションの終了

使い終わったら「CLOSE SESSION」ボタンを押してセッションを終了させます。

![image_31 2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/18001605-6a6a-8de7-db38-8720eff669dc.jpeg)

![image_40.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/72479/3d0eb096-f46f-3286-d596-d70b07b6f028.jpeg)

# さいごに

良きNode-REDライフを！

### 参考情報

https://medium.com/swlh/kubernetes-101-play-with-kubernetes-labs-64d1fcbde2f3