Kubernetes 企業訓練課程 - 微服務導入實戰

課程時間 2018/05/27 & 2018/06/03

ta-ching chen

1 minute read

 文章目錄

課堂挑戰題影片說明 


課堂疑問整理 

若有任何疑問歡迎在下面 DISQUS 提問 :)

容器在不做資源限制的狀況下是否會使用 Host 所有資源? 

沒錯,因此必須針對各容器做適當的限制避免耗盡資源。另外,有以下幾點好處

  1. 利於容器調度
  2. 避免單一容器異常波及其他正常服務
  3. 統計容器叢集資源使用總量
  4. 避免影響 host 正常運作

單台 host 開越多容器是否意味著能夠負載更多連線 

這邊是常見的誤區,儘管容器之間的資源可以共享但實際上仍然受制於 host 上的資源總量。假設某應用在 host 上執行最高能負載 500 條連線,打包成容器執行後會變成 total connections <= 500,不會變成 500 * N。容器的優勢在於開關快速,可以根據服務的負載快速開關,以因應服務需求。但當資源總量不足時仍然需要透過擴張節點來支撐流量。

是否可以自行建立 private image registry 

可以,一般來說除了公開流通的映像檔外,公司都會建立 private registry 避免安全疑慮。目前 Docker 有提供對應的 registry image 以供使用,詳情可以參考官網說明

Dockerfile 內的 ENTRYPOINT 跟 CMD 差別,以及應該使用何者 

StackOverflow 上有篇回答精準描述兩者間的區別

The ENTRYPOINT specifies a command that will always be executed when the container starts.

The CMD specifies arguments that will be fed to the ENTRYPOINT.

其實透過 docker 打包的 image 都會有個預設 ENTRYPOINT /bin/sh -c,而當容器運作時會將 CMD 的參數放在預設 ENTRYPOINT 後面。比方說 CMD ["ping", "8.8.8.8"] 實際運作時會變成 /bin/sh -c 'ping 8.8.8.8'

要使用 CMD 或 ENTRYPOINT 看個人偏好,我個人喜歡 ENTRYPOINT,但一般來說 CMD 是相對常見的選項。

是否可以利用 Container 的方式達成開發環境一致化 

可以,但需要看開發流程是如何進行,最怕的是環境一致性的確上升卻大幅降低開發效率。我會將關鍵點放在「執行環境一致化」,因為只要能在執行環境內正常運作即表示開發正確。

Dev env

個人建議的方式 (如上圖):

  1. 建立實際執行環境用的容器映像檔
  2. 透過 docker volume mount 的方式,將本地的程式資料夾整個掛載進容器內
  3. 在容器內下指令執行程式
  4. 在本機修改程式,而容器內的掛載內容也會隨之改變

重覆 3, 4 步驟即可避免大幅影響開發效率又能達到執行環境一致的效果

Kubernetes Service 是否會自動平衡不同 Pod 間的 connection 數量 

Service 在沒有啟用 SessionAffinity 的狀況下,底層實作原理是透過 iptables probability 將連線隨機分配到不同 Pod 處理,因此這個問題的答案就需要視連線的種類而定。通常連線分成兩種:

  1. 短時連線 (Short-lived connection)
  2. 長時連線 (Long-lived connection)

短時連線特色是連線時間短、次數頻繁,而長時連線則是連線時間長、次數少。

由於流線分配的時機點是在連線建立時才會發生,因此前者會因此重建次數頻繁使得不同 Pod 間的連線數趨於一致。後者則因為一直保持連線因此不會觸發連線分配,流量較難以分散。

相關文章

comments powered by Disqus