大家可以看Arctiq公司搞的修改node數量Demo:https://www.arctiq.ca/our-blog/2019/4/9/gke-on-prem-and-anthos-config-management/
簡單說,當你修改某個git管理下的yaml配置文件,裡面描述了某個GKE私有集群某個cluster的node數量,然後Anthos Config Management會幫你自動的發命令並讓節點數量變成你想要的那個。
Anthos是啥?是Google發布的混合雲多雲平臺
GKE:Anthos 的命令和控制核心。用戶通過 GKE 的控制平面來對分散在 Google 雲、私有數據中心一級其它雲平臺上的基礎設施進行管理。
GKE On-Prem:Google 推出了一個基於 Kubernetes 的和 GKE 一致的軟體平臺。用戶能夠在任何的兼容硬體上部署這一產品,而 Google 將會對其進行管理。從升級 Kubernetes 版本到應用最新補丁,Google 都視其為 GKE 的邏輯擴展。尤其需要注意的是 GKE On-Prem 運行在 VMWare vSphere 6.5 的虛擬化基礎上,Hyper-V 和 KVM 等其它虛擬化技術的支持還在開發之中。
Istio:這一技術讓跨平臺的聯邦網絡管理成為可能。Anthos 需要為部署在不同數據中心、GCP 以及其它雲上的多種應用程式的組件建立服務網格,Istio 自然是首選。它會和 VMWare NSX、Cisco ACI 以及 Google 自己的 Andromeda 等 SDN 進行無縫集成。已經在網絡設施上(例如 F5) 進行投資的客戶,可以將 Istio 和負載均衡及防火牆集成起來。
Velostrata:Google 在 2018 年收購了這一雲遷移技術,來增強 Kubernetes 的競爭力。Velostrata 的主要功能——在 GCE 實例中複製物理機/虛擬機,並把現有虛擬機轉換為 Kubernetes 應用(Pod)。這是業界首個物理機到 Kubernetes 的遷移工具,由 Google 提供。這一技術以 Anthos Migrate 的面目出現,目前是 Beta 階段。
Anthos 配置管理:Kubernetes 是一個可擴展的策略驅動的平臺。Anthos 的客戶必須面對運行在不同環境中的多個 Kubernetes,因此 Google 嘗試利用 Anthos 來簡化配置管理工作。從發布工件、配置項目、網絡策略、密文和密碼等類型的配置,Anthos 配置管理都能夠進行管理並將配置應用到一或多個集群之中。
Stackdriver:Stackdriver 為 Anthos 基礎設施和應用提供了可觀察性的支持。客戶能夠使用這一組件跟蹤運行在 Anthos集群狀態,以及部署在各個託管集群上的應用的健康情況。該組件負責集中地提供監控、日誌、跟蹤以及觀察的支持。
GCP Cloud Interconnect:在企業數據中心以及雲基礎設施之間的高速互聯,是混合雲平臺的必要條件。Cloud Interconnect 能夠在數據中心和雲間交付高達 100Gbps 的高速網絡。客戶也可以使用 Equinix、NTT Communications、Softbanck 等電信廠商的網絡將其數據中心延伸到 GCP
GCP Marketplace:Google 為能夠在 Kubernetes 上運行的(來自 ISV 和開源的)軟體列表。用戶能夠在 Anthos 中一鍵部署 Cassandra 資料庫或者 GitLab 等軟體。最終 Google 可能還會為內部 IT 提供一個私有的 Catalog 服務。
大家可以看到,在這8大組件裡面,大概只有4和5是最近推出的,其他的早就投入生產並有不少企業在用了,這些組件到底是什麼關係?我們把這些組件放到一張圖上,就排著這個樣子(原諒我忽略了可憐的StackDriver和Marktplace,我假定讀者對這2個東西很熟悉)
也就是說,Anthos Config Management是一瓶膠水,把混合雲裡面應用的配置工作給自動化了。
且慢,什麼叫做配置自動化?這個詞過於寬泛,所以在這裡提幾個常見的Kubernetes用戶場景:
你是否碰到過,一個典型的Web應用,在測試環境有一份配置文件(我們假定這個配置文件是一個Kubernetes的deployment的yaml),在準生產環境有一份配置文件,在公有雲有一份配置文件,在私有雲也有一份配置文件?每次你都複製黏貼並修改一些參數,並指望這些環境能夠混合起來給終端用戶提供合理的服務,但手工修改往往會造成差錯
你是否碰到過,配置文件存在多個k8s集群裡面,每次都要手忙腳亂的用kubectl挨個修改,但沒法看到這些配置的歷史版本?你可以回滾應用的docker鏡像,但你沒法回滾配置。如果你是一個資深k8s玩家,你當然知道在etcd的某個角落裡面存有所有yaml的歷史版本,通過某種黑魔法般的命令行操作你還是可以找回歷史的,但肯定沒有git那麼爽快
是的,Anthos Config Management就是用來解決這些問題的,並且,是按照Infrasturce as code的理念來做這個事情的
繼續問另外一個問題,為什麼配置這麼重要?眾所周知,在傳統的Unix/Linux環境下,在/etc下有不少配置文件,大部分苦逼的運維工程師每天的工作就是修改這些文件,並且通過重啟進程或者給進程發信號讓這些配置生效,並且要修改上百臺機器;過去幾年有了ansible或者salt這類批處理工具,把登陸幾百臺機器的工作量給省了;而k8s除了解決集群的批量問題,還引入了一個新的理念,就是聲明式配置,運維工程師不需要苦逼的重啟進程,這些「進程」會自動按照你的配置達到期望的狀態(當然,由於這是在一個集群內,所以需要一定的時間),也就是說
聲明式配置 = 面向終態
所以,你寫的配置和傳統的配置文件,那種靜態的文本配置已經完全不一樣了,最後這些配置會變成生產系統的某個狀態,並且,如果使用了合理的工具鏈,這一系列工作都是自動化的。
那麼現在這些「配置文件」還是配置嗎?運維工程師的工作流程就變成了
是的,你會發現運維工程師的工作流程就和開發工程師一樣了!
這些配置,無論是什麼語言寫的,本質上變成了原始碼,只是沒有通過編譯工具鏈而是通過運維工具鏈達到了魯棒性,這樣就把傳統運維的重複勞動工作從大部分人手中拿出來交給少部分的運維工具鏈專家去維護。
1. 內部設計關於這點,Google並沒有放出這個東西的原始碼,但是有一張圖
是的,這張圖在組件上畫的非常清晰,Anthos Config Mangement,在運行形態上是一個k8s的operator,部署在多個集群裡面,並且應該可以從同一個遠程git repo裡面讀取配置,從這個demo庫裡面,我們可以看到這個operator讀取git庫的配置
apiVersion: addons.sigs.k8s.io/v1alpha1
kind: ConfigManagement
metadata:
name: config-management
spec:
git:
syncRepo: git@github.com:GoogleCloudPlatform/csp-config-management.git
syncBranch: "0.1.0"
syncWait: 5
secretType: ssh
policyDir: foo-corp
這裡幾個參數清晰的標明,Anthos Config Mangement會去每5秒鐘讀取一次git repo的0.1.0分支,並按照這個分支上的配置來進行後續的操作。那麼,這些操作具體能幹啥,怎麼幹呢?官方文檔實在是太可憐了,就幾句話就想打發我們,不過,從Demo裡面我們可以試圖尋找這些功能和配置的對應關係。讀者可以把demo庫 git clone下來,比對著看。
官方的功能描述是:
從單一代碼庫衍生的真實,控制和管理
允許使用代碼審查,驗證和回滾工作流程。
避免陰影操作,由於手動更改導致的Kubernetes集群之間不同步。
允許使用CI / CD管道進行自動化測試和部署。
跨所有集群的一步式部署
Anthos Config Management將單個Git提交轉換為跨所有集群的多個kubectl命令。
只需還原Git中的更改即可回滾。 然後,大規模自動部署恢復。
豐富的繼承模型,簡化修改
使用命名空間,您可以為所有集群,某些集群,某些命名空間甚至自定義資源創建配置。
使用命名空間繼承,您可以創建一個分層的命名空間模型,該模型允許跨repo文件夾結構進行配置繼承。
這是demo的樹形目錄結構
.
├── cluster
│ ├── namespace-reader-clusterrole.yaml
│ ├── namespace-reader-clusterrolebinding.yaml
│ ├── pod-creator-clusterrole.yaml
│ └── pod-security-policy.yaml
├── namespaces
│ ├── audit
│ │ └── namespace.yaml
│ ├── online
│ │ └── shipping-app-backend
│ │ ├── pod-creator-rolebinding.yaml
│ │ ├── quota.yaml
│ │ ├── shipping-dev
│ │ │ ├── job-creator-role.yaml
│ │ │ ├── job-creator-rolebinding.yaml
│ │ │ ├── namespace.yaml
│ │ │ └── quota.yaml
│ │ ├── shipping-prod
│ │ │ └── namespace.yaml
│ │ └── shipping-staging
│ │ └── namespace.yaml
│ ├── sre-rolebinding.yaml
│ ├── sre-supported-selector.yaml
│ └── viewers-rolebinding.yaml
└── system
├── config-management.yaml
└── resourcequota-hierarchy.yaml
我相信應該是anthos的工作流應該是讀取cluster裡面的一些安全配置,並且在所有集群上都創建這裡的namespace目錄所描述的命名空間。
在一些demo視頻裡面我們還看到了clusterregistry目錄,應該是用來修改集群的一些屬性,達到動態修改節點數量的目的。
但如何讓一個應用在多個集群的多個namespace流轉,當前還沒能看到痕跡,從namespace的嵌套目錄來看,應用WorkLoad會經過這些目錄的層級,然後動態的修改自己的一些配置。這些細節還有待研究。
2. 結語核心洞察Anthos是在多k8s集群的場景下,想到了這兩點
既然k8s把所有東西的狀態變為靜態的yaml文本描述,那麼這些配置存在etcd裡面並用kubectl去修改就是低效的,完全可以用git存起來
這些配置之間是有冗餘的,完全可以通過模板化的方式去自動搞定單個應用多集群的配置
遺留問題參考Anthos深度分析,看懂谷歌雲的三級火箭:https://www.tmtpost.com/3895215.html
關於Anthos:https://toutiao.io/posts/2a1ymm/preview
Anthos Config Management官方文檔:https://cloud.google.com/anthos/docs/concepts/anthos-overview#centralized_config_management
產品主頁:https://cloud.google.com/anthos-config-management/
官方Demo:https://github.com/GoogleCloudPlatform/csp-config-management
Arctiq公司搞的修改node數量Demo:https://www.arctiq.ca/our-blog/2019/4/9/gke-on-prem-and-anthos-config-management/
另一個Demo:https://www.youtube.com/watch?v=00f7aE8cfY0