步步驚心:從頭部署服務到 Kubernetes(四)
輸出並查看應用程式日誌
當我們把軟體部署到 minikube / kubernetes 後,就要開始確認 app 運行的情況。
這裡有兩個目標要達成:
- 第一個目標需求:使 App 產生的 log 可以被查看。
- 第二個目標需求:是有時候可能需要即時修改一些小地方以便驗證可行性或正確性之類的,畢竟每次修改都要打包 Image 還是有些繁瑣,而且也比較花時間。
使 App 產生的 Log 可以被查看
對於 container 來說,只要是把訊息丟到標準輸出,就可以用 kubectl 指令查看 Log 。對 Node.js 來說,也就是用 console.log 就可以了。以這系列第一篇的 sample code 來說,在啟動時有送出一行訊息,就可以用指令來確認看看:
$ POD_NAME=$(kubectl get pods -l app=hellonode -o jsonpath='{.items[0].metadata.name}')
$ kubectl logs $POD_NAMEExample app listening on port 3000!
如果 log 太多,只想看最近 10 分鐘內的 log ,可以這樣下指令:
$ kubectl logs --since=10m $POD_NAME
有時想要持續觀看 log ,不用每次測試後還要再下指令查看,可以用下列指令進行,這個方式會保持在顯示 log 的狀態,要中斷的話可以按 Ctrl + c:
$ kubectl logs -f $POD_NAME
不重包 Image 也可以重新驗證設定
查看 log 的方式和採用的程式語言種類或環境比較無關,只要 log 是送到標準輸出即可。但是第二個需求相對來說會比較困難,和所使用的程式語言或者環境有關,因為這和程式執行的方式有關。以這系列第一篇裡的 Dockerfile 打包的方式來說,是無法達成這個需求的。
以 nodejs 來說,最簡單的方法是透過 nodemon 這個工具,我們稍微調整一下之前的 Dockerfile
FROM node:8.9-alpineRUN mkdir -p /app
WORKDIR /appCOPY package*.json ./
RUN npm install
COPY index.js /appEXPOSE 3000CMD ["npm", "run", "dev"]
然後先用 npm init 產生 package.json ,然後用以下指令引入套件
$ npm install --save express
$ npm install --save-dev nodemon
然後重新打包上傳,然後更新 Deployment
$ docker build -t duanli/hello-node:0.0.2 .
$ docker push duanli/hello-node:0.0.2
$ kubectl set image deployment/hellonode hello-node=duanli/hello-node:0.0.2 --record
接下來的部分比較複雜一點,稍微說明一下。一般來說,修改的方式是進到 container 裡,用編輯器修改檔案。這個 image 裡可以使用 vi 來編輯檔案,不過為了文章編排方便,我們簡單用個 sed 指令去修改檔案內容來驗證。
進入 container 的指令如下:
$ kubectl exec -it $POD_NAME -- sh
不過如同上面所述,我們不直接進 container 修改,而是直接傳 sed 指令修改,然後驗證
$ kubectl exec -it hellonode-6bf85ddd9c-8ffq8 -- sed -i 's/World/Node/' index.js
$ curl --resolve hello.node.minikube:80:192.168.64.2 http://hello.node.minikube
Hello Node!