引言
Kubernetes已經(jīng)成為市場上事實(shí)上領(lǐng)先的編配工具,不僅對技術(shù)公司如此,對所有公司都是如此,因?yàn)樗试S您快速且可預(yù)測地部署應(yīng)用程序、動態(tài)地伸縮應(yīng)用程序、無縫地推出新特性,同時有效地利用硬件資源。
本期我們將回顧采用Kubernetes作為容器編排工具的公司所面臨的復(fù)雜性和挑戰(zhàn)。我們希望我們提供的經(jīng)驗(yàn)教訓(xùn)、最佳實(shí)踐和技巧將幫助您在前往K8s旅途中起步并繼續(xù)前進(jìn)。
本期將介紹關(guān)于在Kubernetes生產(chǎn)環(huán)境的最佳實(shí)踐,包括::
· 為上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還允許我們更好地利用我們的資源,因?yàn)槲覀儾辉傩枰獮閱为?dú)部署每個產(chǎn)品而啟動單個VM。下面我們將回顧落地過程中的主要挑戰(zhàn)(6大挑戰(zhàn)),同時分享我們的最佳實(shí)踐、技巧,和在將您的容器應(yīng)用程序一路帶到生產(chǎn)環(huán)境中所獲得的經(jīng)驗(yàn)教訓(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)用程序。這樣做的缺點(diǎn)是,當(dāng)整個團(tuán)隊(duì)都在處理各種組件時,情況會很快變得非常復(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ú)的、受管理的和可信的真實(shí)源,該源存儲和記錄應(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)建到部署的生命周期的管理中實(shí)現(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集群,因?yàn)樗鳛橐粋€通用存儲庫管理平臺來滿足您的所有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)用程序的最佳實(shí)踐
在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ā)人員就可以輕松地在本地使用它。
· 對依賴項(xiàng)使用外部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(高可用),在集群中,您將體驗(yàn)到零宕機(jī)服務(wù),如果一個pod被回收或崩潰,或者節(jié)點(diǎn)意外停機(jī),容器集群將自動調(diào)度恢復(fù)對應(yīng)服務(wù)的Pod。
在Kubernetes部署Artifactory HA的好處是:
· 在不影響性能的情況下,支持更高的負(fù)載兵法。
· 提供水平服務(wù)器可伸縮性,允許您在組織增長時輕松地增加容量以滿足任何負(fù)載需求。
· 支持在沒有系統(tǒng)停機(jī)的情況下執(zhí)行大多數(shù)維護(hù)任務(wù)。
· 通過使用零停機(jī)時間替換應(yīng)用程序的各個實(shí)例,可以在實(shí)例上安裝更新版本,從而支持滾動升級。
在下例中,使用三個節(jié)點(diǎn)部署了一個Artifactory HA集群:一個主節(jié)點(diǎn)和兩個成員節(jié)點(diǎn)。因?yàn)樨?fù)載均衡只在成員節(jié)點(diǎn)上執(zhí)行。這使得主節(jié)點(diǎn)可以自由地處理作業(yè)和任務(wù),不會被入站流量中斷。

Kubernetes集群的存儲和可伸縮性
Artifactory HA允許您在Kubernetes中突破應(yīng)用程序的限制,因?yàn)樗С执罅看鎯μ娲桨?。有關(guān)更多信息,請參見配置文件存儲庫。
(https://www.jfrog.com/confluence/display/RTF/Configuring+the+Filestore)
可見性和安全性:在Kubernetes中保護(hù)您的應(yīng)用程序
像Docker和Kubernetes這樣的云本地技術(shù)提供了更大的攻擊面,為惡意數(shù)據(jù)挖掘、勒索軟件和數(shù)據(jù)盜竊提供了更多潛在的入口點(diǎn)。在Kubernetes集群中運(yùn)行的服務(wù)并不是完全獨(dú)立的,它們可以訪問集群中的其他區(qū)域。
正是出于這個原因,集群的可見性非常重要,尤其是從安全性的角度來看。您需要知道容器中運(yùn)行的是什么,因?yàn)槟膽?yīng)用程序很少包含單個組件,而是包含外部依賴項(xiàng),如OS包、OSS libs和第三方流程。這就引出了一個不可避免的問題——它們安全嗎?它們是否包含安全漏洞?他們是否遵守自由/開源軟件許可?
獲的k8s中容器的可見性
Artifactory通過提供可審核性來深入了解整個CI/CD流程,因?yàn)樗东@了整個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安全最佳實(shí)踐。
(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)系)來幫助識別所有層中的漏洞??梢栽赬ray中設(shè)置策略,根據(jù)Xray掃描發(fā)現(xiàn)的風(fēng)險級別限制或阻止容器鏡像部署到Kubernetes。通過這種方式,可以阻止脆弱或不兼容的應(yīng)用程序運(yùn)行,或者限制它們在啟動時可以做什么。
在K8S中保護(hù)您的開源項(xiàng)目
大多數(shù)應(yīng)用程序嚴(yán)重依賴于包管理器和開源存儲庫,因此很容易受到來自這些源的惡意或不安全代碼的攻擊。作為我們支持和貢獻(xiàn)開源社區(qū)計劃的一部分,JFrog開發(fā)了KubeXray,這是一個開源項(xiàng)目,它將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 絕對是很酷的,但重要的是要知道有安全問題。這是因?yàn)镠elm客戶端負(fù)責(zé)管理Charts,而服務(wù)器負(fù)責(zé)管理發(fā)布。這帶來了很大的風(fēng)險,因?yàn)門iller使用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àn)樗试S您定義哪個用戶可以管理集群及其粒度。除了定義可以列出哪些用戶和應(yīng)用程序之外,還可以獲取、創(chuàng)建或刪除pods和其他Kubernetes對象。一個好的實(shí)踐是通過在為應(yīng)用程序創(chuàng)建的服務(wù)帳戶中設(shè)置“automountServiceAccountToken: false”來禁用對API的訪問。
如果沒有指定服務(wù)帳戶,它會自動將相同名稱空間中的“默認(rèn)”服務(wù)帳戶分配給pod。我們建議不要使用名稱空間附帶的默認(rèn)值。始終為應(yīng)用程序創(chuàng)建服務(wù)帳戶,因?yàn)樗试S您設(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)用程序記錄日志的最佳實(shí)踐
應(yīng)用程序和系統(tǒng)日志對于排除Kubernetes集群活動的故障非常重要。
在Kubernetes中應(yīng)用程序記錄日志時,請遵循以下最佳實(shí)踐::
· 限制對日志的直接訪問。
· 在使用Kubernetes儀表板(不推薦用于生產(chǎn)環(huán)境)時,將儀表板設(shè)置為具有訪問權(quán)限的只讀。您可以允許其他成員執(zhí)行故障排除,但不要完全訪問儀表板,因?yàn)樗赡軙ubernetes集群造成損害。
· 確保您的日志是實(shí)時可訪問的,并且可以在稍后的階段進(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)用程序健康狀況非常重要。
對于實(shí)時監(jiān)視Kubernetes集群和其中運(yùn)行的應(yīng)用程序,有許多免費(fèi)的和商業(yè)的解決方案。其中一個流行的解決方案是Prometheus ,Grafana的結(jié)合,提供實(shí)時監(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ù)庫的位置。這一點(diǎn)非常重要,因?yàn)槟枰诩罕罎r計劃集群恢復(fù)??紤]以下:
-當(dāng)K8S在prem上運(yùn)行時:在Kubernetes中將現(xiàn)有的數(shù)據(jù)庫作為無狀態(tài)應(yīng)用程序使用。
-在云上運(yùn)行K8S時:,選擇一個如PostgreSQL或MySQL的operator ,其知道如何在Kubernetes節(jié)點(diǎn)宕機(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)驗(yàn)教訓(xùn)、最佳實(shí)踐和技巧將幫助您在前往K8s的旅途中起步并繼續(xù)前進(jìn)。