1. 程式人生 > >Kubernetes初步認識(一)

Kubernetes初步認識(一)

manager 服務 相同 上進 節點 ref 能夠 value 執行過程

本文源鏈接地址:https://www.93bok.com

前言

建議先把理論看過一遍,弄明白一些東西,再進行實踐,由淺到深的學習,如果直接一頭紮進去,學習K8s可能會比較困難一些

一、Kubernetes官網

官網:https://kubernetes.io/
中文社區:https://www.kubernetes.org.cn/
中文文檔:https://www.kubernetes.org.cn/k8s

二、Kubernetes概述

1、概述

Kubernetes最初源於谷歌內部的Borg,提供了面向應用的容器集群部署和管理系統。Kubernetes的目標旨在消除編排物理/虛擬計算,網絡和存儲基礎設施的負擔,並使應用程序運營商和開發人員完全將重點放在以容器為中心的原語上進行自助運營。Kubernetes 也提供穩定、兼容的基礎(平臺),用於構建定制化的workflows 和更高級的自動化任務。 Kubernetes 具備完善的集群管理能力,包括多層次的安全防護和準入機制、多租戶應用支撐能力、透明的服務註冊和服務發現機制、內建負載均衡器、故障發現和自我修復能力、服務滾動升級和在線擴容、可擴展的資源自動調度機制、多粒度的資源配額管理能力。 Kubernetes 還提供完善的管理工具,涵蓋開發、部署測試、運維監控等各個環節。

2、簡單點來說

Kubernetes 是 Google開源的容器集群管理系統,基於 Docker構建一個容器的調度服務,提供資源調度、均衡容災、服務註冊、動態擴縮容等功能套件。 基於容器的雲平臺,簡寫成K8s

3、官方介紹

Kubernetes是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful),Kubernetes提供了應用部署,規劃,更新,維護的一種機制。

Kubernetes一個核心的特點就是能夠自主的管理容器來保證雲平臺中的容器按照用戶的期望狀態運行著(比如用戶想讓apache一直運行,用戶不需要關心怎麽去做,Kubernetes會自動去監控,然後去重啟,新建,總之,讓apache一直提供服務),管理員可以加載一個微型服務,讓規劃器來找到合適的位置,同時,Kubernetes也系統提升工具以及人性化方面,讓用戶能夠方便的部署自己的應用(就像canary deployments)。

現在Kubernetes著重於不間斷的服務狀態(比如web服務器或者緩存服務器)和原生雲平臺應用(Nosql),在不久的將來會支持各種生產雲平臺中的各種服務,例如,分批,工作流,以及傳統數據庫。

在Kubenetes中,所有的容器均在Pod中運行,一個Pod可以承載一個或者多個相關的容器,在後邊的案例中,同一個Pod中的容器會部署在同一個物理機器上並且能夠共享資源。一個Pod也可以包含0個或者多個磁盤卷組(volumes),這些卷組將會以目錄的形式提供給一個容器,或者被所有Pod中的容器共享,對於用戶創建的每個Pod,系統會自動選擇那個健康並且有足夠容量的機器,然後創建類似容器的容器,當容器創建失敗的時候,容器會被node agent自動的重啟,這個node agent叫kubelet,但是,如果是Pod失敗或者機器,它不會自動的轉移並且啟動,除非用戶定義了 replication controller。

用戶可以自己創建並管理Pod,Kubernetes將這些操作簡化為兩個操作:基於相同的Pod配置文件部署多個Pod復制品;創建可替代的Pod當一個Pod掛了或者機器掛了的時候。而Kubernetes API中負責來重新啟動,遷移等行為的部分叫做“replication controller”,它根據一個模板生成了一個Pod,然後系統就根據用戶的需求創建了許多冗余,這些冗余的Pod組成了一個整個應用,或者服務,或者服務中的一層。一旦一個Pod被創建,系統就會不停的監控Pod的健康情況以及Pod所在主機的健康情況,如果這個Pod因為軟件原因掛掉了或者所在的機器掛掉了,replication controller 會自動在一個健康的機器上創建一個一摸一樣的Pod,來維持原來的Pod冗余狀態不變,一個應用的多個Pod可以共享一個機器。

我們經常需要選中一組Pod,例如,我們要限制一組Pod的某些操作,或者查詢某組Pod的狀態,作為Kubernetes的基本機制,用戶可以給Kubernetes Api中的任何對象貼上一組 key:value的標簽,然後,我們就可以通過標簽來選擇一組相關的Kubernetes Api 對象,然後去執行一些特定的操作,每個資源額外擁有一組(很多) keys 和 values,然後外部的工具可以使用這些keys和vlues值進行對象的檢索,這些Map叫做annotations(註釋)。

Kubernetes支持一種特殊的網絡模型,Kubernetes創建了一個地址空間,並且不動態的分配端口,它可以允許用戶選擇任何想使用的端口,為了實現這個功能,它為每個Pod分配IP地址。

現代互聯網應用一般都會包含多層服務構成,比如web前臺空間與用來存儲鍵值對的內存服務器以及對應的存儲服務,為了更好的服務於這樣的架構,Kubernetes提供了服務的抽象,並提供了固定的IP地址和DNS名稱,而這些與一系列Pod進行動態關聯,這些都通過之前提到的標簽進行關聯,所以我們可以關聯任何我們想關聯的Pod,當一個Pod中的容器訪問這個地址的時候,這個請求會被轉發到本地代理(kube proxy),每臺機器上均有一個本地代理,然後被轉發到相應的後端容器。Kubernetes通過一種輪訓機制選擇相應的後端容器,這些動態的Pod被替換的時候,Kube proxy時刻追蹤著,所以,服務的 IP地址(dns名稱),從來不變。

所有Kubernetes中的資源,比如Pod,都通過一個叫URI的東西來區分,這個URI有一個UID,URI的重要組成部分是:對象的類型(比如pod),對象的名字,對象的命名空間,對於特殊的對象類型,在同一個命名空間內,所有的名字都是不同的,在對象只提供名稱,不提供命名空間的情況下,這種情況是假定是默認的命名空間。UID是時間和空間上的唯一。

三、Kubernetes架構圖

技術分享圖片

我們來大概分析一下這張架構圖

首先先分解一下這張圖,我分為5部分:

1、kubectl這部分,這是K8s平臺的管理命令,代表我們的K8s管理員
2、Internet+Firewall部分,這部分代表我們的用戶、客戶端
3、Master部分,左下角的這部分,K8s的管理節點,管理節點一般包括etcd、API Server、controller-manager、scheduler等核心組件,而etcd組件相當於整個平臺的數據庫,一般我們會單臺服務器部署etcd並做好集群,而不是和Master放在同一臺服務器上
4、Node右上部分,真正運行容器container的物理機,K8s中需要很多Node機器來提供運算。Node節點一般包含了kubelet、Proxy、Container runtime、Pod、container等核心組件。
5、Node右下部分,和4一樣

總結: 各組件之間的關系

1、Kubernetes的架構由一個master和多個node組成,master通過api提供服務,接受kubectl 的請求來調度管理整個集群。kubectl:是k8s平臺的一個管理命令。 
2、Replication controller定義了多個pod或者容器需要運行,如果當前集群中運行的pod或容器達不到配置的數量,replication controller會調度容器在多個node上運行,保證集群中的pod數量。
3、service則定義真實對外提供的服務,一個service會對應後端運行的多個container。
4、Kubernetes是個管理平臺,node上的proxy擁有提供真實服務的公網IP。客戶端訪問kubernetes中提供的服務,是直接訪問到kube-proxy上的。
5、在Kubernetes中pod是一個基本單元,一個pod可以是提供相同功能的多個container,這些容器會被部署在同一個node上。node是運行Kubelet中容器的物理機。node接受master的指令創建pod或者容器。

四、Kubernetes核心組件

Kubernetes主要由以下幾個核心組件組成:

1、etcd保存了整個集群的狀態;
2、apiserver提供了資源操作的唯一入口,並提供認證、授權、訪問控制、API註冊和發現等機制;
3、controller manager負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等;
4、scheduler負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上;
5、kubelet負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;
6、Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI);
7、kube-proxy負責為Service提供cluster內部的服務發現和負載均衡;

除了核心組件,還有一些推薦的Add-ons:

1、kube-dns負責為整個集群提供DNS服務
2、Ingress Controller為服務提供外網入口
3、Heapster提供資源監控
4、Dashboard提供GUI
5、Federation提供跨可用區的集群
6、Fluentd-elasticsearch提供集群日誌采集、存儲與查詢

五、各組件詳細說明

1、 kubectl

k8s平臺的一個管理命令,管理員通過該命令來管理平臺

2、master

k8s管理節點,是集群的控制節點,負責整個集群的管理和控制。管理員通過kubectl發送的所有控制命令都發給master,它負責具體的執行過程。如果master宕機或不可用,那麽集群內容器的管理都將失效

3、API Server

提供了資源操作的唯一入口(接口服務),並提供認證、授權、訪問控制、API註冊和發現等機制。API Server負責和etcd交互(其它組件不會直接操作etcd,只有API Server這麽做),整個集群的所有交互都以API Server為核心,比如:

所有模塊之間並不會互相調用,而是通過和API Server打交道來完成自己那部分的工作、API Server提供的驗證和授權保證了整個集群的安全 
4、controller manager

負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等

5、scheduler

負責資源的調度,按照預定的調度策略將Pod調度到相應的機器上

6、etcd

etcd存儲kubernetes的配置信息,可以理解為是k8s的數據庫,存儲著k8s容器雲平臺中所有節點、pods、網絡等信息

7、kubelet

負責維護容器的生命周期,同時也負責Volume(CVI)和網絡(CNI)的管理;

8、kube-proxy

負責為Service提供cluster內部的服務發現和負載均衡

9、Container runtime

負責鏡像管理以及Pod和容器的真正運行(CRI)

10、Pod

Pod是在K8s集群中運行部署應用或服務的最小單元,它是可以支持多容器的。Pod的設計理念是支持多個容器在一個Pod中共享網絡地址和文件系統,可以通過進程間通信和文件共享這種簡單高效的方式組合完成服務。Pod對多容器的支持是K8s最基礎的設計理念。

11、container

容器,運行我們的服務和程序

Kubernetes初步認識(一)