云原生初探
文章目錄
- 什么是云原生?
- 第二講 容器的基本概念
- 什么是容器?
- 容器運行時的生命周期
- 容器項目的架構
- 容器和VM的差異
- 第三講 Kubernetes核心概念
- 什么是Kubernetes
- Kubernetes架構
- Kubernetes核心概念和API
- 第四講 理解Pod和容器設計模式
- 為什么Pod必須是原子調度單位?
- Pod實現機制
什么是云原生?
不同企業對云原生有不同的解釋,最為廣泛接受的是:云原生是一類技術的統稱 或者 是一套指導進行軟件架構設計的思想,通過云原生技術,我們可以構建出更易于彈性擴展的應用程序。它包含了當前業界的一些熱門的技術,比如:容器、微服務、DevOps等。
第二講 容器的基本概念
什么是容器?
容器是一個視圖隔離(能夠看見部分進程等 namespace)、資源可限制(限制資源使用率 cgroup)、獨立文件系統(chroot)。
容器運行時所需要的所有文件集合稱為容器鏡像。通常采用Dockerfile構建鏡像。
容器運行時的生命周期
-
單進程模型
啟動容器時,會選擇相應的文件系統(鏡像來提供),以及指定相應的運行程序,那么這個運行程序我們稱為init進程。在容器運行過程中,我們會發現,當這個init進程啟動了,那么這個容器也啟動了,當這個init進程退出了,那么這個容器也就隨之退出了。所以,init進程的生命周期與容器生命周期一致。
-
數據持久化
數據卷volume,獨立于容器的生命周期;
容器項目的架構
-
moby容器引擎架構
moby daemon會提供關于容器、鏡像、網絡以及volume的管理。它依賴的最重要的組件是containerd(容器運行時管理引擎),獨立于moby daemon,containerd-shim管理容器生命周期,可被containerd動態接管。
容器和VM的差異
VM是利用Hypervisor虛擬化技術來模擬硬件資源,需要Guest OS(裝在VM上的系統),可以提供更好的隔離效果。但是,我們需要將一部分的計算資源交給虛擬化,導致很難充分利用計算資源,并且每個Guest OS需要占用大量的磁盤空間。
容器無需Guest OS,只需要一個獨立的文件系統。所有的隔離級別都是進程級別的;啟動時間更快;但隔離效果較弱。
第三講 Kubernetes核心概念
什么是Kubernetes
自動化的容器編排平臺
核心功能:
- 服務發現與負載均衡;
- 容器自動裝箱(把一個容器放到某個集群的某個機器上);
- 存儲編排;
- 自動容器恢復(節點健康檢查,將有問題的節點上的容器遷移到其他節點上去);
- 自動發布與回滾;
- 配置與密文管理;
- 批量執行;
- 水平伸縮(業務負載檢查,可以對負載過高的服務進行擴容);
Kubernetes架構
- API Server:消息傳送;
- Controller:完成對集群狀態的管理;
- Scheduler:調度;
- etcd:分布式存儲,API Server中所需要的信息都放在etcd中;
用戶可以通過ui或cli向kubernetes提供一個pod進行部署,API Server會將相關信息存儲到etcd中,Scheduler會通過API Server的watch或者notification機制得到這個信息(有一個pod需要被調度),Scheduler會根據它的資源狀態進行一次調度決策,在完成這次調度之后,Scheduler會向API Server通知這個pob需要被調度到某個節點上,API Server會將調度的結果再次寫入到etcd中。然后,API Server會通知對應的節點進行pob的啟動和執行。相應節點的kubelet會得到這個通知,調用Container runtime來配置、啟動這個容器的運行環境,去調用Storage Plugin來配置存儲,調用Network Plugin來配置網絡。
Kubernetes核心概念和API
-
Pod
- 最小的調度以及資源單位;
- 由一個或者多個容器組成;
- 在Pob中可以定義容器運行的方式(Command、環境變量等);
- 提供給容器共享的運行環境(網絡、進程空間,pob與pob之間是有隔離的);
-
Volume
- 用來聲明容器的訪問目錄(Pob中的容器可以訪問的文件目錄);
- 一個volume可以被掛載在一個Pob中的一個或多個容器的指定路徑下;
- volume是一個抽象的概念,它可以支持多種后端的存儲(分布式、云存儲…);
-
Deployment
-
定義一組Pob的副本數目、版本等;
-
通過Colltroller維持Pob的數目,Controller可以自動恢復失敗的Pod;Deployment中Pob的數目是通過Controller來指定的,當一個Pod失敗時,Controller可以檢測到,來生成新的Pob。
-
可以通過Controller以指定的策略控制版本:滾動升級、重新生成、回滾;
-
Service
- 提供訪問一個或多個Pod實現的穩定訪問地址(負載均衡);
-
Namespace
- 一個集群內部的邏輯隔離機制(鑒權、資源調度);
- 每個資源都屬于一個Namespace;
- 同一個Namespace中的資源命名唯一;
第四講 理解Pod和容器設計模式
由四個進程共同組成的應用helloworld,在kubernates中會被定義為擁有四個容器的Pod。Pob只是一個邏輯單位,真正啟來的實際上是四個容器。
為什么Pod必須是原子調度單位?
舉例:兩個緊密協作(需要部署在一臺機器上)的容器App和LogCollector;
內存要求:App—1G、LogCollector:0.5G;
當前可用內存:Node_A:1.25G、Node_B:2G;
如果App先被調度到了Node_A上,那么就會導致LogCollector調度失敗。
這就是Task co-scheduling問題:
- Mesos的解決辦法:資源囤積;所有設置了Affinity約束的任務都到達時,才開始同一進行調度;帶來的問題是:調度效率損失、死鎖;
- Google Omega:樂觀調度;不管沖突,出現沖突之后回滾;
- Kubernetes:Pod;不存在上面的問題;App和LogCollector屬于一個Pob,一起被調度;
親密關系:兩個應用需要運行在同一臺宿主機上(Pod之間);通過調度解決;
超親密關系:會發生直接的文件交換;使用localhost或者socket文件進行本地通信;會發生非常頻繁的RPC調用;會共享某些Linux Namespace(比如:一個容器要加入另一個容器的Network Namespace,就可以看到另一個容器的網絡設備以及網絡信息);通過Pod解決;
Pod實現機制
容器之間原本是被Linux Namespace和cgroups隔離開的,那么如何讓一個Pod里的多個容器之間最高效的共享某些資源和數據?
-
共享網絡
在每一個Pod里會啟動一個Infra container小容器來共享整個Pod的Network Namespace。Pob內部容器直接使用localhost進行通信;每個容器看到的網絡設備跟Infra容器看到的一樣;一個Pod只有一個IP地址,也就是這個Pod的Network Namespace對應的IP地址;所有網絡資源都是一個Pod一份,并且被該Pod中的所有容器共享;整個Pod的生命周期跟Infra容器一致,而與內部的其他容器無關;
-
共享存儲
掛載到同一個volume;
總結
- 上一篇: 三伏贴真的有效果吗
- 下一篇: Eight HDU - 1043(八数码