全稱Cloud Native Computing Foundation(雲原生計算基金會)
2015年7月21日Google主導成立了雲原生計算基金會,其最初的口號是堅持和整合開源技術來讓編排容器作爲微服務架構的一部分,致力於雲原生應用推廣和普及。
CNCF作爲一個廠商中立的基金會,致力於Github上的快速成長的開源技術的推廣,如Kubernetes、Prometheus、Envoy等,幫助開發人員更快更好的構建出色的產品。
雲原生技術有利於各組織在公有云、私有云和混合雲等新型動態環境中,構建和運行可彈性擴展的應用。雲原生的代表技術包括容器、服務網格、微服務、不可變基礎設施和聲明式API。
這些技術能夠構建容錯性好、易於管理和便於觀察的鬆耦合系統。結合可靠的自動化手段,雲原生技術使工程師能夠輕鬆地對系統作出頻繁和可預測的重大變更。
雲原生計算基金會(CNCF)致力於培育和維護一個廠商中立的開源生態系統,來推廣雲原生技術。我們通過將最前沿的模式民主化,讓這些創新爲大衆所用。
由於KVM( for Kernel-based Virtual Machine )hypervisor虛擬化技術仍然存在⼀些性能和資源使⽤效率⽅⾯的問題,因此出現了⼀種稱爲容器技術(Container)的新型虛擬化技術來幫助解決這些問題。
虛擬化技術可以在宿主機上安裝多個不同的操作系統,運⾏多套不同的應⽤。但可能就是爲了運⾏⼀個微應用,卻還要在虛擬機⾥運⾏⼀個完整的操作系統,內核和其它⽆關程序,這種做法資源利⽤不⾼。
所以我們希望更多的關注應⽤程序本身,⽽不再分精⼒去關注操作系統與⽆關程序,操作系統內核直接與宿主機共享。
Docker容器本質上是宿主機的進程. 可以把docker容器內部跑的進程看作是宿主機的線程。
Docker通過namespace實現了資源隔離,通過cgroups實現了資源限制。
Linux內核實現namespace的⼀個主要⽬的就是實現輕量級虛擬化(容器)服務。在同⼀個namespace下
的進程可以感知彼此的變化,⽽對外界的進程⼀⽆所知。
Linux容器技術是⼀種輕量級的虛擬化技術。主要特點有:
虛擬化(VM)Docker容器操作系統宿主機OS上運行虛擬機OS與宿主機共享OS存儲大小鏡像龐大(vmdk、vdi等)鏡像小,便於存儲於傳輸運行性能操作系統額外的CPU、內存開銷幾乎無額外的性能損失移植性笨重,與虛擬化耦合度高輕便、靈活、適應於linux硬件親和性面向硬件開發者面向軟件開發者部署速度較慢、10秒級別快速、秒級
Kubernetes(k8s)是Google基於Borg開源的容器編排調度引擎,作爲CNCF(Cloud Native Computing Foundation)最重要的組件之一,它的目標不僅僅是一個編排系統,而是提供一個規範,可以讓你來描述集羣的架構,定義服務的最終狀態,Kubernetes可以幫你將系統自動得達到和維持在這個狀態。
Kubernetes用戶可以通過編寫一個yaml或者json格式的配置文件,也可以通過工具/代碼生成或直接請求Kubernetes API創建應用,該配置文件中包含了用戶想要應用程序保持的狀態,不論整個Kubernetes集羣中的個別主機發生什麼問題,都不會影響應用程序的狀態,你還可以通過改變該配置文件或請求Kubernetes API來改變應用程序的狀態。
Kubernetes 架構圖:
其他容器編排與調度技術方案:
Swarm、Mesos
微服務是一種分佈式架構設計理念,爲了推動細粒度服務的使用,這些服務要能協同工作,每個服務都有自己的生命週期。一個微服務就是一個獨立的實體,可以獨立的部署在PAAS平臺上,也可以作爲一個獨立的進程在主機中運行。服務之間通過API訪問,修改一個服務不會影響其它服務。
微服務帶給我們很多開發和部署上的靈活性和技術多樣性,但是也增加了服務調用的開銷、分佈式系統管理、調試與服務治理方面的難題。
當前最成熟最完整的微服務框架Spring,而Spring又僅限於Java語言開發,其架構本身又跟Kubernetes存在很多重合的部分,如何探索將Kubernetes作爲微服務架構平臺就成爲一個熱點話題。就拿微服務中最基礎的服務註冊發現功能來說,其方式分爲客戶端服務發現和服務端服務發現兩種,Java應用中常用的方式是使用Eureka和Ribbon做服務註冊發現和負載均衡,這屬於客戶端服務發現,而在Kubernetes中則可以使用DNS、Service和Ingress來實現,不需要修改應用代碼,直接從網絡層面來實現。
Kubernetes中的應用將作爲微服務運行,但是Kubernetes本身並沒有給出微服務治理的解決方案,比如服務的限流、熔斷、良好的灰度發佈支持等。
Service Mesh可以用來做什麼
Service Mesh的特點
當前開源的Service Mesh有哪些?
使用Service Mesh將可以有效的治理Kubernetes中運行的服務:
Continuous integration,簡稱CI
是一種軟件開發實踐,即團隊開發成員經常集成他們的工作,通常每個成員每天至少集成一次,也就意味着每天可能會發生多次集成。每次集成都通過自動化的構建(包括編譯,發佈,自動化測試)來驗證,從而儘快地發現集成錯誤。
持續集成的目的不是減少build失敗的次數,⽽是儘早發現問題,在最短的時間內解決問題,減少風險和浪費。從而讓產品開發流程更加敏捷,縮短產品開發週期,在產品上線後,讓用戶用得更加順暢。
在沒有應用持續集成之前,傳統的開發模式是項目一開始就劃分模塊,每個開發人員分別負責一個模塊,等所有的代碼都開發完成之後再集成到一起提交給測試⼈人員,隨着軟件技術團隊的發展,軟件已經不能簡單地通過劃分模塊的方式來開發,需要項目內部相互協作,劃分模塊這種傳統的模式的弊端也越來越明顯。由於很多bug在項目早期的設計、編碼階段就引入,到最後集成測試時才發現問題,開發人員需要花費⼤量的時間來定位bug,加上軟件的複雜性,bug的定位就更難了,甚⾄出現不得不調整底層架構的情況。這種情況的發生不僅對測試進度造成影響,⽽且會拖長整個項⽬週期。
而持續集成可以有效解決軟件開發過程中的許多問題,在集成測試階段之前就幫助開發人員發現問題,從而可以有效的確保軟件質量,減小項目的風險,使軟件開發團隊從容的面對各種變化。持續集成報告中可以體現目前項目進度,哪部分需要已經實現,哪些代碼已經通過自動化測試,代碼質量如何,讓開發團隊和項目組瞭解項目的真實狀況。
Continuous Delivery,簡稱CD
持續交付是指軟件開發過程,從原始需求到最終產品開發過程中,較短週期內以需求的小顆粒度(小批量)頻繁提交的過程。
目的
Continuous Deployment,簡稱CD
基於持續交付的基礎上,把功能穩定,符合產品需求的版本有方法地部署至生產環境中。
Continuous Release,簡稱CR
發佈是週期性或不定期地對項目在部署後,進行整體軟件版本的更新,例如,更新功能或展示頁面框架等。
目的
Continuous Testing,簡稱CT
持續測試是貫穿着整個軟件開發過程,驗證程序員提交代碼,檢驗合規性及降低bug,減少最終錯誤,實現敏捷及精益開發。
目的
Jenkins是一款由Java編寫的開源的持續集成工具。
Jenkins提供了軟件開發的持續集成服務。它運行在Servlet容器中。它支持軟件配置管理(SCM)工具(包括AccuRev SCM、CVS、Subversion、Git、Perforce、Clearcase和RTC),可以執行基於Apache Ant和Apache Maven的項目,以及任意的Shell腳本和Windows批處理命令。
使用Jenkins進行持續集成與發佈流程圖:
應用構建和發佈流程說明: