這是一個建立於 的文章,其中的資訊可能已經有所發展或是發生改變。
導讀:
Kubernetes如今風靡一時,所有主要的雲端服務供應商都將其作為部署雲原生應用的解決方案。Kubernetes有哪些顯著的特性和工具優勢,讓企業開始接受它?本文作者給出了系統的梳理。
“Action without orchestration is burn out; orchestration w/o action is management.”
沒有編排的行動是完蛋的,沒有行動的編排是管理,行動加上編排是領導。
― Orrin Woodward”
Kubernetes是一種最佳化資源使用率的抽象概念,它允許跨節點叢集高效地進行應用程式分發。
Kubernetes,舵手 !
Kubernetes是一個希臘語單詞,意思是“舵手”。
它是一個由Google開始的開源項目,從Borg衍生而來,在Google內部使用了好幾年,現在用於容器管理。目前由CNCF託管。
Kubernetes(縮寫為K8S)是一種抽象,它通過容器來最佳化CPU和記憶體等資源的利用率,從而可以跨多個節點高效地進行應用程式分發。K8S可以在裸金屬或任何雲基礎設施供應商的任何地方運行。這個新工具是雲無關的,聚焦於在基礎設施內部部署和調度容器,而不是直接利用節點/主機。
K8S提供的一些平台特性是:
使用pod進行容器分組自愈自動調整DNS管理負載平衡變換或復原資源監控和日誌記錄
Kubernetes 架構
Kubernetes叢集由主節點和一組worker/從屬節點群組成。
Kubernetes的主節點群組成部分是:
安裝在Kubernetes節點中的組件是:
對於高可用和容錯的Kubernetes生產和部署,需要多個主節點和一個單獨的etcd叢集。如果運行了三個API伺服器,則需要一個網路Server Load Balancer器來正確地將負載分配到伺服器。唯一剩下的問題是需要三個角色來管理控制器管理器和調度器以維護叢集狀態和分配節點。為了更高效、更可靠地執行它,只有一個參與者應該執行實際的更改,但是在機器宕機的情況下仍然需要其他執行個體。為瞭解決這個問題,我們可以在API中使用lease-lock 來執行主選,而使用它的標誌是leader- elect。
Kubernetes通過以下任一種方式實現從Pod到Pod的連網:
1)第2層(切換解決方案)2)第3層(橋接解決方案)3) overlay解決方案(weave andflannel)
它們允許在叢集中進行Pod和Pod之間的通訊,並為每個Pod提供唯一的IP地址。
Kubernetes關鍵特性
Pod: Collection of Containers容器集
pod是K8S中的一個部署單元,它有一個單獨的IP地址。在它內部,Pause容器通過持有一個網路的名稱空間、連接埠和ip地址來處理網路,而這個地址又被pod中的所有容器使用。
ReplicationController
ReplicationController確保在給定的時間內啟動和運行所需的容器數量。Pod模板用於定義容器鏡像標識符、連接埠和標籤。使用liveness probes,它可以自動治癒pods,並按照期望的狀態維持pods數量。也可以通過使用kubectl來手動控制副本計數。
儲存管理
Pods本質是短暫的——任何儲存在pod或容器中的資訊都會丟失。為了儲存資料,一個持久的系統是必需的,即使在一個pod被殺死或重新調度之後,如Amazon Elastic Block Storage (EBS),GoogleGCE PD,或一個Distributed File System,如網路檔案系統(NFS)或Gluster檔案系統(GFS)。
資源監控
監控是成功運行基礎設施的關鍵之一,它是可靠性等級的基礎。Heapster是一個從kubelet收集指標的外掛程式,與cAdvisor整合。cAdvisor用於收集與運行容器的CPU、記憶體、I/O和網路統計資料相關的指標。由Heapster收集的資料存放區在influx DB中,並使用Grafana在UI中顯示。還有其他可使用的接收器,如Kafka或Elastic Search,可以用於儲存資料並顯示在使用者介面中。
健全狀態檢查
kubernetes的健全狀態檢查由kubelet代理完成。它分為liveness 和 readiness probes兩種。
處理常式主要有三種類型:
ExecAction:執行Shell命令,如果產生的結束代碼為0,則意味著執行個體是健康的。在任何其他情況下,執行個體不健康。TCPAction: Kubelet將嘗試串連到指定的連接埠,如果它建立到給定socket的串連,診斷成功。HTTPGetAction:基於應用程式公開的HTTP端點,kubelet對指定路徑上的容器IP地址執行HTTP GET請求,如果返回200到300個響應代碼,診斷就成功了。
每個probe通常有三個結果:
成功:容器通過診斷。失敗:容器未通過診斷。未知:診斷失敗,不要採取任何行動。
水平自動調整功能
自動調整使用基於負載的計算資源。K8S scale pod自動使用Horizontal Pod Autoscaler對象,從Heapster擷取度量資料,並相應地減少或增加pod的數量。例如,如果自動調整是基於記憶體利用率,那麼控制器就會開始在pod中觀察記憶體使用量情況,並根據容量對該副本計數進行擴充。
服務發現
Kubernetes pods是短暫的,ReplicationController 在任何節點上動態建立它們,因此在叢集中探索服務是一個挑戰。服務需要發現一個IP地址和動態連接埠,以便在叢集中進行通訊。
有兩種主要的方法來找到它——環境變數(Environment variables)和DNS。
更可取的是基於DNS的服務發現,它可以作為叢集附加組件使用。跟蹤叢集中的新服務,並為每個服務建立一組DNS記錄。
網路
要完全管理叢集,必須正確設定網路,並解決三個網路問題:
1.容器到容器的通訊:pods通過本地主機通訊,並使用Pause容器網路名稱空間,解決這個問題。2.Pod-to-Pod通訊:由軟體定義網路解決,如上面架構圖所示。3.外部到pod通訊:由服務覆蓋。
Kubernetes提供了廣泛的網路選擇。現在還支援容器網路介面(CNI)外掛程式,這是容器的通用外掛程式架構。目前支援多種編排工具,如Kubernetes、Mesos和CloudFoundry。
有各種覆蓋外掛程式:
1.Flannel來自CoreOS,是一個非常簡單的etcd後端覆蓋網路。它建立了另一個虛擬、可路由的IP / Pod網路,運行在底層網路之上;ergo,稱為覆蓋網路。在這個覆蓋網路中,每個Pod將被分配一個IP地址,並且會直接使用它們的IP進行通訊。2.Weave通過CNI外掛程式提供與Kubernetes相容的覆蓋網路。
服務
Kubernetes服務是一種抽象,它將通訊路由到一組pod,以提供一個微服務。Kube-proxy在每個節點上運行,並通過設定一組iptable規則來管理服務。
設立服務的模式有三種:
1.ClusterIP(只提供內部訪問)2.NodePort(需要在連接埠上開啟防火牆;不建議公開訪問)3.負載平衡器(由AWS或GKE等公用雲端供應商擁有)
ConfigMap和Secret
ConfigMap使注入基於環境的配置成為可能,同時使容器鏡像在多個環境中保持一致。這些可以通過安裝卷或環境變數(environment variables)來注入,並將這些值儲存在key/value格式中。
Secrets用於儲存敏感性資料,如密碼、OAuth令牌等。
滾動部署和復原
部署對象持有一個或多個複本集,以支援復原機制。換句話說,每次更改部署配置時都會建立一個新的複本集,並保留以前的版本,以便有復原選項。只有一個複本集將在特定時間處於活動狀態。
對於滾動部署,需要的策略類型是RollingUpdate和minReadySecs,它指定應用程式為服務流量所花費的時間。如果在應用程式pod還沒有準備好時,將其保持預設狀態,它將不可用。這個動作可以通過以下命令來完成:
或者,
通過替換部署yaml檔案中的內容並運行以下命令:
如果新版本不像預期的那樣,那麼可以通過運行以下命令復原到以前的版本:
如果所需版本是前一版本以外的版本,則運行:
Logging記錄
要監視應用程式的行為,必須檢查日誌——每個pod產生多個日誌。要開始在儀表板UI中搜尋日誌,必須有一些機制收集並將它們彙總到一個日誌查看器中。為了說明這一點,Fluentd是一個開源工具,也是CNCF的一部分,與 Elastic Search 和 Kibana 完美結合。
原文連結:
Kubernetes: Twelve Key Features
https://dzone.com/articles/kubernetes-twelve-key-features