步步驚心:從頭部署服務到 Kubernetes(四)

Duan Li
Brobridge - 寬橋微服務
4 min readMay 5, 2020

輸出並查看應用程式日誌

Photo by Christopher Burns on Unsplash

當我們把軟體部署到 minikube / kubernetes 後,就要開始確認 app 運行的情況。

這裡有兩個目標要達成:

  1. 第一個目標需求:使 App 產生的 log 可以被查看。
  2. 第二個目標需求:是有時候可能需要即時修改一些小地方以便驗證可行性或正確性之類的,畢竟每次修改都要打包 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_NAME
Example 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 /app
COPY package*.json ./
RUN npm install
COPY index.js /app
EXPOSE 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!

由上面的說明可知,關鍵在於 Dockerfile 是如何撰寫的。

Dockerfile 的撰寫方式有蠻多需要注意的地方,包含效能、安全與執行速度上的種種考量,而且和程式語言種類也有相當密切的關係。這系列文章原則上盡可能以簡單能運作為主,但對開發人員來說,如何撰寫 Dockerfile 是值得深入的議題。

下一篇會開始介紹稍微複雜一點的情境,多隻程式在 kubernetes 內的互動方式。

<<上一篇 | 下一篇>>

--

--

Duan Li
Brobridge - 寬橋微服務

All we do crumbles to the ground, though we refuse to see, dust in the wind, all we are is dust in the wind