簡體   English   中英

如何測試在kubernetes集群上部署為pod的nodejs應用程序?

[英]how to test nodejs application which is deployed as a pod on kubernetes cluster?

我已經開發了一個nodejs REST API,為此我構建了一個docker鏡像,現在將其部署為我的kubernetes集群上的pod。

Dockerfile

FROM mhart/alpine-node:8
WORKDIR /home/appHome/
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

但是,我正在通過npm start作為我的容器啟動命令。

但是如何使用npm測試測試我的節點js應用程序並驗證測試結果?

當我在我的本地系統中執行它時,我曾經在后端運行應用程序並且曾經運行過

npm test

在另一個窗口。 如何在kubernetes集群上部署它時實現相同的目標! 一旦成功,取下測試部分!

下面是我的package.json腳本,

"scripts": {
"test": "mocha ./test/scheduledTaskTest.js",
"start": "nodemon app.js --exec babel-node --presets es2015,stage-2",
"cmd": "set NODE_ENV=devConfig&& npm start"
},

以下是部署和作業yaml文件。

Deployment.yaml

apiVersion: extensions/v1beta1
kind: Deployment
metadata:
  name: scheduled-task-test
spec:
  replicas: 1
  selector:
    matchLabels:
      app: scheduled-task-test
  template:
    metadata:
      labels:
        app: scheduled-task-test
    spec:     # pod spec       
      containers:
      - name: st-c1
        image: 104466/st
        imagePullPolicy: Always
        env: 
        - name: NODE_ENV
          value: devConfig
      - name: st-c2
        image: 104466/st
        imagePullPolicy: Always
        command: [ 'sh','-c','npm test && sleep 3600']'

TestJob.yaml

apiVersion: batch/v1
kind: Job
metadata:
  name: scheduled-task-test-job
  labels:
    purpose: test
spec:
  template:
    spec:
      containers:
      - name: st-c1
        image: 104466/st
        imagePullPolicy: Always
        env: 
        - name: NODE_ENV
          value: devConfig
      - name: st-c2
        image: 104466/st
        imagePullPolicy: Always
        command: [ 'sh','-c','npm test && sleep 3600']
      restartPolicy: Never

Pod狀態

scheduled-task-test-7d86c87d44-q9zdv                              2/2       Running   1          8m        100.96.9.87   ip-172-20-34-139.us-west-2.compute.internal
scheduled-task-test-job-gt9hx                                     1/2       Error     0          7m        100.96.9.88   ip-172-20-34-139.us-west-2.compute.internal

成功執行測試用例pod日志(部署結果)

kubectl logs scheduled-task-test-7d86c87d44-q9zdv -c st-c2

> ScheduledTask@1.0.0 test /home/appHome/ScheduledTask
> mocha ./test/scheduledTaskTest.js



  Testing listTask api
    ✓ List all the Tasks (435ms)

  Testing addTask api
    ✓  Add a new task  (438ms)

  Testing updateTask api
    ✓  Update task

  Testing delete task api
    ✓  Delete task  (434ms)


  4 passing (1s)

測試失敗的日志,(在作業中執行容器)

kubectl logs scheduled-task-test-job-gt9hx -c st-c2

> ScheduledTask@1.0.0 test /home/appHome/ScheduledTask
> mocha ./test/scheduledTaskTest.js



  Testing listTask api
    1) List all the Tasks

  Testing addTask api
    2)  Add a new task

  Testing updateTask api
    3)  Update task

  Testing delete task api
    4)  Delete task


  0 passing (61ms)
  4 failing

  1) Testing listTask api
       List all the Tasks:
     Uncaught TypeError: Cannot read property 'body' of undefined
      at Request._callback (test/scheduledTaskTest.js:24:29)
      at self.callback (node_modules/request/request.js:186:22)
      at Request.onRequestError (node_modules/request/request.js:878:8)
      at Socket.socketErrorListener (_http_client.js:387:9)
      at emitErrorNT (internal/streams/destroy.js:64:8)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  2) Testing addTask api
        Add a new task :
     Uncaught TypeError: Cannot read property 'body' of undefined
      at Request._callback (test/scheduledTaskTest.js:43:20)
      at self.callback (node_modules/request/request.js:186:22)
      at Request.onRequestError (node_modules/request/request.js:878:8)
      at Socket.socketErrorListener (_http_client.js:387:9)
      at emitErrorNT (internal/streams/destroy.js:64:8)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  3) Testing updateTask api
        Update task :
     Uncaught TypeError: Cannot read property 'body' of undefined
      at Request._callback (test/scheduledTaskTest.js:63:20)
      at self.callback (node_modules/request/request.js:186:22)
      at Request.onRequestError (node_modules/request/request.js:878:8)
      at Socket.socketErrorListener (_http_client.js:387:9)
      at emitErrorNT (internal/streams/destroy.js:64:8)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)

  4) Testing delete task api
        Delete task :
     Uncaught TypeError: Cannot read property 'body' of undefined
      at Request._callback (test/scheduledTaskTest.js:83:20)
      at self.callback (node_modules/request/request.js:186:22)
      at Request.onRequestError (node_modules/request/request.js:878:8)
      at Socket.socketErrorListener (_http_client.js:387:9)
      at emitErrorNT (internal/streams/destroy.js:64:8)
      at _combinedTickCallback (internal/process/next_tick.js:138:11)
      at process._tickCallback (internal/process/next_tick.js:180:9)



npm ERR! Test failed.  See above for more details.

描述Pod的日志(部署為作業的容器)

kubectl describe pod scheduled-task-test-job-gt9hx
Name:           scheduled-task-test-job-gt9hx
Namespace:      default
Node:           ip-172-20-34-139.us-west-2.compute.internal/172.20.34.139
Start Time:     Tue, 19 Jun 2018 16:28:06 +0000
Labels:         controller-uid=bf5569e5-73dd-11e8-8ede-02924b27b126
                job-name=scheduled-task-test-job
Annotations:    kubernetes.io/created-by={"kind":"SerializedReference","apiVersion":"v1","reference":{"kind":"Job","namespace":"default","name":"scheduled-task-test-job","uid":"bf5569e5-73dd-11e8-8ede-02924b27b126","...
                kubernetes.io/limit-ranger=LimitRanger plugin set: cpu request for container st-c1; cpu request for container st-c2
Status:         Running
IP:             100.96.9.88
Created By:     Job/scheduled-task-test-job
Controlled By:  Job/scheduled-task-test-job
Containers:
  st-c1:
    Container ID:   docker://7fc17e717921020cec074774ccb87956979712e7de55480be6e6bd586b28ce6d
    Image:          104466/st
    Image ID:       docker-pullable://104466/st@sha256:91414cc48e86975041c233329b1814d7c6d2b76bc839a24fa68e99f92750390f
    Port:           <none>
    State:          Running
      Started:      Tue, 19 Jun 2018 16:28:08 +0000
    Ready:          True
    Restart Count:  0
    Requests:
      cpu:  100m
    Environment:
      NODE_ENV:  devConfig
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2tvsm (ro)
  st-c2:
    Container ID:  docker://95837799d34e1e14f7718acc1dc745042b94a33f115aab11a03a25ab4a569c18
    Image:         104466/st
    Image ID:      docker-pullable://104466/st@sha256:91414cc48e86975041c233329b1814d7c6d2b76bc839a24fa68e99f92750390f
    Port:          <none>
    Command:
      sh
      -c
      npm test && sleep 3600
    State:          Terminated
      Reason:       Error
      Exit Code:    1
      Started:      Tue, 19 Jun 2018 16:28:10 +0000
      Finished:     Tue, 19 Jun 2018 16:28:12 +0000
    Ready:          False
    Restart Count:  0
    Requests:
      cpu:        100m
    Environment:  <none>
    Mounts:
      /var/run/secrets/kubernetes.io/serviceaccount from default-token-2tvsm (ro)
Conditions:
  Type           Status
  Initialized    True
  Ready          False
  PodScheduled   True
Volumes:
  default-token-2tvsm:
    Type:        Secret (a volume populated by a Secret)
    SecretName:  default-token-2tvsm
    Optional:    false
QoS Class:       Burstable
Node-Selectors:  <none>
Tolerations:     node.alpha.kubernetes.io/notReady:NoExecute for 300s
                 node.alpha.kubernetes.io/unreachable:NoExecute for 300s
Events:          <none>

如果您只想使用Kubernetes,那么使用Jobs將是最簡單的方法。 作業創建一個或多個pod,並確保指定數量的pod成功終止。 隨着pod成功完成,該作業跟蹤成功完成。 達到指定數量的成功完成后,作業本身就完成了。

粗略計划:

1.為您的應用程序創建一個Job。
您可以將應用程序的部署用作模板。 您需要更改kind: Job並添加spec.containers.command: ["npm", "test"] ,最后一個將替換Dockerfile中定義的CMD [ "npm", "start" ] 這是一個例子:

apiVersion: batch/v1
kind: Job
metadata:
  name: npm-test-job
  labels:
    purpose: test
spec:
  template:
    spec:
      containers:
      - name: npm-test-job
        image: <your-image>
        command: ["npm", "test"]
      restartPolicy: Never

2.運行作業
運行作業並等待它完成:

kubectl create -f npm-test-job

3.檢查作業的狀態
檢查作業的狀態,例如:

kubectl describe jobs kubectl describe jobs | grep "Pods Statuses"

4.運行部署
如果測試成功完成,您可以開始部署:

kubectl create -f npm-deployment

當然,您需要自動執行此過程。 因此,您需要開發一個實現此邏輯的腳本。


但我的建議是:最好使用CI工具,比如Jenkins。 它可與Kubernetes輕松集成,並為此類案例提供大量功能。

只需在deployment.yaml的容器部分中指定'command:[“npm”,“test”]'即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM