【百度雲原生導讀】在上一節課咱們學習了 Docker 的相關基礎知識,解決了應用之間的隔離機制。可是在架構上,Docker仍然是一個單機的引擎,在真實的生產環境中咱們可能擁有着海量的機器,那麼如何管理、調度、編排這些分佈在不一樣機器上的容器就成爲了新的問題。所以,Kubernetes 就應運而生了。git
本文是基於『雲原生基礎知識概述及實踐』系列視頻課程——『Kubernetes 入門—Kubernetes工做原理及使用』進行的文字梳理,視頻課程可點擊【閱讀原文】進行學習。算法
Kubernetes 的前身實際上是 Google 的 Ball,2013年開源以後發展至今,已成爲了開源事件部署引擎的事實標準。數組
本節課主要分爲如下三大部分:緩存
第一部分:Kubernetes 架構剖析服務器
對 Kubernetes 核心組件分析。架構
第二部分:快速搭建 Kubernetes 集羣app
使用 Kubeadm 搭建 Kubernetes 環境。運維
第三部分:Demoide
演示如何操做一個 Pod。工具
1. Kubernetes 核心組件分析
1.1 核心概念:Pod
-
Pod 是 Kubernetes 中最小的可部署的計算單元
-
這樣的一組容器被「打包」到一塊兒組成了一個Pod 並接受 Kubernetes 的調度,編排等控制邏輯。
-
爲了讓你們更好的理解「一組容器「的概念,接下來爲你們詳細剖析 Pod 的內部架構。
Pod 的內部架構
藍色部分表明的是整個 Pod。其中右上角的net namespace 是 Pod 級別的 namespace,它表明了 Pod 中的全部容器。
圖中有4個 Container(即:PauseContainer/Container A/Container B/Container C/),他們在建立的時候都被加入到了 namespace 當中。
那麼,Pod 級別的 Container 是從哪裏來的呢?從圖中能夠看到,真正工做的 Container 咱們把它標註爲 A,B,C。Pause Container 的做用至關於一個佔位符。當咱們建立 Pod 的時候,會首先建立一個 Pause Container。該容器建立出來的namespace,就至關於整個 Pod 的 namespace。而後後面的容器再建立出來(好比說Container A/B/C)這些容器在建立出來的時候,就都會選擇加入到 Pause Container 建立出來的 net namespace 當中。
固然,也不是全部的 namespace 都是不隔離的。Container 左側是一個 image,每個 container 都有一個鏡像,每個鏡像又至關於一個容器的 Root ffs。既然每一個容器的 Root ffs 是不相同的,那麼顯而易見,mnt namespace 就是隔離的。
這樣咱們就能夠清楚地看到,哪些 namespce 在 Pod 當中是互相隔離的,而哪些是在 Pod 級別當中共享的。
Pod 在 Kubernetes 中的展示形式
一般,咱們習慣用 Yaml 來描述 Kubernetes 裏的資源。Yaml 中的內容其實就是咱們對資源參數的描述。
咱們先看 Pod 在 Yaml 中的前四行。這四行是資源在 Yaml 中的通用字段。ApiVersion/kind 用於表示 Kubernetes 的資源類型是什麼。經過 metadata 來聲明資源的源數據。Spec 字段和資源類型是強相關的了。不一樣的資源會有不一樣的 spec 定義。那在 Pod 資源當中,最核心的是關於容器的定義了。
下面幾行,關於容器的定義,是一個數組類型的,這也符合咱們對 Pod 的定義:即它是由一組容器造成的。這些字段包含:聲明容器鏡像,啓動容器的命令,容器鏡像的拉取方式,以及容器的名稱。
1.2 核心概念 Kubelet
Kubelet 是 Kubernetes 集羣的「節點代理」。也能夠說是 Kubernetes 部署在每一個節點的agent。
Kubelet 啓動後會向 Kubernetes 集羣註冊本身,並上報節點的相關信息。此時在 Kubernetes 集羣中就增長了一臺新的可用的 Node 節點(多是一個物理機,也多是一個虛擬機,甚至是一個容器)。
Kubelet 發現有屬於本身節點的 Pod 符合建立條件後,會按照Pod聲明的配置去啓動容器。
1.3 Kubernetes 控制面的相關組件
上面這張圖分爲3個部分做介紹:
1. 下半部分:也就是以前介紹過的Kubelet/Pod。
2. 左上角:Kubectl。也就是Kubernetes 的命令行工具。能夠經過Kubectl來提交資源的Yaml 給Kubernetes 集羣。也能夠進行一系列的運維操做。
3. 右面:Master 節點。也就是Kubernetes 控制面的相關組件了。其中,API Sever是Kubernetes 中全部源數據的集成入口。也是整個Kubernetes 集羣的中樞組件。其餘組件(包括Controller, Scheduler等)在獲取數據都須要和API Sever 打交道。API Sever 也會接受這些組件的協入請求,並最終將數據寫入ETCD 當中。同時,API Sever 也會緩存全部的源數據。當其餘組件發起「讀」請求時,就會將數據直接從內存中發給對方。儘可能避免ETCD 成爲系統的瓶頸。除了源數據存儲功能,API Server 還提供了一個Watch 機制。可以主動推送某種資源的變化。而Scheduler會向API Sever 註冊而且監聽Pod 的資源變動事件。Scheduler 總體的調度邏輯能夠簡化並歸納爲兩個:過濾、打分。
每次對Pod進行調度的時候,首先將不符合條件的Node(如:機器上已經沒有資源了,不符合某些標籤,選擇器的要求等)過濾掉。過濾完成後咱們獲得一個符合要求的Node列表,Scheduler 會經過打分算法,來計算每個Node 的分數。最終選擇一個得分最高的節點作爲Pod 須要綁定的節點。最終Scheduler 會將結果回寫到API Sever 當中。
編排組件:Controller。Controller 經過幾種固定的workload。經過控制器的方式,來完成運行時服務器的編排工做。
2. 快速搭建 Kubernetes 集羣
2.1 搭建工具:Kubeadm 簡介
Kubeadm 是 Kubernetes 官方提供的用於快速安裝 Kubernetes 集羣的工具。
下圖是 Kubeadm 的配置文件
在配置文件當中,咱們指定了 dns 的類型,ETCD 存儲目錄以及要建立的 Kubernetes 的版本以及相關的參數。
2.2 搭建環境
初始 Master 節點
Kubeadm init—config kubeadm.conf
安裝 flannel cni
https://raw.githusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml
3. Demo:演示如何操做一個 Pod
建立一個 Namespace
Kubectl create namespace demo
建立 Pod
Kubectl apply –f pod.yaml
查看 Pod 運行狀態
Kubectl describe pods demo-pod–n demo
查看 Pod 輸出日誌
Kubectl logs demo-pod –n demo
查看 Pods 列表
Kubectl get pods-n demo
刪除 Pod
Kubectl delete-f pod.yaml
(建立Deomo的詳細過程歡迎你們觀看課程的視頻回放。)
MoreCommand
Basic Commands: create,expose, run, setBasic Commands: explain, get,edit,deleteDeploy Commands: rollout,scale,autoscale
4. 總結
本節課做爲雲原生入門系列課程第二節。重點介紹了 Kubernetes 出現的背景和做用、Kubernetes 的特色和核心架構、Kubernetes 每個模塊承擔的做用以及實現的功能。並演示瞭如何搭建一個單節點的 Kubernetes 環境以及如何使用來操做相關的資源,但願對你們有所幫助。
視頻課程:https://www.bilibili.com/video/BV17o4y1R77k
免費領小度智能屏!暖春福利進行ing