標題: 「透過 Kubefarm 來自動化幫實體機器打造基於 Kubernetes in Kubernetes 的 Kubernetes 環境」
類別: Kubernetes
連結: https://kubernetes.io/blog/2021/12/22/kubernetes-in-kubernetes-and-pxe-bootable-server-farm/
摘要:
本篇文章要介紹 Kubefarm 這個專案,該專案的目的是希望能夠於大量的實體機器上去創建各式各樣的 Kubernetes 叢集供不同團隊使用
為了讓整體的運作更加自動化,作者先行介紹何謂 Kubernetes in Kubernetes 這個專案,如何透過 Kubeadm 的方式於一個現存的 Kubernetes 專案
去部署 control-plane 並且透過這個 control-plane 去控管其他的 kubernetes 叢集,基本上達到的效果就如同各種 kubernetes service 服務一樣,使用者完全看不到 control-plane 的元件。
雖然透過這個方式可以很輕鬆地去創建新的 Kubernetes 叢集來使用,但是使用上覺得還是不夠方便,特別是這些實體機器還是會有不少手動的過程要處理,
為了讓整體流程更加自動化,作者團隊又基於 Kubernetes in Kubernetes 這個專案為基礎再開發更上層的專案,稱為 Kubefarm,一個如農場般可以快速於實體機器創建各式各樣 kubernetes 叢集的解決方案
Kubefarm 由三個專案組成,分別是
Kubernetes in Kubernetes, LTSP (PXE-Server) 以及 Dnsmasq-Controller
透過這三者專案的結合,實體機器會自動取得 DHCP 的 IP 地址並且透過 PXE 系統自動化安裝 OS,待一切都安裝完畢後又會自動地加入到現存的 Kubernetes 叢集中
整篇文章滿長的,是一過非常有趣的用法與研究,如果團隊是大量實體非虛擬化機器的讀者可以研究看看別人遇到什麼問題以及透過何種思路去解決的。
類別: Kubernetes
連結: https://kubernetes.io/blog/2021/12/22/kubernetes-in-kubernetes-and-pxe-bootable-server-farm/
摘要:
本篇文章要介紹 Kubefarm 這個專案,該專案的目的是希望能夠於大量的實體機器上去創建各式各樣的 Kubernetes 叢集供不同團隊使用
為了讓整體的運作更加自動化,作者先行介紹何謂 Kubernetes in Kubernetes 這個專案,如何透過 Kubeadm 的方式於一個現存的 Kubernetes 專案
去部署 control-plane 並且透過這個 control-plane 去控管其他的 kubernetes 叢集,基本上達到的效果就如同各種 kubernetes service 服務一樣,使用者完全看不到 control-plane 的元件。
雖然透過這個方式可以很輕鬆地去創建新的 Kubernetes 叢集來使用,但是使用上覺得還是不夠方便,特別是這些實體機器還是會有不少手動的過程要處理,
為了讓整體流程更加自動化,作者團隊又基於 Kubernetes in Kubernetes 這個專案為基礎再開發更上層的專案,稱為 Kubefarm,一個如農場般可以快速於實體機器創建各式各樣 kubernetes 叢集的解決方案
Kubefarm 由三個專案組成,分別是
Kubernetes in Kubernetes, LTSP (PXE-Server) 以及 Dnsmasq-Controller
透過這三者專案的結合,實體機器會自動取得 DHCP 的 IP 地址並且透過 PXE 系統自動化安裝 OS,待一切都安裝完畢後又會自動地加入到現存的 Kubernetes 叢集中
整篇文章滿長的,是一過非常有趣的用法與研究,如果團隊是大量實體非虛擬化機器的讀者可以研究看看別人遇到什麼問題以及透過何種思路去解決的。
Kubernetes
Kubernetes-in-Kubernetes and the WEDOS PXE bootable server farm
When you own two data centers, thousands of physical servers, virtual machines and hosting for hundreds of thousands sites, Kubernetes can actually simplify the management of all these things. As practice has shown, by using Kubernetes, you can declaratively…
標題: 「使用 OpenKruise v1.0 提供更進階的 workload 部署與升級」
類別: tool
連結: https://www.cncf.io/blog/2021/12/23/openkruise-v1-0-reaching-new-peaks-of-application-automation/
Openkruise 1.0 版本釋出,該專案是 CNCF 沙盒層級的專案,主要是由阿里巴巴開發與維護,不久前的 Kubeconf 中阿里巴巴的議題也有
分享到有將此專案部署到期內部的 Kubernetes 管理平台
該專案主要是強化 Kubernetes 內應用程式的自動化,包含部署,升級,維運等面向,此外其架構是基於 Operator 去設計的,因此任何的 Kubernetes 叢集都可以安裝這個功能。
相對於原生的 Deployment 等部署方式, Openkruise 提供了
1. 強化 workloads 的部署方式,包含支援原地更新,金絲雀等不同的升級策略。
2. Sidecar 容器的管理,可以更方便地去定義想要自動掛到不同 workloads 上的 sidecar 容器。
3. 提供更多方便維運的功能,譬如可以針對 container 進行重啟,可以針對不同節點進行先行下載 container image,將一個應用程式給部署到多個 namespace 甚至還可以
去定義 Pod 裏面所有 containers 的啟動優先順序,如果 Pod 內的容器彼此之間有依賴性時就可以透過這個功能讓整個啟動過程更加順暢。
有興趣的可以研究看看此專案
類別: tool
連結: https://www.cncf.io/blog/2021/12/23/openkruise-v1-0-reaching-new-peaks-of-application-automation/
Openkruise 1.0 版本釋出,該專案是 CNCF 沙盒層級的專案,主要是由阿里巴巴開發與維護,不久前的 Kubeconf 中阿里巴巴的議題也有
分享到有將此專案部署到期內部的 Kubernetes 管理平台
該專案主要是強化 Kubernetes 內應用程式的自動化,包含部署,升級,維運等面向,此外其架構是基於 Operator 去設計的,因此任何的 Kubernetes 叢集都可以安裝這個功能。
相對於原生的 Deployment 等部署方式, Openkruise 提供了
1. 強化 workloads 的部署方式,包含支援原地更新,金絲雀等不同的升級策略。
2. Sidecar 容器的管理,可以更方便地去定義想要自動掛到不同 workloads 上的 sidecar 容器。
3. 提供更多方便維運的功能,譬如可以針對 container 進行重啟,可以針對不同節點進行先行下載 container image,將一個應用程式給部署到多個 namespace 甚至還可以
去定義 Pod 裏面所有 containers 的啟動優先順序,如果 Pod 內的容器彼此之間有依賴性時就可以透過這個功能讓整個啟動過程更加順暢。
有興趣的可以研究看看此專案
Cloud Native Computing Foundation
OpenKruise v1.0, reaching new peaks of application automation | Cloud Native Computing Foundation
Guest post originally published on OpenKruise's blog by Siyu Wang, Alibaba and Maintainer of OpenKruise We’re pleased to announce the release of OpenKruise 1.0, which is a CNCF Sandbox level project.
標題: 「2021年回顧,因為 DB 的效能的爭論所以我女友跟我分手了....」
類別: usecase
連結: https://ottertune.com/blog/2021-databases-retrospective/
摘要:
2021 對於 DB 行業來說發生了許多風風雨雨,作者列出幾個觀察到的現象並且給予一些評論
「Dominance of PostgreSQL」
愈多愈多的人開發一個新的應用程式時首選都是 PostgreSQL 這個穩定可信賴且一直不停加入新功能的資料庫。
2010 年時 PostgreSQL 的開發團隊決定採取更為激進的方式來每年都要釋出一個主要版本的演進,其相容性的能力使得 PostgreSQL 能夠跟很多系統整合。
譬如前端介面如 Amazon Aurora, YugaByte, Yellowbrick 甚至 Google 都於 2021/10 宣布要讓 Cloud Spanner 支援 PostgreSQL
作者也嘗試從 Database Subreddit 上去爬文搜尋,基於過去一年所有發文去統計每個資料庫的出現次數,以結論來看 PostgreSQL -> MySQL -> MongoDB -> Oracle -> SQLite 等
這個過程不是非常嚴謹的統計分析,只是一個簡單的方式去觀察該論壇上大家都喜歡討論什麼資料庫而已。
「Benchmark Violence」
Benchmark 一直以來都是各個廠商展示軍火的地方,想辦法利用這些數據去說服大眾自己才是最棒的,作者列出去年三個激烈的 benchmark 討論
1. Databricks vs. Snowflake
2. Rockset vs. Apache Druid vs. ClickHouse
3. ClickHouse vs. TimescaleDB
作者也有參與上述血流成河的 Benchmark 的戰場,但是這些爭論的過程中作者失去了不少朋友,甚至連女朋友也一起離開了,作者回過頭來看這一切都
不值得,此外由於現在雲端的 DBMS 也有許多可最佳化的參數,要直接去比較彼此的優劣其實沒有這麼簡單。
後面還有「Big Data, Big Money」以及「In Memoriam」 兩個不同的議題,有興趣的可以點選全文閱讀
類別: usecase
連結: https://ottertune.com/blog/2021-databases-retrospective/
摘要:
2021 對於 DB 行業來說發生了許多風風雨雨,作者列出幾個觀察到的現象並且給予一些評論
「Dominance of PostgreSQL」
愈多愈多的人開發一個新的應用程式時首選都是 PostgreSQL 這個穩定可信賴且一直不停加入新功能的資料庫。
2010 年時 PostgreSQL 的開發團隊決定採取更為激進的方式來每年都要釋出一個主要版本的演進,其相容性的能力使得 PostgreSQL 能夠跟很多系統整合。
譬如前端介面如 Amazon Aurora, YugaByte, Yellowbrick 甚至 Google 都於 2021/10 宣布要讓 Cloud Spanner 支援 PostgreSQL
作者也嘗試從 Database Subreddit 上去爬文搜尋,基於過去一年所有發文去統計每個資料庫的出現次數,以結論來看 PostgreSQL -> MySQL -> MongoDB -> Oracle -> SQLite 等
這個過程不是非常嚴謹的統計分析,只是一個簡單的方式去觀察該論壇上大家都喜歡討論什麼資料庫而已。
「Benchmark Violence」
Benchmark 一直以來都是各個廠商展示軍火的地方,想辦法利用這些數據去說服大眾自己才是最棒的,作者列出去年三個激烈的 benchmark 討論
1. Databricks vs. Snowflake
2. Rockset vs. Apache Druid vs. ClickHouse
3. ClickHouse vs. TimescaleDB
作者也有參與上述血流成河的 Benchmark 的戰場,但是這些爭論的過程中作者失去了不少朋友,甚至連女朋友也一起離開了,作者回過頭來看這一切都
不值得,此外由於現在雲端的 DBMS 也有許多可最佳化的參數,要直接去比較彼此的優劣其實沒有這麼簡單。
後面還有「Big Data, Big Money」以及「In Memoriam」 兩個不同的議題,有興趣的可以點選全文閱讀
Andy Pavlo - Carnegie Mellon University
Databases in 2021: A Year in Review
Andy's take on 2021 database industry happenings - PostgreSQL, Performance Wars, Passings, and Larry Ellison.
標題: 「NPM 的 colors modules 打亂一堆人...」
類別: other
連結: https://research.swtch.com/npm-colors
NPM 上一個著名的 Module Color 以及 Faker 的作者這幾天生氣氣的修改這兩個 module,於 Color 內塞入了無限循環並且印出各種亂碼
然後所有使用這兩個 module 的工具一旦更新就會發現自己的 Terminal 輸出整個爆炸,完全看不懂了。
這篇文章是 Golang 的作者 Russ Cox 分享關於這件事情的一些看法,簡單來說每個開放原始碼的授權都有提到並沒有保固這種事情,所以任何現代化的模組管理者
設計時都必須要考量到這種版本更新的可能性,並且盡可能地去減少。
文章中以 aws-cdk 作為範例, aws-cdk 最初描述時是使用 ^1.4.0 的方式來參考各種 ^1.4.0 版本的 color,結果 color 的作者就直接爆氣來一個炸彈,aws-cdk 直接更新然後建置,最後
產生出一個令人崩潰的版本。
作者認為任何一個系統要更新的時候應該都需要緩慢與穩健的去逐步更新,並且這些更新都要經過一段時間的觀察與測試來降低各種可能放到生產系統出包的可能性。
以下節錄自文章中的重點
「High-fidelity builds solve both the testing problem and the gradual rollout problem. A new version of colors wouldn’t get picked up by an aws-cdk install until the aws-cdk authors had gotten a chance to test it and push a new version configuration in a new version of aws-cdk. At that point, all new aws-cdk installs would get the new colors, but all the other tools would still be unaffected, until they too tested and officially adopted the new version of colors.」
類別: other
連結: https://research.swtch.com/npm-colors
NPM 上一個著名的 Module Color 以及 Faker 的作者這幾天生氣氣的修改這兩個 module,於 Color 內塞入了無限循環並且印出各種亂碼
然後所有使用這兩個 module 的工具一旦更新就會發現自己的 Terminal 輸出整個爆炸,完全看不懂了。
這篇文章是 Golang 的作者 Russ Cox 分享關於這件事情的一些看法,簡單來說每個開放原始碼的授權都有提到並沒有保固這種事情,所以任何現代化的模組管理者
設計時都必須要考量到這種版本更新的可能性,並且盡可能地去減少。
文章中以 aws-cdk 作為範例, aws-cdk 最初描述時是使用 ^1.4.0 的方式來參考各種 ^1.4.0 版本的 color,結果 color 的作者就直接爆氣來一個炸彈,aws-cdk 直接更新然後建置,最後
產生出一個令人崩潰的版本。
作者認為任何一個系統要更新的時候應該都需要緩慢與穩健的去逐步更新,並且這些更新都要經過一段時間的觀察與測試來降低各種可能放到生產系統出包的可能性。
以下節錄自文章中的重點
「High-fidelity builds solve both the testing problem and the gradual rollout problem. A new version of colors wouldn’t get picked up by an aws-cdk install until the aws-cdk authors had gotten a chance to test it and push a new version configuration in a new version of aws-cdk. At that point, all new aws-cdk installs would get the new colors, but all the other tools would still be unaffected, until they too tested and officially adopted the new version of colors.」
標題: 「Kubernetes, system-reserved, kube-reserved, cgroup 與 capacity, allocatable 的複雜關係」
類別: introduction
連結: https://www.hwchiu.com/k8s-capacity-allocatable.html
久違的原創文章,主要是探討到底 Kubernetes 節點上關於 Capacity 與 Allocatable 的關係為何?
Kubelet 是如何透過 system-reserved, kube-reserved 以及 eviction-hard 等參數來計算彼此的數值
以及最後又探討了到底 enforceNodeAllocatable 這個參數是如何將上述的概念轉換為 cgroup 的設定
如果你對 kubelet 的下列參數有一個不是很清楚的話都很推薦閱讀本篇文章,
- --system-reserved
- --kube-reserved
- --system-reserved-cgroup
- --kube-reserved-cgroup
- --enforce-node-allocatable
另外本篇文章沒有任何潤飾,所以有任何錯字或是語句不通順的地方就麻煩底下留言,我看到就會修正,感謝感謝
類別: introduction
連結: https://www.hwchiu.com/k8s-capacity-allocatable.html
久違的原創文章,主要是探討到底 Kubernetes 節點上關於 Capacity 與 Allocatable 的關係為何?
Kubelet 是如何透過 system-reserved, kube-reserved 以及 eviction-hard 等參數來計算彼此的數值
以及最後又探討了到底 enforceNodeAllocatable 這個參數是如何將上述的概念轉換為 cgroup 的設定
如果你對 kubelet 的下列參數有一個不是很清楚的話都很推薦閱讀本篇文章,
- --system-reserved
- --kube-reserved
- --system-reserved-cgroup
- --kube-reserved-cgroup
- --enforce-node-allocatable
另外本篇文章沒有任何潤飾,所以有任何錯字或是語句不通順的地方就麻煩底下留言,我看到就會修正,感謝感謝
Hwchiu Learning Note
Kubernetes, system-reserved, kube-reserved, cgroup 與 capacity, allocatable 的複雜關係
kubelet 上關於資源控管的幾個參數探討
標題: 「The pains of GitOps 1.0」
類別: cicd
連結: https://codefresh.io/about-gitops/pains-gitops-1-0/
作者認為很多文章都闡述 GitOps 對於部署帶來的好處,但是軟體世界沒有十全十美的東西,所以作者就探討了 12 個其認為 GitOps 的缺點
註:
1. 本篇文章是 2020 年底的文章,所以文章探討的內容也許當年沒有很好的解決方式,但是現在已經有了比較好的處理方式。
2. 我個人覺得文章的某些部分有點太牽強,已經假設 GitOps 是個萬能解法,什麼問題都要靠這個。就這個問題是不管有沒有 GitOps 都會存在的問題,有點為了反對而反對,與其說 GitOps 的缺點不如說沒有解決的問題。
這邊就節錄幾個文章中探討的議題,剩下有興趣的可以閱讀全文
# GitOps covers only a subset of the software lifecycle
作者認為 GitOps 的精神「我想要將 Git 專案內的所描述的狀態給同步到叢集中」這點只能處理應用程式部署的問題,但是其他的流程
譬如編譯程式碼,運行單元測試,安全性檢查,靜態掃描等過程都沒有辦法被 GitOps 給處理。
作者不滿的點主要是很多 GitOps 的工具好像都會宣傳自己是個全能的解決方案,能夠處理所有事情,但是實際上卻沒有辦法。
實際上其專注的點就是應用程式部署策略為主的部分,其餘部分還是團隊要有自己的方式去處理
# Splitting CI and CD with GitOps is not straightforward
過往很多團隊都會將 CI/CD 給整合到相同的 pipeline 中去處理,通常是最後一個階段就會將應用程式給部署到目標叢集,然而有外部 Controller 實作的 GitOps
解決方案會使得 CI/CD 兩者脫鉤,好處來說就是 pipeline 不需要去處理部署,只需要專心維護 Git 內的資訊,後續都讓 Controller 來處理。
然後某些團隊本來的 CI/CD 流程會於部署完畢後還會進行一些測試或是相關操作,這部分會因為 GitOps 將部署給弄走導致整個流程不太好處理,畢竟要如何讓
GitOps 部署完畢後又要可以觸發其他的工作也是額外要處理的事情
# There is no standard practice for GitOps rollbacks
雖然 GitOps 的核心是透過 Git Commit 去控制當前部署的版本,那發生問題時到底該怎麼處理,如何去 rollback?
作者舉兩種範例
1. 讓 GitOps 去指向之前的 Git Commit
2. 針對 Git 使用 Git revert 等相關操作來更新最新的內容
作者認為沒有一個標準來告訴使用者該怎麼使用以及處理
# Observability for GitOps (and Git) is immature
作者認為目前現有的 GitOps 工具都沒有辦法提供下列答案
1. 目前生產環境是否有包含 Feature X
2. Bug X,Y 是否只有存在於 Staging 環境? 還是生產環境也有?
註: 有什麼概念是天生就可以有這些東西的..? GitOps 有點無妄之災
類別: cicd
連結: https://codefresh.io/about-gitops/pains-gitops-1-0/
作者認為很多文章都闡述 GitOps 對於部署帶來的好處,但是軟體世界沒有十全十美的東西,所以作者就探討了 12 個其認為 GitOps 的缺點
註:
1. 本篇文章是 2020 年底的文章,所以文章探討的內容也許當年沒有很好的解決方式,但是現在已經有了比較好的處理方式。
2. 我個人覺得文章的某些部分有點太牽強,已經假設 GitOps 是個萬能解法,什麼問題都要靠這個。就這個問題是不管有沒有 GitOps 都會存在的問題,有點為了反對而反對,與其說 GitOps 的缺點不如說沒有解決的問題。
這邊就節錄幾個文章中探討的議題,剩下有興趣的可以閱讀全文
# GitOps covers only a subset of the software lifecycle
作者認為 GitOps 的精神「我想要將 Git 專案內的所描述的狀態給同步到叢集中」這點只能處理應用程式部署的問題,但是其他的流程
譬如編譯程式碼,運行單元測試,安全性檢查,靜態掃描等過程都沒有辦法被 GitOps 給處理。
作者不滿的點主要是很多 GitOps 的工具好像都會宣傳自己是個全能的解決方案,能夠處理所有事情,但是實際上卻沒有辦法。
實際上其專注的點就是應用程式部署策略為主的部分,其餘部分還是團隊要有自己的方式去處理
# Splitting CI and CD with GitOps is not straightforward
過往很多團隊都會將 CI/CD 給整合到相同的 pipeline 中去處理,通常是最後一個階段就會將應用程式給部署到目標叢集,然而有外部 Controller 實作的 GitOps
解決方案會使得 CI/CD 兩者脫鉤,好處來說就是 pipeline 不需要去處理部署,只需要專心維護 Git 內的資訊,後續都讓 Controller 來處理。
然後某些團隊本來的 CI/CD 流程會於部署完畢後還會進行一些測試或是相關操作,這部分會因為 GitOps 將部署給弄走導致整個流程不太好處理,畢竟要如何讓
GitOps 部署完畢後又要可以觸發其他的工作也是額外要處理的事情
# There is no standard practice for GitOps rollbacks
雖然 GitOps 的核心是透過 Git Commit 去控制當前部署的版本,那發生問題時到底該怎麼處理,如何去 rollback?
作者舉兩種範例
1. 讓 GitOps 去指向之前的 Git Commit
2. 針對 Git 使用 Git revert 等相關操作來更新最新的內容
作者認為沒有一個標準來告訴使用者該怎麼使用以及處理
# Observability for GitOps (and Git) is immature
作者認為目前現有的 GitOps 工具都沒有辦法提供下列答案
1. 目前生產環境是否有包含 Feature X
2. Bug X,Y 是否只有存在於 Staging 環境? 還是生產環境也有?
註: 有什麼概念是天生就可以有這些東西的..? GitOps 有點無妄之災
Codefresh
The pains of GitOps 1.0
GitOps as a practice for releasing software has several advantages, but like all other solutions before it, has also several shortcomings. It seems that the honeymoon period is now over, and we can finally talk about the issues of GitOps (and the current…
標題: 「透過 Crossplane 與 ArgoCD 來達成應用程式與基礎建設的 GitOps 部署方式」
類別: cicd
連結: https://medium.com/containers-101/using-gitops-for-infrastructure-and-applications-with-crossplane-and-argo-cd-944b32dfb27e
作者表示過往很多教學文章當探討到 Kubernetes 部署議題的時候,通常都不會去探討如何部署 Kubernetes 而是專注於應用程式的部署,
理由非常直觀,文章就是要專注於 Deployment 的議題,能夠讓讀者更容易地去閱讀與參考,另外一個背後的原因其實是因為 Kubernetes 部署的方式
太多種,常見的方式使用 Terraform 透過 IaC 的概念來管理,而應用程式都使用 Helm/Kustomize 完全不同的方式來管理
而作者今天想要探討的是如何透過 ArgoCD 來建設一個 GitOps 的環境,並且於上面使用 Crossplan 這個解決方案來處理各種底層基礎建設的需求,如此一來
就可以統一透過 Helm/Kustomize 的方式來描述這些基礎建設
Crossplan 很類似 Terraform 但是有者一些些微的差異
1. Crossplan 本身是 Kubernetes 的應用程式,所以本身的描述方式就是 Kubernetes 的 YAML 方式
2. 可以使用 kubectl, Helm/Kustomize 等方式來部署這些描述並且讓 Crossplan 來幫忙創建描述的基礎建設
由於整個 Crossplan 可以視為一個 Kubernetes 應用程式,所以直接使用 ArgoCD 的方式來部署
有興趣的可以閱讀全文
類別: cicd
連結: https://medium.com/containers-101/using-gitops-for-infrastructure-and-applications-with-crossplane-and-argo-cd-944b32dfb27e
作者表示過往很多教學文章當探討到 Kubernetes 部署議題的時候,通常都不會去探討如何部署 Kubernetes 而是專注於應用程式的部署,
理由非常直觀,文章就是要專注於 Deployment 的議題,能夠讓讀者更容易地去閱讀與參考,另外一個背後的原因其實是因為 Kubernetes 部署的方式
太多種,常見的方式使用 Terraform 透過 IaC 的概念來管理,而應用程式都使用 Helm/Kustomize 完全不同的方式來管理
而作者今天想要探討的是如何透過 ArgoCD 來建設一個 GitOps 的環境,並且於上面使用 Crossplan 這個解決方案來處理各種底層基礎建設的需求,如此一來
就可以統一透過 Helm/Kustomize 的方式來描述這些基礎建設
Crossplan 很類似 Terraform 但是有者一些些微的差異
1. Crossplan 本身是 Kubernetes 的應用程式,所以本身的描述方式就是 Kubernetes 的 YAML 方式
2. 可以使用 kubectl, Helm/Kustomize 等方式來部署這些描述並且讓 Crossplan 來幫忙創建描述的基礎建設
由於整個 Crossplan 可以視為一個 Kubernetes 應用程式,所以直接使用 ArgoCD 的方式來部署
有興趣的可以閱讀全文
Medium
Using GitOps for Infrastructure and Applications With Crossplane and Argo CD
If you have been following the Codefresh blog for a while, you might have noticed a common pattern in all the articles that talk about…
標題: 「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 使用有興趣的可以看看本篇文章
類別: 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 使用有興趣的可以看看本篇文章
Medium
DNS-01 challenge: wildcard TLS certificates on Kubernetes
When deploying applications on a Kubernetes cluster, we often expose them outside using ingress controllers, and using cert-manager to…
標題: 「Linux 5.17 將使用 BLAKE2s 來替代 SHA1 來達到更安全更快速的隨機亂數產生器」
類別: other
連結: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-RNG
Linux Kernel 內亂數子系統的維護者近期遞交了一個將 SHA1 給全面替換為 BLAKE2s 的相關 Patch
相對於 SHA1 來說, BLAKE2s 本身更為安全,同時計算速度也更快,這邊也可以參考下列這篇 2017 的文章
https://valerieaurora.org/hash.html 來探討不同 HASH 演算法的一些狀態,雖然沒有及時更新到 2022 的狀態,但是如果 2017 都
不安全的東西現在就更不應該使用,譬如文章中提到 SAH1 於 2017 就被 Google 用(6500 CPU或是110 GPU)的實驗來證實有衝突,建議停止使用。
類別: other
連結: https://www.phoronix.com/scan.php?page=news_item&px=Linux-5.17-RNG
Linux Kernel 內亂數子系統的維護者近期遞交了一個將 SHA1 給全面替換為 BLAKE2s 的相關 Patch
相對於 SHA1 來說, BLAKE2s 本身更為安全,同時計算速度也更快,這邊也可以參考下列這篇 2017 的文章
https://valerieaurora.org/hash.html 來探討不同 HASH 演算法的一些狀態,雖然沒有及時更新到 2022 的狀態,但是如果 2017 都
不安全的東西現在就更不應該使用,譬如文章中提到 SAH1 於 2017 就被 Google 用(6500 CPU或是110 GPU)的實驗來證實有衝突,建議停止使用。
Phoronix
Linux 5.17 Random Number Generator Seeing Speed-Ups, Switching From SHA1 To BLAKE2s
Ahead of the Linux 5.17 merge window officially opening next week, random (RNG) subsystem maintainer Jason Donenfeld has submitted an exciting batch of updates for this next kernel cycle.
標題: 「透過 Kubernetes 內建 Event 來監控叢集狀況」
類別: Kubernetes
連結: https://www.cncf.io/blog/2021/12/21/extracting-value-from-the-kubernetes-events-feed/
這篇文章是介紹 Kubernetes 內建 event 的概念與用法,作者認為現在的監控與告警的訊息愈來愈多,這些訊息疲勞轟炸維運人員導致維運人員沒有辦法很精準地找到問題。
作者後來認為其實透過 Kubernetes 原生的 Event 就可以提供一些有用的訊息,其訊息精簡且種類不多,主要是針對 k8s 叢集的各種問題,能夠第一時間提供一些有用的資訊。
但是這些 event 可以透過 kubectl describe 來觀察或是直接使用 kubectl get event 來觀察,相對於 log 來說,event 的紀錄預設只會
保留一小時的時間,這就是為什麼使用 kubectl describe 只能觀察到最近的事件,所以如果要使用 event 作為資料來源整合到觀測系統或是告警系統的話
必須要有其他的系統幫忙收集這些 event。
實務上來說,作者認為觀測 Failed 以及 Scheduling 相關的事件為主,透過這樣可以快速地看到一些更靠近 k8s 的事件,然後文章後半部分介紹不少用來收集 event 的專案,如
1. KubeWatch
2. Event Exporter
3. EventRouter
有興趣的可以參閱全文
類別: Kubernetes
連結: https://www.cncf.io/blog/2021/12/21/extracting-value-from-the-kubernetes-events-feed/
這篇文章是介紹 Kubernetes 內建 event 的概念與用法,作者認為現在的監控與告警的訊息愈來愈多,這些訊息疲勞轟炸維運人員導致維運人員沒有辦法很精準地找到問題。
作者後來認為其實透過 Kubernetes 原生的 Event 就可以提供一些有用的訊息,其訊息精簡且種類不多,主要是針對 k8s 叢集的各種問題,能夠第一時間提供一些有用的資訊。
但是這些 event 可以透過 kubectl describe 來觀察或是直接使用 kubectl get event 來觀察,相對於 log 來說,event 的紀錄預設只會
保留一小時的時間,這就是為什麼使用 kubectl describe 只能觀察到最近的事件,所以如果要使用 event 作為資料來源整合到觀測系統或是告警系統的話
必須要有其他的系統幫忙收集這些 event。
實務上來說,作者認為觀測 Failed 以及 Scheduling 相關的事件為主,透過這樣可以快速地看到一些更靠近 k8s 的事件,然後文章後半部分介紹不少用來收集 event 的專案,如
1. KubeWatch
2. Event Exporter
3. EventRouter
有興趣的可以參閱全文
CNCF
Extracting value from the Kubernetes events feed
Guest post by Nate Matherson, Co-founder and CEO of ContainIQ Too much monitoring and alert fatigue is a real problem for today’s engineering teams. There are plenty of open-source and third-party…
標題: 「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
類別: 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
Qualys
CVE-2021-4034: How PwnKit Exploits Polkit’s pkexec | Qualys
CVE-2021-4034, a PwnKit vulnerability, lets unprivileged users gain root access via pkexec. Explore its impact and how to mitigate the risk.
標題: 「視覺化系統內 iptables 規則」
類別: tools
連結: https://github.com/Nudin/iptable_vis
這是一個非常有趣的小工具,目標就是視覺化系統中的 iptables 規則,把 chain 之間的關聯給視覺化呈現出來
整個專案非常小,該專案主要會透過 awk 來解析系統中的規則並且產生特定輸出,接者使用別的軟體將該輸出給轉換成圖檔
有興趣的都可以使用看看
類別: tools
連結: https://github.com/Nudin/iptable_vis
這是一個非常有趣的小工具,目標就是視覺化系統中的 iptables 規則,把 chain 之間的關聯給視覺化呈現出來
整個專案非常小,該專案主要會透過 awk 來解析系統中的規則並且產生特定輸出,接者使用別的軟體將該輸出給轉換成圖檔
有興趣的都可以使用看看
GitHub
GitHub - Nudin/iptable_vis: visualise your iptables chains
visualise your iptables chains. Contribute to Nudin/iptable_vis development by creating an account on GitHub.
標題: 「如何使用 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 的內建函式,
有興趣的都可以使用看看
類別: 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 的內建函式,
有興趣的都可以使用看看
Medium
My jq Cheatsheet
kubectl with jq is so powerful
標題: 「如何用 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 %
類別: 其他
連結: 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 %
Phoronix
Massive ~2.3k Patch Series Would Improve Linux Build Times 50~80% & Fix "Dependency Hell"
Longtime Linux kernel developer Ingo Molnar posted a massive set of patches today: 2,297 patches that have been in the works since late 2020 and completely rework the Linux kernel's header file hierarchy
標題: 「視覺化系統內 iptables 規則」
類別: tools
連結: https://github.com/Nudin/iptable_vis
這是一個非常有趣的小工具,目標就是視覺化系統中的 iptables 規則,把 chain 之間的關聯給視覺化呈現出來
整個專案非常小,該專案主要會透過 awk 來解析系統中的規則並且產生特定輸出,接者使用別的軟體將該輸出給轉換成圖檔
有興趣的都可以使用看看
類別: tools
連結: https://github.com/Nudin/iptable_vis
這是一個非常有趣的小工具,目標就是視覺化系統中的 iptables 規則,把 chain 之間的關聯給視覺化呈現出來
整個專案非常小,該專案主要會透過 awk 來解析系統中的規則並且產生特定輸出,接者使用別的軟體將該輸出給轉換成圖檔
有興趣的都可以使用看看
GitHub
GitHub - Nudin/iptable_vis: visualise your iptables chains
visualise your iptables chains. Contribute to Nudin/iptable_vis development by creating an account on GitHub.
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 去執行
有興趣的可以看看,整個寫法非常簡單有趣。
標題: 「透過一點小技巧讓你的 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 去執行
有興趣的可以看看,整個寫法非常簡單有趣。
https://daniel.feldroy.com
Autodocumenting Makefiles
Make Your Makefiles Make Your Day!
標題: 「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 內容。
對於整體有興趣的可以觀看全文
類別: 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 內容。
對於整體有興趣的可以觀看全文
Konstantin Ryabitsev
Cross-fork object sharing in git (is not a bug) — Konstantin Ryabitsev
Once every couple of years someone unfailingly takes advantage of the following two facts: most large git hosting providers set up objec...
標題: 「 談談遷移應用程式到 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.
後續還有一些針對不同團隊的想法與總體建議,整體來說非常真實,一個血淋淋的轉換案例。
類別: 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.
後續還有一些針對不同團隊的想法與總體建議,整體來說非常真實,一個血淋淋的轉換案例。
Medium
Unsuccessful experience of migrating applications to Kubernetes
Background
標題: 「 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: 該解決方案的成本多寡,成本就是真正的金錢考量。
文章一開始就有列出一個結論表,對於這個議題有興趣的歡迎閱讀
類別: 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: 該解決方案的成本多寡,成本就是真正的金錢考量。
文章一開始就有列出一個結論表,對於這個議題有興趣的歡迎閱讀
Medium
Kubernetes Development Environments — A Comparison
by Daniel Thiry
標題: 「 取代 Docker Desktop 的高效率開發環境」
類別: Container
連結: https://medium.com/partoo/replacing-docker-desktop-with-a-more-efficient-development-environment-582c61c50984
作者認為 Docker Desktop 是一個非常好的開發環境工具,能夠簡化很多設定讓開發者更容易的開發應用程式,但是對於 Windows/Mac 的使用者來說
Docekr Desktop 實際上也是先運行一個基於 Linux 的 VM 並且於其中運行 Docker Container。這種架構實際上帶來了一些使用上的缺陷,包含
1. FileSystem 的處理效能非常不好,不論是使用 cahced 或是 gRPC-fuse 檔案系統還是沒有辦法得到很好的效能。
2. 資源使用有問題不如預期,作者設定希望最多使用 6GB 結果最後卻使用到了 15GB,幾乎吃光系統所有記憶體
3. 官方幾乎沒有文件去探討該 VM 的存取方式(雖然滿多人會用 nsenter 進入),所以很難把一些本地檔案給直接放到 VM 內來提昇儲存相關的問題,變成所有的儲存都只能用 docker volume 來處理。
作者的公司 Partoo 採取了 VM + Vagrant + Ansible 的方式來創建開發者環境,讓每個加入團隊的開發者都可以輕鬆簡單的建設期開發環境
並且文章中也探討如何於本地端使用 Vistual Studio Code, PyCharm 來編輯 VM 的檔案並且順利的進行應用程式開發。
從效率來看,相對於直接使用 Dodcker Desktop 來看,作者團隊的測試程式基於自己的 VM 提升了將近 30% 的效能,主要的問題就是儲存系統與 Docker Container 之間的掛載關係差異。
類別: Container
連結: https://medium.com/partoo/replacing-docker-desktop-with-a-more-efficient-development-environment-582c61c50984
作者認為 Docker Desktop 是一個非常好的開發環境工具,能夠簡化很多設定讓開發者更容易的開發應用程式,但是對於 Windows/Mac 的使用者來說
Docekr Desktop 實際上也是先運行一個基於 Linux 的 VM 並且於其中運行 Docker Container。這種架構實際上帶來了一些使用上的缺陷,包含
1. FileSystem 的處理效能非常不好,不論是使用 cahced 或是 gRPC-fuse 檔案系統還是沒有辦法得到很好的效能。
2. 資源使用有問題不如預期,作者設定希望最多使用 6GB 結果最後卻使用到了 15GB,幾乎吃光系統所有記憶體
3. 官方幾乎沒有文件去探討該 VM 的存取方式(雖然滿多人會用 nsenter 進入),所以很難把一些本地檔案給直接放到 VM 內來提昇儲存相關的問題,變成所有的儲存都只能用 docker volume 來處理。
作者的公司 Partoo 採取了 VM + Vagrant + Ansible 的方式來創建開發者環境,讓每個加入團隊的開發者都可以輕鬆簡單的建設期開發環境
並且文章中也探討如何於本地端使用 Vistual Studio Code, PyCharm 來編輯 VM 的檔案並且順利的進行應用程式開發。
從效率來看,相對於直接使用 Dodcker Desktop 來看,作者團隊的測試程式基於自己的 VM 提升了將近 30% 的效能,主要的問題就是儲存系統與 Docker Container 之間的掛載關係差異。
Medium
Replacing Docker Desktop with a more efficient Development Environment
It’s important for developers to have a development environment that is easy to use, and Docker is really a good tool to simplify many…
標題: 「macOS 的 fsync 實作其實跟大家想像的完全不同 」
類別: others
連結: https://mobile.twitter.com/marcan42/status/1494213855387734019?t=TyXUEg-2LcbNiKkv0JVOsg&s=09
以下節錄自該留言串
「As it turns out, macOS cheats. On Linux, fsync() will both flush writes to the drive, and ask it to flush its write cache to stable storage.
But on macOS, fsync() only flushes writes to the drive. Instead, they provide an F_FULLSYNC operation to do what fsync() does on Linux.」
簡單來說就是 Linux 的 fsync 會執行兩次動作,最終讓當次修改給寫回到底層儲存設備,而 macOS 的版本卻不會真的確認寫回硬碟,所以這個導致很多仰賴 fsync 的應用程式就會有一些不預期的行為,這也是為什麼首篇發文的內容
「Well, this is unfortunate. It turns out Apple's custom NVMe drives are amazingly fast - if you don't care about data integrity.
If you do, they drop down to HDD performance. Thread.」
類別: others
連結: https://mobile.twitter.com/marcan42/status/1494213855387734019?t=TyXUEg-2LcbNiKkv0JVOsg&s=09
以下節錄自該留言串
「As it turns out, macOS cheats. On Linux, fsync() will both flush writes to the drive, and ask it to flush its write cache to stable storage.
But on macOS, fsync() only flushes writes to the drive. Instead, they provide an F_FULLSYNC operation to do what fsync() does on Linux.」
簡單來說就是 Linux 的 fsync 會執行兩次動作,最終讓當次修改給寫回到底層儲存設備,而 macOS 的版本卻不會真的確認寫回硬碟,所以這個導致很多仰賴 fsync 的應用程式就會有一些不預期的行為,這也是為什麼首篇發文的內容
「Well, this is unfortunate. It turns out Apple's custom NVMe drives are amazingly fast - if you don't care about data integrity.
If you do, they drop down to HDD performance. Thread.」
Twitter
Hector Martin
Well, this is unfortunate. It turns out Apple's custom NVMe drives are amazingly fast - if you don't care about data integrity. If you do, they drop down to HDD performance. Thread.