Skip to main content

· 3 min read

標題: 「 Kubernetes 四種不同開發環境的比較」 類別: Kubernetes 連結: https://loft-sh.medium.com/kubernetes-development-environments-a-comparison-f4fa0b3d3d8b

根據 VMware 2020 的一個研究報告指出,如何存取 Kubernetes 叢集是影響開發者生產效率的最大要素,所以本篇文章就是就會針對如何去評估與挑選一個適合開發者的 Kubernetes 叢集與存取方式。

作者將 Kubernetes 叢集分成四大類,分別是

  1. Local Cluster: 開發者會基於自己本地的電腦來創造一個本地的 Kubernetes 叢集
  2. Individual Cloud-Based Cluster: 開發者基於雲端環境來創建一個專屬於該開發者的 Kubernetes 叢集
  3. Self-Service Namespace: 使用基於 namespace 的方式來讓多位開發者共享一個 Kubernetes 叢集
  4. Self-Service Virtual Cluster: 讓 Kubernetes 來創建更多小 Kubernetes 叢集並且讓每個使用者有獨立專屬的 Kubernetes 叢集

為了比較這四種不同的叢集,作者定義了幾個不同的面向,針對這幾個面向來評比,分別是

  1. Developer Experience: 對於開發者來說要如何開始使用叢集,包含架設的複雜度,使用的難易度以及需要的相關背景多寡
  2. Admin Experience: 對於公司的管理人員來說需要花多少心力來管理該從開發者環境,除了基本的管理還要考慮增加新使用者帶來的負擔
  3. Flexibility/Realism: 該開發環境與正式生產環境的架構相似度如何,此外開發者是否有足夠的彈性去客製化該叢集的所有設定
  4. Scalability: 該環境是否能夠根據開發需求來擴充? 特別是針對部分需要大量使用資源的應用程式開發是否有辦法處理。
  5. Isolation/Stability: 開發者彼此之間的隔離程度如何,彼此之間的工作是否會影響彼此? 有資安問題的時候是否會連環爆?
  6. Cost: 該解決方案的成本多寡,成本就是真正的金錢考量。

文章一開始就有列出一個結論表,對於這個議題有興趣的歡迎閱讀

· 3 min read

標題: 「 談談遷移應用程式到 Kubernetes 內的失敗經驗談」 類別: Kubernetes 連結: https://medium.com/@marcong_54227/unsuccessful-experience-of-migrating-applications-to-kubernetes-a896823d9b95

作者團隊於 2019 年要開發一個全新的 API 應用程式,當時部門的 IT 團隊計畫要將既有的 VM-Based 應用程式給轉換到 Container-Based,最後團隊使用了 RedHat 的系統,並且使用 OpenShift 做為容器管理平台。

從結果來看,該專案從 2020/05 一路到 2021/05 花了整整一年也沒有順利的將應用程式轉移到 OpenShift 中,其中的一些重點有

  1. 初期建設時 RedHat 有展示過如何使用 Java 基於 Fuse 開發應用程式,但是作者團隊全部都是 .Net 的經驗,因此團隊花了很多時間來學習如何使用 Fuse
  2. 2020/06 時因為團隊的進度緩慢,所以 IT 團隊尋找外部的軟體顧問,尋求如何將 .Net 從 VM 轉移到 OpenShift
  3. 團隊內的開發者都不擅長學習新技術,對於學習新技術這一塊非常不行。
  4. 外部團隊幫忙建置了 CI/CD 系統,然後團隊內從 2020/09 開始進行程式開發與轉移,可惜直到 2021/05 依然沒有半個產品成功的用 OpenShift 作為正式生產環境
  5. 與此同時,外部團隊也撰寫了幾個 .NET 示範應用程式來展示容器化的注意事項,然而團隊本身對 Container 的知識非常薄落,所以團隊人員沒有辦法參考這些範例程式來改善自己開發過程

最後團隊內又針對不同團隊給予不同的想法

  1. Application Team
  2. Server Team
  3. Network Team
  4. IT Management Team

譬如 Application Team 的開發人員都只滿足自身的技能,而且拒絕學習新技能,誇張的是一年過後團隊內的人也沒有辦法撰寫 dockerfile 或是使用 docker build.

後續還有一些針對不同團隊的想法與總體建議,整體來說非常真實,一個血淋淋的轉換案例。

· 3 min read

標題: 「GitHub 上常常看到的奇妙 commit 到底是什麼?」 類別: others 連結: https://people.kernel.org/monsieuricon/cross-fork-object-sharing-in-git-is-not-a-bug

每過一段時間都可以於 GitHub 上面看到一些看起來很嚇人的 Commit,最經典莫過於 Linux Kernel 中的各種內容,譬如檔案被砍光,README 加入一些驚嚇言論 不知道情的使用者可能會想說這個內容是真正的 Github Repo 上的東西,鐵定是真正被認可而合併進去的,所以相信不疑。 殊不知這一切其實都只是 Git 的底層設計使得一些有心人可以打造出一些以假亂真的內容,文章中就有列出兩個關於 Linux Kernel 的有趣 Commit.

文章內詳細的去解釋整個來龍去賣以及底層 Git 的設計,包含 blob, tree, commit 之間的關係,並且說明為什麼有心人可以輕鬆的產生這些以假亂真的 Commit。 舉個範例來說,Linux Kernel 的整個 Git 專案大概有 3GB 的大小,然後被 Fork 的次數高達 40000 次,請問從實作方面來考量,你會希望

  1. 每個 Fork 有一份屬於自己的 Git 專案?
  2. 仰賴 Git 的底層設計,針對差異性去記錄每個 Fork 專案?

如果是選項(1)的話,那這樣至少要準備 120TB 的資料,從儲存方面來說完全不是一個可接受的實作方式,因此自然而然的都會是基於(2)的方式去實作 因此該 Linux Kernel 的 Git 專案實際上裡面記錄了所有的 Fork 資料,而每個人針對自己的 Fork 去進行更新等行為也都會記錄到 Linux Kernel 本身的專案上。 換句話說, 那 40000 個 Fork 出來的專案實際上還是共用同一份 Git 專案,因此每個人的 Commit 都只要該 Hash 被知道,其他人都有機會去檢視與瀏覽。

而 GitHub 的 UI 又允許使用者以 Commit Hash 的方式去瀏覽每一個 Commit 的內容,因此就可以跑到主要專案去輸入自己 Fork 產生的 Commit 來產生以假亂真的 Commit 內容。

對於整體有興趣的可以觀看全文

· One min read

https://daniel.feldroy.com/posts/autodocumenting-makefiles

標題: 「透過一點小技巧讓你的 Makefile 有一個更好的 Help說明」 類別: tools 連結: https://daniel.feldroy.com/posts/autodocumenting-makefiles

本篇文章使用 python 搭配 Makefile 的內建語法來輕鬆幫你的 Makefile 加上各種 Help 訊息,整個概念滿簡單的

  1. 每個 Target 後面都補上一個基於 ## 的註解說明
  2. 使用 define/endef 來定義一個 python3 的內容,該 python3 會從 stdin 中去判別該 target 是否含有 ## 的字串,有的話就組合起來,並且輸出
  3. 加入一個 help 的 target,將內建變數 MAKEFILE_LIST 給丟到上述的 python3 去執行

有興趣的可以看看,整個寫法非常簡單有趣。

· One min read

標題: 「視覺化系統內 iptables 規則」 類別: tools 連結: https://github.com/Nudin/iptable_vis

這是一個非常有趣的小工具,目標就是視覺化系統中的 iptables 規則,把 chain 之間的關聯給視覺化呈現出來 整個專案非常小,該專案主要會透過 awk 來解析系統中的規則並且產生特定輸出,接者使用別的軟體將該輸出給轉換成圖檔

有興趣的都可以使用看看

· One min read

標題: 「如何用 2297 個 Linux Kernel Patches 來重新整理所有的 header file 並提升整個 Kernel 建置時間高達 78%」 類別: 其他 連結: https://www.phoronix.com/scan.php?page=news_item&px=Linux-Fast-Kernel-Headers

摘要: Linux Kernel 的長期貢獻者 Ingo Molnar 花了一年多的時間整理 Kernel 內的 Header 架構,一口氣提交了 2297 個 patches,其中影響 的檔案數量有 25,288 個,並且加入了 178,024 行數,移除了 74,720 行。 這一系列的改動直接重新整理 Linux Kernel 內將近 10,000 個不同的 header 檔案,這次的整理將過去 30 年累積的各種你呼叫我,我呼叫你這 種「Dependency Hell」問題給一起處理掉,結果論來說提升了整體建置時間 50% ~ 80 %

· 2 min read

標題: 「如何使用 jq 讓你的 kubectl更為強大」 類別: tools 連結: https://medium.com/geekculture/my-jq-cheatsheet-34054df5b650

作者認為 kubectl 本身提供的 label-selector, go-templates, jsonpath, custom-colume 等各式各樣功能使這個工具變得強大,能夠找到符合自己需求的各式各樣資源 然而上述的這些指令使用起來還是會覺得卡卡的,並沒有辦法滿足所有條件,而且不同選項的語法也完全不同,所以對於操作者來說其實不太便利。

順利的是 kubectl 可以透過 -o json 以 json 的格式輸出結果,這時候就可以搭配 jq 這個指令來使用,相對於前述的各種用法,作者更加推薦使用 jq 來處理,因為 jq 是一個更為廣泛的工具, 除了 kubectl 可以搭配外,很多時候都可以搭配 jq 來處理其他情況,因此掌握 jq 的語法實務上會有更多用途。

文章幾乎都是以 kubectl 為範例來介紹 jq 內的各種用法,除了基本的 read/write/filter 之外,還有各式各樣 jq 的內建函式, 有興趣的都可以使用看看

· 2 min read

標題: 「PwnKit, 長達 12 年可以讓一般使用者輕鬆變成 Root 的 CVE」 類別: others 連結: https://blog.qualys.com/vulnerabilities-threat-research/2022/01/25/pwnkit-local-privilege-escalation-vulnerability-discovered-in-polkits-pkexec-cve-2021-4034

CVE-2021-4034 講述的是 pkexec 此工具的 vulnerability,其影響範圍非常廣大,主要原因有

  1. 滿多系統預設都有安裝這個工具,而該工具預設有 SUID 的權限
  2. 2009 後的版本就內建此安全性問題,所以請趕緊更新系統上的 pkexec
  3. 任何使用者可以輕鬆地直接透過此漏洞變成 root 的身份,譬如你今天取得一個 nobody 的角色,你也是有辦法變成 root 的。

漏洞細節文章中有解釋非常多,主要是記憶體位置的處理沒有處理,當運行參數為空的時候,程式會意外地去讀取到後面的 envp 這塊用來存放環境變數的區塊,搭配 pkexec 後續的程式邏輯就有機會觸發本次 CVE 的安全性問題。 所以請趕緊更新系統上的 pkexec,確保該版本已經更新,否則任何一個使用者都可以輕鬆變成 root。

Ubuntu 使用者可參考 https://ubuntu.com/security/CVE-2021-4034

· One min read

標題: 「Linux 5.17 將使用 BLAKE2s 來替代 SAH1 來達到更安全更快速的隨機亂數產生器」 類別: other 連結: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-RNG

Linux Kernel 內亂數子系統的維護者近期遞交了一個將 SAH1 給全面替換為 BLAKE2s 的相關 Patch

相對於 SHA1 來說, BLAKE2s 本身更為安全,同時計算速度也更快,這邊也可以參考下列這篇 2017 的文章 https://valerieaurora.org/hash.html 來探討不同 HASH 演算法的一些狀態,雖然沒有及時更新到 2022 的狀態,但是如果 2017 都 不安全的東西現在就更不應該使用,譬如文章中提到 SAH1 於 2017 就被 Google 用(6500 CPU或是110 GPU)的實驗來證實有衝突,建議停止使用。

· 2 min read

標題: 「Kubernetes 內透過 DNS-01 處理 wildcard TLS 的兩三事」 類別: introduction 連結: https://medium.com/linkbynet/dns-01-challenge-wildcard-tls-certificates-on-kubernetes-d2e7e3367328

很多人都會使用 Kubernetes 的 Ingress 讓外部可以存取的部署的應用程式,同時會透過 Ingress 搭配 Cert Manager 來處理 TLS 的憑證 大部分情況下都會使用 HTTP-01 的方式來進行域名擁有性的認證,而某些情況可能不方便透過 HTTP 來驗證的話就會採取 DNS-01 的方式透過 DNS 創建一個 TXT 的資訊來驗證域名的擁有權,本篇文章則是作者分享 DNS-01 的一些心得分享

  1. 文章開頭有介紹使用的 Stack,包含透過 Terraform 來架設模擬環境,並且使用 Scaleway DNS 作為 DNS Provider
  2. Cert-Manager 部分的 DNS Provider 要採用 webhook 的方式來動態處理請求,當 cert-manager 偵測到有新的 TLS 憑證 需求時就會透過 webhook 的方式去創建遠方的 DNS TXT 紀錄,接者 Let's Encrypt 就會透過 TXT 來判斷你是否真的擁有個域名

對 DNS-01 使用有興趣的可以看看本篇文章