【Devops】K8s 基礎入門

Container  VS  VM

【VM】在使用容器之前,大多數基礎架構不是在裸機上運行,而是在管理多個虛擬化操作系統(OS)的虛擬機管理程序上運行。這種安排允許應用程序在比OS提供的更高級別上彼此隔離。這些虛擬化操作系統可識別出自己獨有的硬件。但是,這也意味着每個虛擬操作系統都在複製整個操作系統,這需要更多的磁盤空間。

【Container】

       容器提供類似於虛擬機(VM)的隔離,除了由操作系統和進程級別提供。 每個容器都是一個獨立運行的進程或進程組。 典型容器顯式只運行一個進程,因爲它們不需要標準系統服務。他們通常需要做的事情可以通過對基本OS內核的系統調用來提供。

        Linux上的隔離是由名爲namespaces的功能提供的。 每種不同類型的隔離,即用戶和用戶組,由不同的名稱空間提供。這是一些常用且對用戶可見的命名空間的列表:

·     PID:進程ID

·     USER:用戶和組ID

·     UTS:主機名和域名

·     NS:掛載點

·     NET:網絡設備,堆棧和端口

·     CGROUPS:控制限制和資源監控

     傳統應用程序在本機硬件上運行。 單個應用程序通常不使用單個計算機的完整資源。大多數組織嘗試在一臺計算機上運行多個應用程序,以避免浪費資源。 可以運行同一應用程序的多個副本,但爲了提供隔離,可以使用VM在同一硬件上運行多個應用程序實例(VM)。 這些虛擬機具有完整的操作系統堆棧,由於在運行時和磁盤上都存在重複,因此它們相對較大且效率較低。、

·     容器允許共享主機操作系統。這樣可以減少重複,同時仍然提供隔離。

·     容器還允許刪除不需要的文件,如系統庫和二進制文件,以節省空間並減少攻擊面。如果未安裝SSHD或LIBC,則無法利用它們。

===================K8S 簡介=========================

Kubernetes orchestration

       Kubernetes/k8s/kube。這個詞植根於古希臘語,意思是“舵手”。舵手就是駕馭船隻的人。希望能看到指導船舶與在集羣上編排容器的決策之間的類比。

       與Apache Mesos和Docker Swarm一樣,Kubernetes是一個用於配置,管理和擴展應用程序的容器協調器。即Kubernetes允許在節點集羣(管理員機器的集合,例如VM或物理機器)中管理容器化應用程序的生命週期。

       運行的應用程序可能需要運行許多其他資源,例如卷,網絡和密鑰,這些資源將幫助執行諸如連接到數據庫,與防火牆後端通信以及安全密鑰等操作。Kubernetes可幫助將這些資源添加到應用中,以聲明方式管理所需的基礎架構資源。

       Kubernetes的關鍵範式是其聲明模型。K8S可以實現用戶提供所需的狀態。如果需要五個實例,則不要啓動五個單獨的實例,而是告訴Kubernetes需要五個實例,Kubernetes將自動協調狀態。此時,只需要知道聲明瞭所需的狀態,而Kubernetes就會發生這種情況。如果某個實例出現問題並且崩潰,Kubernetes仍然知道所需的狀態並在可用節點上創建新實例。

Kubernetes architecture

      Kubernetes的核心是數據存儲(etcd)。 聲明性模型作爲對象存儲在數據存儲中,若當想要容器的五個實例時,該請求將存儲到數據存儲中。監視此信息更改並委派(delegated)給控制器以採取操作。 然後,控制器對模型做出反應並嘗試採取措施以達到所需的狀態。Kubernetes的力量在於它的簡單模型。

       如上圖中,API服務器是一個簡單的HTTP服務器,用於處理數據存儲上的創建/讀取/更新/刪除(CRUD)操作, Controller會識別想要的更改並使其發生。控制器負責實例化由任何Kubernetes資源表示的實際資源,這些實際資源是應用程序成功運行所需的資源。

【Kubernetesresource model】

       Kubernetes基礎架構爲每個目的定義資源。 每個資源都由Controller監控和處理。 定義應用程序時,它包含這些資源的集合。然後控制器將讀取此集合以構建應用程序的實際後備實例。簡單介紹一下資源列表:

·     配置映射(Config Maps):保存要使用的容器的配置數據

·     守護程序集(Daemon sets):確保集羣中的每個節點都運行此窗格

·     部署(Deployment):定義部署對象的所需狀態

·     事件(Events):在pod和其他部署對象上提供生命週期事件

·     端點(Endpoints):允許入站連接到達羣集服務

·     Ingress:允許入站連接到達集羣服務的規則集合

·     作業(Jobs):創建一個或多個窗格,當它們成功完成時,作業將標記爲已完成

·     節點(Node):Kubernetes中的工作機器

·     命名空間(Namespaces):由同一物理集羣支持的多個虛擬集羣

·     Pod:可以在Kubernetes中創建和管理的最小可部署計算單元

·     持久卷(Persistent volumes):爲用戶和管理員提供API,以抽象有關如何使用存儲的詳細信息

·     副本集(Replica sets):確保在任何給定時間運行指定數量的pod副本

·     祕密(Secrets):保存敏感信息,例如密碼,OAuth令牌和SSH密鑰

·     服務帳戶(Service accounts):爲在pod中運行的進程提供標識

·     服務(Services):定義一組邏輯pod的抽象以及用於訪問它們的策略,有時稱爲微服務

·     有狀態集(Stateful sets):管理有狀態應用程序的工作負載API對象

       K8s沒有應用程序的概念。 它有需要程序猿編寫的簡單構建塊。K8s是一個雲原生平臺,其內部資源模型與最終用戶資源模型相同。

【Keyresources and pods】

       pod是您可以創建和運行的最小對象模型。可以向pod添加標籤以標識要在其上運行操作的子集。當擴展應用程序時,可以使用標籤告訴Kubernetes需要擴展哪個Pod。Pod通常表示爲集羣中的進程。Pod包含至少一個運行作業的容器,另外可能還有其他容器,如sidecars,用於監視,記錄等。從本質上pod是一組容器。

       應用程序通常是一組pod,雖然整個應用程序可以在單個pod中運行,但通常會構建多個可以相互通信以創建有用應用程序的pod。在構建應用程序時將應用程序邏輯和後端數據庫分離爲單獨的pod可以更好地擴展。

       K8s通過kubectl命令行界面提供客戶端界面。 Kubectl命令允許通過修改數據存儲中的模型來管理應用程序並管理羣集和羣集資源。可以通過YAML直接操作資源,YAML是一種人類可讀的序列化語言:

         $ kubectl(create|get|apply|delete) -f myResource.yaml

【Kubernetesapp deployment workflow】

      ETCD是一個開源的分佈式鍵值存儲,爲Container Linux集羣提供共享配置和服務發現。 ETCD在集羣中的每臺機器上運行,並在網絡分區和當前領導者的丟失期間優雅地處理領導者選舉。ETCD是一個可靠的分佈式KV存儲產品,由CoreOS公司開發,其底層使用Raft算法保證一致性,主要用於共享配置和服務發現。

·     用戶使用kubectl CLI部署新應用程序。 Kubectl將請求發送到API服務器。

·     API服務器接收請求並將其存儲在數據存儲(etcd)中。將請求寫入數據存儲後,API服務器將完成請求。

·     監視器檢測資源更改並向Controller發送通知以對這些更改進行操作。

·     Controller會檢測新應用並創建新的pod以匹配所需的實例數。對存儲模型的任何更改都將用於創建或刪除pod。

·     Scheduler根據特定條件爲節點分配新pod。調度程序決定是否在羣集中的特定節點上運行pod。調度程序使用節點信息修改模型。

·     節點上的Kubelet檢測具有自身分配的pod,並通過容器運行時部署所請求的容器,例如Docker。每個節點都會監視存儲,以查看它分配給哪些pod運行。節點對分配給它的資源採取必要的操作,例如創建或刪除pod。

·     Kubeproxy管理pod的網絡流量,包括服務發現和負載平衡。 Kubeproxy負責想要進行交互的pod之間的通信。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章