我开发了一个 Nodejs REST API,为此我构建了一个 docker 镜像,现在将其作为 pod 部署在我的 kubernetes 集群上。
Dockerfile
FROM mhart/alpine-node:8
WORKDIR /home/appHome/
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]
但是,我传递 npm start 作为我的容器启动命令。
但是我如何使用 npm test 测试我的 Node 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 文件。
部署.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
> <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="6a3909020f0e1f060f0e3e0b19012a5b445a445a" rel="noreferrer noopener nofollow">[email protected]</a> 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
> <a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="92c1f1faf7f6e7fef7f6c6f3e1f9d2a3bca2bca2" rel="noreferrer noopener nofollow">[email protected]</a> 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。为您的应用程序创建一个作业。
您可以使用应用程序的部署作为模板。您需要更改
kind: Job 并添加
spec.containers.command: ["npm", "test"],最后一个将替换
CMD [ "npm", "start"] 在 Dockerfile 中定义。这是一个例子:
强>
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 集成,并为此类情况提供大量功能。




