引言
Kubernetes已經(jīng)成為市場上事實上領(lǐng)先的編配工具烘贴,不僅對技術(shù)公司如此,對所有公司都是如此撮胧,因為它允許您快速且可預(yù)測地部署應(yīng)用程序桨踪、動態(tài)地伸縮應(yīng)用程序、無縫地推出新特性芹啥,同時有效地利用硬件資源锻离。
本期我們將回顧采用Kubernetes作為容器編排工具的公司所面臨的復(fù)雜性和挑戰(zhàn)。我們希望我們提供的經(jīng)驗教訓(xùn)墓怀、最佳實踐和技巧將幫助您在前往K8s旅途中起步并繼續(xù)前進(jìn)汽纠。
本期將介紹關(guān)于在Kubernetes生產(chǎn)環(huán)境的最佳實踐,包括::
· 為上K8s容器云準(zhǔn)備好應(yīng)用程序
· 在Kubernetes中獲得靈活性和通用性
· 為所有應(yīng)用程序使用單一傀履、可信和可靠的源
· 自動部署到Kubernetes
· 在Kubernetes中構(gòu)建可靠且可伸縮的環(huán)境
· 可見性和安全性:在Kubernetes中保護(hù)您的應(yīng)用程序
· 在Kubernetes中記錄虱朵、監(jiān)視和調(diào)試您的微服務(wù)
· 將應(yīng)用程序部署到Kubernetes的生產(chǎn)環(huán)境中
背景
JFrog與Kubernetes的旅程始于我們尋找一個合適的容器編排解決方案,以便為內(nèi)部目的創(chuàng)建一個功能齊全的環(huán)境钓账。我們的開發(fā)人員需要測試我們非常復(fù)雜的環(huán)境碴犬,包括JFrog Artifactory和其他產(chǎn)品。與此同時梆暮,我們需要為程序和產(chǎn)品經(jīng)理提供一個完整的功能環(huán)境服协,以便向我們的客戶演示平臺。
為了滿足我們的需求啦粹,每個產(chǎn)品都需要一個獨(dú)立的CI/CD開發(fā)環(huán)境偿荷,以便在測試各個分支之間的交互時獨(dú)立地測試各個分支。
隨著我們對Kubernetes越來越有信心唠椭,我們認(rèn)識到將JFrog產(chǎn)品分發(fā)到Kubernetes的價值遭顶,能夠跨不同的階段、開發(fā)和生產(chǎn)環(huán)境運(yùn)行應(yīng)用程序泪蔫。Kubernetes還允許我們更好地利用我們的資源棒旗,因為我們不再需要為單獨(dú)部署每個產(chǎn)品而啟動單個VM。下面我們將回顧落地過程中的主要挑戰(zhàn)(6大挑戰(zhàn))撩荣,同時分享我們的最佳實踐铣揉、技巧,和在將您的容器應(yīng)用程序一路帶到生產(chǎn)環(huán)境中所獲得的經(jīng)驗教訓(xùn)餐曹。
Kubernetes 介紹
Kubernetes允許您創(chuàng)建容器化的應(yīng)用程序逛拱,并將它們并行的部署,而不必?fù)?dān)心各種服務(wù)和組件之間的兼容性台猴。將應(yīng)用程序容器化運(yùn)行在Kubernetes中的好處是朽合,您可以在一個充滿活力的社區(qū)中開發(fā)產(chǎn)品俱两,從而更容易創(chuàng)建可伸縮的微服務(wù)應(yīng)用程序。這樣做的缺點是曹步,當(dāng)整個團(tuán)隊都在處理各種組件時宪彩,情況會很快變得非常復(fù)雜。此外讲婚,容器化的應(yīng)用程序可以包含多種組件類型尿孔,這取決于您使用的操作系統(tǒng)、語言和框架筹麸。
讓我們從使用Kubernetes運(yùn)行應(yīng)用程序所需的三個基本組件開始:
容器云集群
Kubernetes集群是您的容器化應(yīng)用程序運(yùn)行的編排基礎(chǔ)設(shè)施活合。您需要決定是否要自己管理它,以及是否要使用云提供商托管它物赶。此組件不在文檔的此范圍內(nèi)討論白指。
流水線
CI/CD流水線在Kubernetes中運(yùn)行,并使流程自動化酵紫,從源代碼和外部依賴包開始侵续,一直到將應(yīng)用程序部署到Kubernetes集群中。Kubernetes流水線是“應(yīng)用程序感知的”(面向應(yīng)用)憨闰,這意味著它們天生能夠動態(tài)地提供一個完整的容器化應(yīng)用程序堆棧(通常由多個service、deployments,
replica sets, secrets, configmap等組成)需五。對應(yīng)用程序上下文的每次更改鹉动,無論是代碼、宏邮、鏡像還是配置更改泽示,都將觸發(fā)流水線。
Kubernetes Registry
您的生產(chǎn)集群應(yīng)該使用一個單獨(dú)的蜜氨、受管理的和可信的真實源械筛,該源存儲和記錄應(yīng)用程序和其依賴組件。使用Kubernetes Registry飒炎,您可以在一個pod中并行運(yùn)行多個應(yīng)用程序堆棧埋哟,而不產(chǎn)生沖突,也不需要關(guān)心每個應(yīng)用程序的內(nèi)部依賴關(guān)系郎汪。這將維護(hù)正在運(yùn)行的集群赤赊、向上和向下擴(kuò)容應(yīng)用程序、開發(fā)新版本和調(diào)試應(yīng)用程序具體問題分隔開來煞赢。
上K8s容器云前準(zhǔn)備好你的應(yīng)用程序
應(yīng)用程序是服務(wù)/解決方案的核心抛计。在Kubernetes中運(yùn)行應(yīng)用程序之前,需要計劃和準(zhǔn)備應(yīng)用程序照筑。
卷清單:為K8S準(zhǔn)備應(yīng)用程序
下表顯示了在準(zhǔn)備Kubernetes應(yīng)用程序之前必須詢問的與應(yīng)用程序相關(guān)的任務(wù)和問題吹截。(表格)
有關(guān)將構(gòu)建軟件的基礎(chǔ)知識瘦陈,請參見軟件12因素。https://12factor.net/
在Kubernetes中獲得靈活性和通用性
多語言編程和多種不同的工具和技術(shù)提供了多種可能性波俄。您可以選擇最適合您的業(yè)務(wù)需求的技術(shù)晨逝,但是每種技術(shù)可能有不同的接口、REST API和自己的包格式弟断。支持這些工具的唯一方法是做到在制品從創(chuàng)建到部署的生命周期的管理中實現(xiàn)通用咏花。
部署Artifactory作為您的Kubernetes Registry
通過使用Artifactory作為“Kubernetes Registry”,您可以獲得靈活性和通用性阀趴,作為可信的單一來源昏翰,它允許您深入了解代碼到應(yīng)用集群的過程,同時關(guān)聯(lián)每個應(yīng)用程序的每一層(layer)刘急。Artifactory在一個系統(tǒng)中支持超過25種不同的技術(shù)棧棚菊,具有一個元數(shù)據(jù)模型、一個升級流和強(qiáng)大的制品依賴關(guān)系统求。
Artifactory允許您將容器化的微服務(wù)部署到Kubernetes集群,因為它作為一個通用存儲庫管理平臺來滿足您的所有CI/CD需求另假,而不管它們在您的組織中何處運(yùn)行像屋。登記應(yīng)用程序包后,可以繼續(xù)傳播和執(zhí)行構(gòu)建边篮、測試戈轿、升級凌受,最后部署到Kubernetes。為了方便地將Artifactory(和其他JFrog產(chǎn)品)部署到Kubernetes色乾,請參考我們在helm hub中的官方JFrog Helm Charts(https://hub.helm.sh/charts/jfrog)腾么。
自動化部署到Kubernetes
在CI/CD流水線的每個階段中不需要人工干預(yù)的情況下可靠地大規(guī)模部署應(yīng)用程序是的協(xié)調(diào)的主要原因。但是如何以一種可重復(fù)杈湾、可靠的方式將代碼發(fā)布到集群中呢?如何確保只有正確版本的應(yīng)用程序才能投入生產(chǎn)?
為此解虱,我們建議將Artifactory部署為存儲庫管理平臺,通過抹平開發(fā)和操作之間的差距在CI/CD流水線中扮演重要角色漆撞。
將Artifactory部署為Helm Charts倉庫
Artifactory原生支持Helm存儲庫殴泰,使您能夠完全控制Kubernetes的部署過程于宙。它提供安全的、私有的悍汛、本地的Helm存儲庫捞魁,通過細(xì)粒度的訪問控制在您的組織中共享Helm Charts。使用遠(yuǎn)程存儲庫代理和緩存公共Helm Charts資源离咐,并將本地和遠(yuǎn)程資源聚合到單個虛擬Helm存儲庫下谱俭,從而從單個URL訪問所有Helm Charts。
K8S 專家建議:
當(dāng)使用Artifactory作為您的Helm 存儲庫時宵蛀,我們建議:
?分離您的穩(wěn)定存儲庫和開發(fā)階段存儲庫(基于成熟度)昆著。
?在Charts中使用SemVer version 2版本。
?定期重新計算索引术陶。
在CI/CD流水線中部署應(yīng)用程序的最佳實踐
在CI/CD流水線中部署應(yīng)用程序時凑懂,我們建議:
· 使用相同的Helm Chart進(jìn)行本地、分段梧宫、測試和生產(chǎn)接谨,同時每個環(huán)境使用不同的Value.yaml文件。每個yaml都需要包含特定的環(huán)境配置值塘匣。例如:values-stg..yaml,,value-prod.yaml脓豪。
· 在VCS源代碼管理系統(tǒng)中管理應(yīng)用自定義值。
· 默認(rèn)配置值value.yaml應(yīng)該是針對開發(fā)人員或本地的忌卤,這樣開發(fā)人員就可以輕松地在本地使用它扫夜。
· 對依賴項使用外部charts。使用社區(qū)已經(jīng)完成的工作!
· 出于安全目的:將您的迷藥從Charts中分離出來埠巨,并將它們作為外部Charts引用。
升級發(fā)布可靠和可伸縮的應(yīng)用到Kubernetes環(huán)境
在Kubernetes集群中并行運(yùn)行多個應(yīng)用程序需要建立對工件(Docker鏡像)的持續(xù)訪問现拒,同時支持零停機(jī)的高負(fù)載服務(wù)辣垒。
在Kubernetes部署Artifactory 高可用
通過在Kubernetes集群中部署Artifactory HA(高可用),在集群中印蔬,您將體驗到零宕機(jī)服務(wù)勋桶,如果一個pod被回收或崩潰,或者節(jié)點意外停機(jī)侥猬,容器集群將自動調(diào)度恢復(fù)對應(yīng)服務(wù)的Pod例驹。
在Kubernetes部署Artifactory HA的好處是:
· 在不影響性能的情況下,支持更高的負(fù)載兵法退唠。
· 提供水平服務(wù)器可伸縮性鹃锈,允許您在組織增長時輕松地增加容量以滿足任何負(fù)載需求。
· 支持在沒有系統(tǒng)停機(jī)的情況下執(zhí)行大多數(shù)維護(hù)任務(wù)瞧预。
· 通過使用零停機(jī)時間替換應(yīng)用程序的各個實例屎债,可以在實例上安裝更新版本仅政,從而支持滾動升級。
在下例中盆驹,使用三個節(jié)點部署了一個Artifactory HA集群:一個主節(jié)點和兩個成員節(jié)點圆丹。因為負(fù)載均衡只在成員節(jié)點上執(zhí)行。這使得主節(jié)點可以自由地處理作業(yè)和任務(wù)躯喇,不會被入站流量中斷辫封。
Kubernetes集群的存儲和可伸縮性
Artifactory HA允許您在Kubernetes中突破應(yīng)用程序的限制,因為它支持大量存儲替代方案廉丽。有關(guān)更多信息倦微,請參見配置文件存儲庫。
(https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore)
可見性和安全性:在Kubernetes中保護(hù)您的應(yīng)用程序
像Docker和Kubernetes這樣的云本地技術(shù)提供了更大的攻擊面雅倒,為惡意數(shù)據(jù)挖掘璃诀、勒索軟件和數(shù)據(jù)盜竊提供了更多潛在的入口點。在Kubernetes集群中運(yùn)行的服務(wù)并不是完全獨(dú)立的蔑匣,它們可以訪問集群中的其他區(qū)域劣欢。
正是出于這個原因,集群的可見性非常重要裁良,尤其是從安全性的角度來看凿将。您需要知道容器中運(yùn)行的是什么,因為您的應(yīng)用程序很少包含單個組件价脾,而是包含外部依賴項牧抵,如OS包、OSS libs和第三方流程侨把。這就引出了一個不可避免的問題——它們安全嗎?它們是否包含安全漏洞?他們是否遵守自由/開源軟件許可?
獲的k8s中容器的可見性
Artifactory通過提供可審核性來深入了解整個CI/CD流程犀变,因為它捕獲了整個CI/CD流程中產(chǎn)生的大量有價值的元數(shù)據(jù)。您可以跟蹤負(fù)責(zé)生成Docker鏡像層的應(yīng)用層的CI作業(yè)秋柄。它還可以通過允許比較兩個構(gòu)建來顯示構(gòu)建差異获枝,從而很容易地跟蹤Docker鏡像基于哪個層生成的,到哪個構(gòu)建產(chǎn)生的骇笔,從而跟蹤到提交省店。
k8專家提示:
推薦閱讀:每個人都必須遵循9個Kubernetes安全最佳實踐。
(https://www.cncf.io/blog/2019/01/14/9-kubernetes-security-best-practices-everyone-must-follow/)
掃描和檢測容器中的漏洞
JFrog Xray與Artifactory協(xié)作笨触,在應(yīng)用程序生命周期的任何階段執(zhí)行二進(jìn)制軟件工件的通用分析懦傍。它對容器中的所有層執(zhí)行遞歸掃描,并通過掃描和分析工件及其元數(shù)據(jù)(遞歸地遍歷任何級別的依賴關(guān)系)來幫助識別所有層中的漏洞芦劣〈志悖可以在Xray中設(shè)置策略,根據(jù)Xray掃描發(fā)現(xiàn)的風(fēng)險級別限制或阻止容器鏡像部署到Kubernetes虚吟。通過這種方式源梭,可以阻止脆弱或不兼容的應(yīng)用程序運(yùn)行娱俺,或者限制它們在啟動時可以做什么。
在K8S中保護(hù)您的開源項目
大多數(shù)應(yīng)用程序嚴(yán)重依賴于包管理器和開源存儲庫废麻,因此很容易受到來自這些源的惡意或不安全代碼的攻擊荠卷。作為我們支持和貢獻(xiàn)開源社區(qū)計劃的一部分,JFrog開發(fā)了KubeXray烛愧,這是一個開源項目油宜,它將Xray的安全性擴(kuò)展到Kubernetes pod中運(yùn)行(或即將運(yùn)行)的應(yīng)用程序。使用Xray通過掃描容器映像生成的元數(shù)據(jù)怜姿,KubeXray可以對已經(jīng)部署的內(nèi)容執(zhí)行策略慎冤。
KubeXray監(jiān)控您所有的活動Kubernetes Pod,以幫助您:
· 捕獲當(dāng)前在所有Kubernetes Pod中運(yùn)行的應(yīng)用程序中最新的風(fēng)險或漏洞沧卢。
· 對正在運(yùn)行的應(yīng)用程序強(qiáng)制執(zhí)行當(dāng)前策略蚁堤,即使您已經(jīng)更改了這些策略。
· 對未被Xray掃描且風(fēng)險未知的正在運(yùn)行的應(yīng)用程序執(zhí)行策略但狭。
使用Helm 2防止未經(jīng)授權(quán)的訪問
Helm 2包含一個名為“Tiller”的服務(wù)器端組件披诗。Tiller是一個集群內(nèi)的服務(wù)器,它與Helm客戶端交互立磁,并與Kubernetes API服務(wù)器交互呈队。
Tiller 絕對是很酷的住涉,但重要的是要知道有安全問題即寡。這是因為Helm客戶端負(fù)責(zé)管理Charts优质,而服務(wù)器負(fù)責(zé)管理發(fā)布土铺。這帶來了很大的風(fēng)險,因為Tiller使用root權(quán)限運(yùn)行绒北,有人可能會未經(jīng)授權(quán)訪問您的服務(wù)器话侧。
Rimas Mocevicius是JFrog公司的一名員工筹陵,也是Helm公司的聯(lián)合創(chuàng)始人沿后,他提出了一種創(chuàng)新的方法來解決這種情況沿彭,即在工作站上或CI/CD管道上運(yùn)行Helm和Tiller,而不將Tiller安裝到Kubernetes集群中得运。您可以下載并安裝無Tiller 的Helm v2插件膝蜈。
使用用RBAC管理Kubernetes
必須將RBAC(基于角色的訪問控制)設(shè)置為Kubernetes的管理功能锅移,因為它允許您定義哪個用戶可以管理集群及其粒度熔掺。除了定義可以列出哪些用戶和應(yīng)用程序之外,還可以獲取非剃、創(chuàng)建或刪除pods和其他Kubernetes對象置逻。一個好的實踐是通過在為應(yīng)用程序創(chuàng)建的服務(wù)帳戶中設(shè)置“automountServiceAccountToken: false”來禁用對API的訪問。
如果沒有指定服務(wù)帳戶备绽,它會自動將相同名稱空間中的“默認(rèn)”服務(wù)帳戶分配給pod券坞。我們建議不要使用名稱空間附帶的默認(rèn)值鬓催。始終為應(yīng)用程序創(chuàng)建服務(wù)帳戶,因為它允許您設(shè)置應(yīng)用程序的限制恨锚,包括名稱空間或集群范圍的操作宇驾,并完全禁用對Kubernetes API的訪問。
在K8S中記錄日志猴伶、監(jiān)視和調(diào)試應(yīng)用程序
微服務(wù)的數(shù)量隨著復(fù)雜性的增加而增加课舍,問題是如何跟蹤和監(jiān)視它們,以及應(yīng)該監(jiān)視什么他挎。當(dāng)涉及到微服務(wù)時筝尾,您需要收集以下數(shù)據(jù)微服務(wù):
· 意外事件:例如,在數(shù)據(jù)庫容器中執(zhí)行的所有權(quán)更改
· 微服務(wù)宕機(jī)办桨。
· 不正確的文件選擇在生產(chǎn)造成混亂筹淫。
· 不允許使用特定的基本OS版本。
在Kubernetes中應(yīng)用程序記錄日志的最佳實踐
應(yīng)用程序和系統(tǒng)日志對于排除Kubernetes集群活動的故障非常重要呢撞。
在Kubernetes中應(yīng)用程序記錄日志時损姜,請遵循以下最佳實踐::
· 限制對日志的直接訪問。
· 在使用Kubernetes儀表板(不推薦用于生產(chǎn)環(huán)境)時狸相,將儀表板設(shè)置為具有訪問權(quán)限的只讀薛匪。您可以允許其他成員執(zhí)行故障排除,但不要完全訪問儀表板脓鹃,因為它可能會對Kubernetes集群造成損害逸尖。
· 確保您的日志是實時可訪問的,并且可以在稍后的階段進(jìn)行分析瘸右。
· 使用ELK/EFK技術(shù)棧等日志收集工具(ElasticSearch娇跟、Logstash/Fluentd和Kibana)收集和索引來自系統(tǒng)和應(yīng)用程序的所有日志。
· 考慮將日志保存在單獨(dú)的集群中太颤,以便在稍后階段使用日志苞俘。如果集群宕機(jī),允許您訪問日志
持續(xù)監(jiān)控K8S中的微服務(wù)
持續(xù)監(jiān)視系統(tǒng)和應(yīng)用程序健康狀況非常重要龄章。
對于實時監(jiān)視Kubernetes集群和其中運(yùn)行的應(yīng)用程序吃谣,有許多免費(fèi)的和商業(yè)的解決方案。其中一個流行的解決方案是Prometheus 做裙,Grafana的結(jié)合岗憋,提供實時監(jiān)控,可以與報警工具相結(jié)合锚贱。
將應(yīng)用程序部署到K8S生產(chǎn)環(huán)境中
在K8S順利開始旅程的10個技巧
1. 對于初學(xué)者仔戈,我們建議從閱讀Kubernetes的艱難方式開始!
( https://github.com/kelseyhightower/kubernetes-the-hard-way/blob/master/README.md )
2. 從小事做起。從示例中學(xué)習(xí),從一個小應(yīng)用程序(nginx)開始监徘,使用現(xiàn)有的演示晋修,并嘗試在Docker的Skin Kubernetes中部署應(yīng)用程序。
3. 在進(jìn)入K8S之前準(zhǔn)備好你的應(yīng)用程序凰盔。
4. 為使應(yīng)用程序在k8s中運(yùn)行墓卦,設(shè)置一個最小的目標(biāo)。
5. 使用托管的k8S來解放您的工作户敬,例如:AKS趴拧、ESK或GKE,它們?yōu)槟橄罅嗽S多復(fù)雜性山叮。
6. 每個Pod有一個主容器著榴。
7. 我們建嘗試GKE 托管管理Kubernetes。
8. 確定在Kubernetes集群內(nèi)或集群外存儲數(shù)據(jù)庫的位置屁倔。這一點非常重要脑又,因為您需要在集群崩潰時計劃集群恢復(fù)∪窠瑁考慮以下:
-當(dāng)K8S在prem上運(yùn)行時:在Kubernetes中將現(xiàn)有的數(shù)據(jù)庫作為無狀態(tài)應(yīng)用程序使用问麸。
-在云上運(yùn)行K8S時:,選擇一個如PostgreSQL或MySQL的operator 钞翔,其知道如何在Kubernetes節(jié)點宕機(jī)時恢復(fù)的持久化數(shù)據(jù)庫严卖。
9. 部署到容器云時,請將對應(yīng)集群分開布轿,運(yùn)行CI/CD流水線哮笆,以及從外部CI/CD流水線部署應(yīng)用到Kubernetes集群。
10. 與社區(qū)合作
總結(jié)
正如本篇文章所描述的汰扭,我們展示了Kubernetes和JFrog Artifactory是如何讓您可靠地稠肘、可預(yù)測地部署應(yīng)用程序、動態(tài)地伸縮應(yīng)用程序萝毛、無縫地推出新特性并有效地利用硬件資源的项阴。
本篇文章旨在回顧希望采用Kubernetes作為容器編排工具的公司所面臨的復(fù)雜性和挑戰(zhàn)。我們希望我們分享的經(jīng)驗教訓(xùn)笆包、最佳實踐和技巧將幫助您在前往K8s的旅途中起步并繼續(xù)前進(jìn)环揽。