本篇文章是個經驗分享文,作者分享使用 Docker 作為開發環境時值得注意的 Best practices,透過這些經驗分享希望能夠讓開發者少走一些冤枉路。
原文提出了 15 個經驗談,這邊幫大家節錄幾個,有興趣的可以點選原文瞭解更多!
1. One thing at a time
2. Be ephemeral
3. Utilize .dockerignore
4. Less is more
5. Secrets should be secret
6. PID 1 is your birth right
7. Share and Care
8. Vulnerability Scan
9. Tag like you mean it
10. Permissions are costly
11. Source of Truth
12. Always official
13. Don’t include debug
14. Use entry point script smartly
15. Size does matter
One thing at a time
建置 Image 的時候專注做好一件事情,每個 Image 應該有一個專心要解決的問題,譬如一個應用程式,一個小工具等。對於 Nginx 這類型的 Image 來說,應該沒有人會期望於裡面看到有 Apache 的應用程式吧?
Be ephemeral
這個主要探討的是該 Image 本身建置時應該要以 stateless 的概念去處理,未來不論是透過 docker 或是 Kubernetes 來管理部署時,Contaienr 都很有機會被重啟,每次的重啟都意味該容器是重新啟動。所以千萬不要讓你的 Image 變成多次重啟會導致應用程式出問題的形式,任何的這類型資料應該都要透過外部取得,不要塞到你的 Image 內
Utilize .dockerignore
善用 .dockerignore 這個檔案來將不必要的檔案從 build 過程給排除,使用方法與 .gitignore 類似。透過這個檔案的設定可以避免 docker build 的時候不會把一些過大或是完全不需要的檔案都送給 docker daemon,不當浪費時間也浪費空間。
Less is more
避免安裝任何無關或是非必要的套件到你的 image 中,特別是那些 "nice to have" 的理由。
註: 我個人是滿討厭把 Image 弄得很乾淨的,除錯什麼工具都沒有,連 ash/sh/busybox/bash 都沒有的 image 更是我討厭中的排行榜冠軍
Secrets should be secret
任何機密資訊都應該要於運行期間動態載入,而不是建置期間塞入。請使用其他工具譬如 Vault 來管理這些機密資訊,並且執行期間讓 Container 能夠存取到正確的值。
PID 1 is your birth right
Linux 環境下會使用 SIGTERN, SIGKILL 等相關的 Singal 來戳你的應用程式,請確保你運行的應用程式要能夠攔截這些訊號來處理並完成有效的 Graceful shutdown.
Share and Care
如果環境中有多個 Image 彼此有共享相同的工具與功能,與其每個 Image 都單獨建置維護不如建置一個 Base Image,接者讓所有要使用的 image 去載入使用即可。
透過這種方式可以讓整體的維護性與管理性更為簡單,每個 image 可以減少重複的程式碼,同時要升級時只要針對 base Image 處理即可。
https://medium.com/pradpoddar/avoid-costly-mistakes-using-advanced-docker-development-best-practices-acd812784109
同時也有10000部Youtube影片,追蹤數超過2,910的網紅コバにゃんチャンネル,也在其Youtube影片中提到,...
「sigkill」的推薦目錄:
- 關於sigkill 在 矽谷牛的耕田筆記 Facebook 的精選貼文
- 關於sigkill 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
- 關於sigkill 在 コバにゃんチャンネル Youtube 的最讚貼文
- 關於sigkill 在 大象中醫 Youtube 的最佳貼文
- 關於sigkill 在 大象中醫 Youtube 的最讚貼文
- 關於sigkill 在 SIGKILL to a subprocess tree on parent termination - Stack ... 的評價
- 關於sigkill 在 What does a program do when it's sent SIGKILL signal? - Unix ... 的評價
- 關於sigkill 在 Kill exec process with SIGTERM instead of SIGKILL #21 - GitHub 的評價
- 關於sigkill 在 Process Signals in Linux | SIGINT , SIGKILL , SIGTERM ... 的評價
- 關於sigkill 在 nixCraft - The Real Reason to Not Use SIGKILL on Linux or ... 的評價
sigkill 在 矽谷牛的耕田筆記 Facebook 的最佳貼文
今天這篇文章作者跟大家分享一些如何加強 Kubernetes 服務穩定的方式,這篇文章這邊做個簡單摘要一下
發生問題:
作者的 k8s 是基於 Google Kubernetes Service (GKE)的叢集,運作過程中有時候會發現部分節點當掉,最後導致部分的服務不能正確使用。這邊作者團隊從兩個角度出發去改善
1. 研究為什麼節點會一直當掉,與 Google Supporte Team 來回信件最後有找到問題點
2. 強化 Kubernetes 服務的韌性,就算有部分節點壞掉也要讓服務能夠繼續運行
,本文主要的一些觀點也都是基於這邊發展
強化方式
1. 修正 Deployment 的數量,並且加上 Anti-Affinity,讓這些 Deployment 的副本能夠散落到不同的節點上,避免所有 Pod 都塞到同個節點,最後該節點出問題導致 Pod 全部出問題。
2. 所有需要被 Service 存取的服務都加上 Readess Probe 來確保這些服務都準備好後才會收到服務,避免一些請求被送過來確又不能正確處理
3. 加入 Pre-Stop 的使用,再裡面透過 sleep 10的方式,讓 Pod 要被刪除能夠將手上的封包請求給處理完畢
(請看註解補充)
註: 我個人認為第三點其實不太需要,比較漂亮的作法應該是實作 Singal Handler 去處理 SIGTERM 的訊號,收到此訊號後就不要再接受任何 Request 並且把剩下的工作處理完畢,當然如果這部份處理的時間過長,超過預設的 GracePeriod (30sec),就會被 SIGKILL 給強制刪除。
要解決這個問題可能就要從應用程式下手去看如何改善,或是透過修改 API server 來增加 GracePeroid 的數值
可以點選下方連結來瞭解更多全文,內容不長
https://medium.com/kudos-engineering/increasing-resilience-in-kubernetes-b6ddc9fecf80
sigkill 在 コバにゃんチャンネル Youtube 的最讚貼文
sigkill 在 大象中醫 Youtube 的最佳貼文
sigkill 在 大象中醫 Youtube 的最讚貼文
sigkill 在 What does a program do when it's sent SIGKILL signal? - Unix ... 的推薦與評價
When SIGKILL for a specific process is sent, the kernel's scheduler immediately stops giving that process any more CPU time for running ... ... <看更多>
相關內容
sigkill 在 Kill exec process with SIGTERM instead of SIGKILL #21 - GitHub 的推薦與評價
CommandContext, which will kill the runc command with os.Process.Kill when the context is done. And when runc is killed by SIGKILL, the exec ... ... <看更多>
sigkill 在 SIGKILL to a subprocess tree on parent termination - Stack ... 的推薦與評價
... <看更多>
相關內容