使用minikube创建nodejs开发环境

这是「DeNA IP平台事业部2017年圣诞倒数月历」的第15天的文章。

首先

如果使用Google Kubernetes Engine或其他支持Kubernetes环境的情况下,我认为在本地开发环境中也会选择采用Kubernetes+minikube。本文简要解释了在minikube上构建Node.js开发环境的步骤和要点。

只能使用Mac操作系统,请使用其他操作系统的用户谅解!?

所需之物 (Suo xu zhi wu)

    • minikube

 

    • kubectl

 

    • docker

 

    nodejs(Mac上)

请参考这里的基本安装步骤:
https://kubernetes.io/docs/tutorials/stateless-application/hello-minikube/

请安装Node.js(npm)以便使用。
下载链接:https://nodejs.org/ja/download/
不仅限于二进制文件,其他安装方式也可。

环境搭建

使用HyperKit驱动程序启动Minikube。

Hyperkit的运行速度比VirtualBox等软件快。
参考:Node.js启动时间,VirtualBox为3秒,Hyperkit为1秒。

# hyperkitドライバーをインストール
$ curl -LO https://storage.googleapis.com/minikube/releases/latest/docker-machine-driver-hyperkit && chmod +x docker-machine-driver-hyperkit && sudo mv docker-machine-driver-hyperkit /usr/local/bin/ && sudo chown root:wheel /usr/local/bin/docker-machine-driver-hyperkit && sudo chmod u+s /usr/local/bin/docker-machine-driver-hyperkit
# minikubeを起動
$ minikube start --vm-driver=hyperkit --cpus 4 --memory 8192
# dockerのホストを設定する
$ eval $(minikube docker-env)

请根据需要自行更换CPU和内存。

Dockerfile的释义


FROM node:8.6.0
ENV APP_ROOT /opt/node
WORKDIR $APP_ROOT
RUN npm install pm2 -g
EXPOSE 3000 3002
CMD ["npm", "run", "start"]

我正在安装pm2,但目的稍后再说。

应用程序代码

为了使用npm脚本,将其放入如下所示的文件中。

{
  "name": "k8s-node-dev",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "start": "pm2-docker start ./pm2.json"
  },
  "dependencies": {
  },
  "devDependencies": {
    "gulp": "^3.9.1"
  }
}

配置设置在pm2.json文件中完成。

{
    "apps": [
        {
            "name": "k8s-node-dev",
            "script": "./app.js",
            "node_args": "--inspect=0.0.0.0:3002"
        }
    ]
}

我在node_args中设置了调试端口。

将源代码进行NFS挂载。

将 Mac 上的源代码挂载到 minikube 上,在 Mac 上进行编辑,然后在 Kubernetes 上执行。由于使用 NFS 比 minikube mount 更快,因此我们将使用 NFS。

参考minikube mount的情况下,启动节点需要超过10秒。

$ cd project_dir
$ echo "$(pwd) -network 192.168.0.0 -mask 255.255.0.0 -alldirs -maproot=root:wheel" | sudo tee -a /etc/exports
$ sudo nfsd restart
$ minikube ssh -- sudo busybox mount -v -t nfs 192.168.99.1:$(pwd) /home/docker/shared_volumes/ -o rw,async,noatime,rsize=32768,wsize=32768,proto=tcp

创建一个pod

apiVersion: v1
kind: Service
metadata:
  name: k8s-node-dev
spec:
  selector:
    app: k8s-node-dev
    role: app
    env: local
  ports:
  - protocol: TCP
    name: app
    port: 8081
    targetPort: 3000
    nodePort: 30082
  - name: debug
    port: 3002
    targetPort: 3002
    nodePort: 30089
  type: NodePort
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: k8s-node-dev
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: k8s-node-dev
        role: app
        env: local
    spec:
      containers:
      - name: k8s-node-dev
        image: "node-dev:v1"
        tty: true
        stdin: true
        ports:
        - containerPort: 3000
        - containerPort: 3002
        volumeMounts:
        - mountPath: "/opt/node"
          name: "node-src-volume"
      volumes:
      - name: "node-src-volume"
        hostPath:
          path: "/home/docker/shared_volumes/project_dir"

构建Docker镜像并启动pod。

$ docker build -f ./Dockerfile -t node-dev:v1 .
$ kubectl create -f ./k8s-node.yaml

我会确认动作。

Note: This paraphrase is in Simplified Chinese. If you need the translation in Traditional Chinese characters, please let me know.

$ minikube service k8s-node-dev

在这里准备工作已经完成。

即时更新文件的更改

只要不重新启动Node.js,就无法反映更改。
由于每次手动执行都很麻烦,所以希望能够监视文件的更改并自动重新启动。

通常,只需使用nodemon或node-dev进行启动即可,但在这个环境中,由于nfs挂载的原因,无法检测到文件的更新。(虽然可以通过轮询解决,但有点麻烦…)

在Mac上进行监视

如果pod上出现问题,在mac主机上进行监视。
这次我们将使用gulp。

在Mac上安装Gulp。

$ npm install -g gulp
$ npm install gulp

进行监视和重新启动

let gulp = require('gulp');
let exec = require('child_process').exec;

gulp.task('watch', function(){
    gulp.watch('./**/*.*', ['reload']);
});
gulp.task('reload', function(){
    console.log('reload');
    exec('kubectl exec -it $(kubectl get pod | grep node  | awk -F" " \'{print $1}\') -- pm2 reload all', {shell: '/bin/bash'}, function(error, stdout, stderr) {
        console.log(stdout);
    });
});
$ gulp watch

你在做什么?

    1. 使用gulp.watch监视文件,并使用exec传递处理到bash中。

使用$(kubectl get pod | grep node | awk -F” ” ‘{print $1}’)获取pod的ID。

使用kubectl exec -it $ID — $script执行$script。

使用pm2 reload all重新启动。

采用PM2是因为它可以从外部执行重启操作。

现在,已经搭建好了一个能够顺利应用修正的环境。

我想要调试

由于在pm2.json中已经指定了调试端口3002,并在k8s-node.yaml中开放了用于访问3002的nodePort:30089,因此可以方便地进行调试。

在Chrome浏览器中进行调试

    1. 使用命令”minikube service tama-bff-service –format “{{.IP}}”来确认IP地址。

打开chrome://inspect/#devices。

点击”Open dedicated…”。

打开Connection标签,将${1获取的IP}:30089注册。

在第2步的画面中,远程目标中会显示要检查的目标,打开它。

现在,可以进行调试了。

总结

我整理了使用minikube建立Node.js环境的步骤。
通过结合NFS和gulp,可以实现与本地启动Node.js相差无几的顺畅开发体验。
此外,由于Dockerfile和yaml中已经整合了所有设置,因此可以非常简单地将其引入其他团队成员。

由于目前在开发中,我们对于エブリスタ平台的运营仍在试探阶段,如有任何问题或意见,请随时提出,感谢!

广告

在EveryStar上,我们热切地招募一起工作的成员。

    • アーキテクチャ設計や言語選定から関わるエンジニアリングをしたい方

 

    • 最新技術に触れたい方

 

    • 小説やUGCに関わる仕事に興味がある方

 

    出版業界・コンテンツ業界に変革を起こしたい方

如果您对此有兴趣,或是想进一步了解更多,非常欢迎您从这里申请或是轻松地联系 @daponta!

广告
将在 10 秒后关闭
bannerAds