【K8S 系列】k8s 學(xué)習(xí)一波岛,Kubernetes 基本介紹及核心組件
Kubernetes 概述
官網(wǎng)::https://kubernetes.io/
kubernetes github:https://github.com/kubernetes/kubernetes
學(xué)習(xí)資料(語言可以自由切換):https://www.kubernetes.org.cn/k8s
kubernetes 有什么由來荐健?
最開始是谷歌公司內(nèi)部使用的 Borg 系統(tǒng)暖璧,后面使用 Golang 重寫并捐獻(xiàn)給 CNCF 基金會(huì)開源了
kubernetes 重要的作用案怯?
kubernetes 是一個(gè)開源的容器編排框架工具,有著極其豐富的生態(tài)資源
學(xué)習(xí) kubernetes 的意義澎办?
解決單機(jī)裸跑 docker 的若干痛點(diǎn)
為什么 kubernetes 叫做 K8S 嘲碱?
因?yàn)?k 到 s 之間 有 8個(gè)字母, 因此叫做 K8S
kubernetes 有什么優(yōu)勢局蚀?
- 可自動(dòng)裝箱麦锯,可水平擴(kuò)展,可自我修復(fù)
- 有服務(wù)發(fā)現(xiàn)和負(fù)載均衡
- 可集中化配置管理和秘鑰管理
- 可存儲(chǔ)編排
- 可任務(wù)批處理運(yùn)行
- 可自動(dòng)發(fā)布和回滾 等等
此處的自動(dòng)發(fā)布默認(rèn)是滾動(dòng)發(fā)布模式
自動(dòng)發(fā)布模式有如下 4 種:
- 藍(lán)綠發(fā)布
- 滾動(dòng)發(fā)布 (kubernetes 默認(rèn)發(fā)布方式)
- 灰度發(fā)布
- 金絲雀發(fā)布
kubernetes 的四組概念
Pod 和 Pod 控制器
Pod 是 K8S 里面的概念琅绅,
是 K8S 里面能夠被運(yùn)行的最小邏輯單元扶欣,也就是原子單元
1 個(gè) Pod 里面可以運(yùn)行多個(gè) docker 容器,多個(gè) docker 容器是共享 UTS命名空間千扶,NE命名空間T料祠,IPC命名空間的
K8S 里面稱這種 1 個(gè) Pod 里面可以運(yùn)行多個(gè) docker 容器的模式叫做 邊車模式(SideCar)
這里順便說一下 linux 里面的 6 種命名空間:
- UTS
主機(jī)名
- IPC
進(jìn)程間通信
- PID
chroot
進(jìn)程樹
- NS
掛載點(diǎn)
- NET
網(wǎng)絡(luò)訪問,包括接口
- USER
將本地的虛擬user-id
映射到真實(shí)的user-id
Pod 控制器是 Pod 啟動(dòng)的一種模板澎羞,用來保證 K8S 里面啟動(dòng)的 Pod 能夠始終按照人們的預(yù)期運(yùn)行髓绽,例如副本數(shù),生命周期妆绞,健康狀態(tài)的檢查等等
K8S 里面提供了多個(gè) Pod 控制器顺呕,如下 6 種最為常見 Pod 控制器,具體使用的時(shí)候我們再詳細(xì)的說明其作用和原理:
- Deployment
部署括饶,為無狀態(tài)服務(wù)而設(shè)計(jì)的株茶,
- DaemonSet
DaemonSet保證在每個(gè)Node上都運(yùn)行一個(gè)容器副本,常用來部署一些集群的日志巷帝、監(jiān)控或者其他系統(tǒng)管理應(yīng)用
- ReplicaSet
為無狀態(tài)服務(wù)而設(shè)計(jì)忌卤,簡稱為RC,是復(fù)本控制器楞泼,主要作用是確保 Pod 以我們指定的副本數(shù)運(yùn)行
Deployment 控制 ReplicaSet驰徊,ReplicaSet 控制 Pod
- StatefulSet
是為了解決有狀態(tài)服務(wù)的一系列問題
- Job
負(fù)責(zé)批量處理短暫的一次性任務(wù) (short lived one-off tasks),即僅執(zhí)行一次的任務(wù)堕阔,它保證批處理任務(wù)的一個(gè)或多個(gè)Pod成功結(jié)束
- CronJob
即定時(shí)任務(wù)棍厂,就類似于Linux系統(tǒng)的crontab,在指定的時(shí)間周期運(yùn)行指定的任務(wù)
其中 Deployment 和 DaemonSet 最為核心
Name 和 Namespace
Name 就是名稱
在 K8S 里面超陆,是用資源
來定義每一種邏輯概念或者功能牺弹,每種資源就要有自己的名稱浦马,名稱通常定義在資源
的元數(shù)據(jù)
里面
例如:
-
資源
的 api 版本 - 類別 kind
- 元數(shù)據(jù) metadata
- 定義清單 spec
- 狀態(tài) status 等配置文件
Namespace 就是命名空間
隨著項(xiàng)目,人員张漂,集群規(guī)模不斷擴(kuò)張晶默,我們就需要一種能隔離 K8S 內(nèi)部資源的方法,就會(huì)使用命名空間
我們可以理解命名空間就是內(nèi)部的一個(gè)虛擬組
不同的命名空間里面的資源名字可以相同航攒,相同的命名空間內(nèi)的資源不能同名
-
K8S 里面默認(rèn)存在的命名空間有:
- default
- kube-system
- kube-public
查詢 K8S 里面特定的資源需要帶上相應(yīng)的命名空間
Lable 和 Label 選擇器
Lable 就是標(biāo)簽
標(biāo)簽是 K8S 特色的管理方式磺陡,便于分類管理資源對(duì)象,有如下幾個(gè)注意點(diǎn):
- 標(biāo)簽的組成是 key=value 的形式
- 標(biāo)簽和資源是多對(duì)多的關(guān)系漠畜,一個(gè)標(biāo)簽可以有多個(gè)資源币他,一個(gè)資源也可以有多個(gè)標(biāo)簽
- 一個(gè)資源擁有多個(gè)標(biāo)簽的時(shí)候,可以實(shí)現(xiàn)不同維度的管理
- 有一種形式叫做
注解
憔狞,他與標(biāo)簽類似
根據(jù)官網(wǎng)的說明和解釋
標(biāo)簽可以是 63 個(gè)字符以下蝴悉,包含[a-z0-9A-Z],還可以包含-
瘾敢,_
拍冠,.
Label 選擇器 就是可以對(duì)標(biāo)簽進(jìn)行過濾,進(jìn)行管理
標(biāo)簽選擇器目前有兩種:
- 基于等值關(guān)系(等于 或者 不等于)
- 基于集合關(guān)系(屬于 或者 不屬于)
許多的資源是支持內(nèi)嵌標(biāo)簽選擇器字段的
- matchLabels
- matchExpressions
Service 和 Ingress
k8s 有三大網(wǎng)絡(luò):
- Node 節(jié)點(diǎn)網(wǎng)絡(luò)
- Pod 容器網(wǎng)絡(luò)
- service 集群網(wǎng)絡(luò)
K8S 面對(duì)一個(gè)問題廉丽,K8S 里面的每個(gè) Pod 都會(huì)分配一個(gè)單獨(dú)的 IP 地址倦微,但是這個(gè)地址會(huì)隨著 Pod 的銷毀而消失
K8S 就有專門的 Service 服務(wù)來處理這個(gè)問題
一個(gè) Service 服務(wù)可以看作一組提供相同服務(wù)的 Pod 對(duì)外訪問的接口
然而 Service 作用與哪些 Pod ,這是通過標(biāo)簽選擇器來定義的
Ingress 就是 K8S 里面網(wǎng)絡(luò)模型下第 7 層的應(yīng)用正压,他是對(duì)外暴露接口的
service 只能進(jìn)行在第 4 層上面進(jìn)行流量調(diào)度欣福,咱們能夠看到的表現(xiàn)形式是 ip + port
Ingress 就比較強(qiáng)大,他可以調(diào)度不同業(yè)務(wù)域焦履,還可以調(diào)度不同 URL 訪問路徑的業(yè)務(wù)流量
K8S 的組成
K8S 邏輯架構(gòu)圖拓劝,該圖來源于網(wǎng)絡(luò)
圖中涉及到的模塊,下面會(huì)逐個(gè)提到
CLI 客戶端 1 個(gè)
- kubectl
核心附件有如下 4 個(gè):
- CNI 網(wǎng)絡(luò)插件 - flanel /calico
- 服務(wù)發(fā)現(xiàn)插件 - coredns
- 服務(wù)暴露插件 - traefik
- GUI 管理插件 - Dashboard
核心組件
配置存儲(chǔ)中心 使用的是 ETCD 服務(wù)
主控節(jié)點(diǎn)(master)有如下 3 個(gè):
- kube-apiserver 服務(wù)
是整個(gè) K8S 的大腦
他的作用非常強(qiáng)大嘉裤,有如下 4 個(gè)主要的功能
1郑临、提供集群管理的 RESTFUL API 接口,這里面包括鑒權(quán)屑宠,數(shù)據(jù)校驗(yàn)及集群狀態(tài)變更等
2厢洞、負(fù)責(zé)其他模塊之間的數(shù)據(jù)交互,承擔(dān)通信樞紐的功能所有組件的交互都需要通過 apiserver
3典奉、apiserver 是資源控制的入口
4躺翻、apiserver 提供完備的安全機(jī)制
- kube-controller-manager 服務(wù)
就是用來管理控制器的 , 它由一系列控制器組成卫玖,所有的控制器都依賴于 kube-controller-manager 公你,通過 apiserver 監(jiān)控整個(gè)集群的狀態(tài),并確保他們都處于預(yù)期的工作假瞬,例如
1陕靠、Node 控制器
2迂尝、Deployment 控制器
3、service 控制器
4剪芥、Volume 控制器
5垄开、Endpoint 控制器
6、Garbage 控制器
7粗俱、Namespace 控制器
8说榆、Job 控制器
9、Resource quta 控制器 等等
- kube-schedule 服務(wù)
主要就是接收調(diào)度 Pod 到合適的節(jié)點(diǎn)上面寸认,他有 2 個(gè)策略:
1、預(yù)算策略(predict)
2串慰、優(yōu)選策略(priorities)
運(yùn)算節(jié)點(diǎn)有如下 2 個(gè):
- kube-kubelet 服務(wù)
kubelet 主要就是定時(shí)從某處節(jié)點(diǎn)上獲取 Pod 的期望狀態(tài)偏塞,并調(diào)用對(duì)應(yīng)的 docker 接口來達(dá)到這個(gè)狀態(tài)
此處的期望狀態(tài)有這些:
運(yùn)行的容器,副本數(shù)量邦鲫,網(wǎng)絡(luò)如何配置灸叼,存儲(chǔ)如何配置等等
1、kubelet 會(huì)定時(shí)匯報(bào)當(dāng)前節(jié)點(diǎn)的狀態(tài)給到 apiserver庆捺,用于之后調(diào)度使用
2古今、kubelet 還做鏡像和容器的清理工作,保證節(jié)點(diǎn)的鏡像不會(huì)占滿磁盤空間
- kube-proxy 服務(wù)
kube-proxy 就是一個(gè) K8S 上運(yùn)行網(wǎng)絡(luò)的代理滔以,service 服務(wù)資源的載體
1捉腥、kube-proxy 可以建立 Pod 網(wǎng)絡(luò)和集群網(wǎng)絡(luò)的關(guān)系 (clusterip -> podip)
2、kube-proxy 負(fù)責(zé)建立你画、刪除和更新調(diào)度規(guī)則抵碟,通知 apiserver 自身更新,或者從 apiserver 獲取調(diào)度規(guī)則坏匪,更新 kube-proxy 自身
kube-proxy 常用的三種流量調(diào)度模式:
- Userspace
- Iptables
- Ipvs
K8S 集群網(wǎng)絡(luò)圖示例
一般主控節(jié)點(diǎn)可以揉在一起部署拟逮,主控節(jié)點(diǎn)和 Pod 節(jié)點(diǎn),邏輯上是分開的适滓,物理上實(shí)際上是可以部署在一起敦迄,主控節(jié)點(diǎn)一般部署 2 個(gè)
例如可以這樣高可用部署,
etcd 一般部署奇數(shù)個(gè)凭迹,例如1罚屋、3、5蕊苗、7等等沿后,因?yàn)槠渲幸粋€(gè) etcd 掛了,會(huì)通過選舉投票的方式來選舉下一個(gè) etcd 作為主朽砰,若部署的是偶數(shù)個(gè) etcd 就無法選舉出結(jié)果
其中 Proxy 代理 四層網(wǎng)絡(luò)和七層網(wǎng)絡(luò)尖滚,分別主要是代理 apiserver 和 ingress 應(yīng)用
參考資料:
歡迎點(diǎn)贊喉刘,關(guān)注,收藏
朋友們漆弄,你的支持和鼓勵(lì)睦裳,是我堅(jiān)持分享,提高質(zhì)量的動(dòng)力
好了撼唾,本次就到這里
技術(shù)是開放的廉邑,我們的心態(tài),更應(yīng)是開放的倒谷。擁抱變化蛛蒙,向陽而生,努力向前行渤愁。
我是小魔童哪吒牵祟,歡迎點(diǎn)贊關(guān)注收藏,下次見~