Kubernetes 概述
官網::kubernetes.io/
kubernetes github:github.com/kubernetes/kubernetes
學習資料(語言可以自由切換):www.kubernetes.org.cn/k8s
kubernetes 有什麼由來?
最開始是谷歌公司內部使用的 Borg 系統,後面使用 Golang 重寫並捐獻給 CNCF 基金會開源了
kubernetes 重要的作用?
kubernetes 是一個開源的容器編排框架工具,有著極其豐富的生態資源
學習 kubernetes 的意義?
解決單機裸跑 docker 的若干痛點
為什麼 kubernetes 叫做 K8S ?
因為 k 到 s 之間 有 8個字母, 因此叫做 K8S
kubernetes 有什麼優勢?
- 可自動裝箱,可水平擴充套件,可自我修復
- 有服務發現和負載均衡
- 可集中化配置管理和祕鑰管理
- 可儲存編排
- 可任務批處理執行
- 可自動釋出和回滾 等等
此處的自動釋出預設是滾動釋出模式
自動釋出模式有如下 4 種:
- 藍綠髮布
- 滾動釋出 (kubernetes 預設釋出方式)
- 灰度釋出
- 金絲雀釋出
kubernetes 的四組概念
Pod 和 Pod 控制器
Pod 是 K8S 裡面的概念,
是 K8S 裡面能夠被執行的最小邏輯單元,也就是原子單元
1 個 Pod 裡面可以執行多個 docker 容器,多個 docker 容器是共享 UTS名稱空間,NE名稱空間T,IPC名稱空間的
K8S 裡面稱這種 1 個 Pod 裡面可以執行多個 docker 容器的模式叫做 邊車模式(SideCar)
這裡順便說一下 linux 裡面的 6 種名稱空間:
- UTS
主機名
- IPC
程式間通訊
- PID
chroot
程式樹
- NS
掛載點
- NET
網路訪問,包括介面
- USER
將本地的虛擬user-id
對映到真實的user-id
Pod 控制器是 Pod 啟動的一種模板,用來保證 K8S 裡面啟動的 Pod 能夠始終按照人們的預期執行,例如副本數,生命週期,健康狀態的檢查等等
K8S 裡面提供了多個 Pod 控制器,如下 6 種最為常見 Pod 控制器,具體使用的時候我們再詳細的說明其作用和原理:
- Deployment
部署,為無狀態服務而設計的,
- DaemonSet
DaemonSet保證在每個Node上都執行一個容器副本,常用來部署一些叢集的日誌、監控或者其他系統管理應用
- ReplicaSet
為無狀態服務而設計,簡稱為RC,是複本控制器,主要作用是確保 Pod 以我們指定的副本數執行
Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod
- StatefulSet
是為了解決有狀態服務的一系列問題
- Job
負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執行一次的任務,它保證批處理任務的一個或多個Pod成功結束
- CronJob
即定時任務,就類似於Linux系統的crontab,在指定的時間週期執行指定的任務
其中 Deployment 和 DaemonSet 最為核心
Name 和 Namespace
Name 就是名稱
在 K8S 裡面,是用資源
來定義每一種邏輯概念或者功能,每種資源就要有自己的名稱,名稱通常定義在資源
的後設資料
裡面
例如:
資源
的 api 版本- 類別 kind
- 後設資料 metadata
- 定義清單 spec
- 狀態 status 等配置檔案
Namespace 就是名稱空間
隨著專案,人員,叢集規模不斷擴張,我們就需要一種能隔離 K8S 內部資源的方法,就會使用名稱空間
我們可以理解名稱空間就是內部的一個虛擬組
不同的名稱空間裡面的資源名字可以相同,相同的名稱空間內的資源不能同名
K8S 裡面預設存在的名稱空間有:
- default
- kube-system
- kube-public
查詢 K8S 裡面特定的資源需要帶上相應的名稱空間
Lable 和 Label 選擇器
Lable 就是標籤
標籤是 K8S 特色的管理方式,便於分類管理資源物件,有如下幾個注意點:
- 標籤的組成是 key=value 的形式
- 標籤和資源是多對多的關係,一個標籤可以有多個資源,一個資源也可以有多個標籤
- 一個資源擁有多個標籤的時候,可以實現不同維度的管理
- 有一種形式叫做
註解
,他與標籤類似
根據官網的說明和解釋
標籤可以是 63 個字元以下,包含[a-z0-9A-Z],還可以包含-
,_
,.
Label 選擇器 就是可以對標籤進行過濾,進行管理
標籤選擇器目前有兩種:
- 基於等值關係(等於 或者 不等於)
- 基於集合關係(屬於 或者 不屬於)
許多的資源是支援內嵌標籤選擇器欄位的
- matchLabels
- matchExpressions
Service 和 Ingress
k8s 有三大網路:
- Node 節點網路
- Pod 容器網路
- service 叢集網路
K8S 面對一個問題,K8S 裡面的每個 Pod 都會分配一個單獨的 IP 地址,但是這個地址會隨著 Pod 的銷燬而消失
K8S 就有專門的 Service 服務來處理這個問題
一個 Service 服務可以看作一組提供相同服務的 Pod 對外訪問的介面
然而 Service 作用與哪些 Pod ,這是通過標籤選擇器來定義的
Ingress 就是 K8S 裡面網路模型下第 7 層的應用,他是對外暴露介面的
service 只能進行在第 4 層上面進行流量排程,我們們能夠看到的表現形式是 ip + port
Ingress 就比較強大,他可以排程不同業務域,還可以排程不同 URL 訪問路徑的業務流量
K8S 的組成
K8S 邏輯架構圖,該圖來源於網路
圖中涉及到的模組,下面會逐個提到
CLI 客戶端 1 個
- kubectl
核心附件有如下 4 個:
- CNI 網路外掛 - flanel /calico
- 服務發現外掛 - coredns
- 服務暴露外掛 - traefik
- GUI 管理外掛 - Dashboard
核心元件
配置儲存中心 使用的是 ETCD 服務
主控節點(master)有如下 3 個:
- kube-apiserver 服務
是整個 K8S 的大腦
他的作用非常強大,有如下 4 個主要的功能
1、提供叢集管理的 RESTFUL API 介面,這裡麵包括鑑權,資料校驗及叢集狀態變更等
2、負責其他模組之間的資料互動,承擔通訊樞紐的功能所有元件的互動都需要通過 apiserver
3、apiserver 是資源控制的入口
4、apiserver 提供完備的安全機制
- kube-controller-manager 服務
就是用來管理控制器的 , 它由一系列控制器組成,所有的控制器都依賴於 kube-controller-manager ,通過 apiserver 監控整個叢集的狀態,並確保他們都處於預期的工作,例如
1、Node 控制器
2、Deployment 控制器
3、service 控制器
4、Volume 控制器
5、Endpoint 控制器
6、Garbage 控制器
7、Namespace 控制器
8、Job 控制器
9、Resource quta 控制器 等等
- kube-schedule 服務
主要就是接收排程 Pod 到合適的節點上面,他有 2 個策略:
1、預算策略(predict)
2、優選策略(priorities)
運算節點有如下 2 個:
- kube-kubelet 服務
kubelet 主要就是定時從某處節點上獲取 Pod 的期望狀態,並呼叫對應的 docker 介面來達到這個狀態
此處的期望狀態有這些:
執行的容器,副本數量,網路如何配置,儲存如何配置等等
1、kubelet 會定時彙報當前節點的狀態給到 apiserver,用於之後排程使用
2、kubelet 還做映象和容器的清理工作,保證節點的映象不會佔滿磁碟空間
- kube-proxy 服務
kube-proxy 就是一個 K8S 上執行網路的代理,service 服務資源的載體
1、kube-proxy 可以建立 Pod 網路和叢集網路的關係 (clusterip -> podip)
2、kube-proxy 負責建立、刪除和更新排程規則,通知 apiserver 自身更新,或者從 apiserver 獲取排程規則,更新 kube-proxy 自身
kube-proxy 常用的三種流量排程模式:
- Userspace
- Iptables
- Ipvs
K8S 叢集網路圖示例
一般主控節點可以揉在一起部署,主控節點和 Pod 節點,邏輯上是分開的,物理上實際上是可以部署在一起,主控節點一般部署 2 個
例如可以這樣高可用部署,
etcd 一般部署奇數個,例如1、3、5、7等等,因為其中一個 etcd 掛了,會通過選舉投票的方式來選舉下一個 etcd 作為主,若部署的是偶數個 etcd 就無法選舉出結果
其中 Proxy 代理 四層網路和七層網路,分別主要是代理 apiserver 和 ingress 應用
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支援和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這裡
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~
本作品採用《CC 協議》,轉載必須註明作者和本文連結