【K8S 系列】k8s 學習一,Kubernetes 基本介紹及核心組件
Kubernetes 概述
kubernetes github:https://github.com/kubernetes/kubernetes
學習資料(語言可以自由切換):https://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 應用
參考資料:
歡迎點贊,關注,收藏
朋友們,你的支持和鼓勵,是我堅持分享,提高質量的動力
好了,本次就到這里
技術是開放的,我們的心態,更應是開放的。擁抱變化,向陽而生,努力向前行。
我是小魔童哪吒,歡迎點贊關注收藏,下次見~