【K8S 系列】k8s 學習一,Kubernetes 基本介紹及核心組件

【K8S 系列】k8s 學習一,Kubernetes 基本介紹及核心組件

Kubernetes 概述

官網(wǎng)::https://kubernetes.io/

kubernetes github:https://github.com/kubernetes/kubernetes

學習資料(語言可以自由切換):https://www.kubernetes.org.cn/k8s

image

kubernetes 有什么由來?

最開始是谷歌公司內(nèi)部使用的 Borg 系統(tǒng),后面使用 Golang 重寫并捐獻給 CNCF 基金會開源了

kubernetes 重要的作用?

kubernetes 是一個開源的容器編排框架工具,有著極其豐富的生態(tài)資源

學習 kubernetes 的意義?

解決單機裸跑 docker 的若干痛點

為什么 kubernetes 叫做 K8S ?

因為 k 到 s 之間 有 8個字母, 因此叫做 K8S

kubernetes 有什么優(yōu)勢?

  • 可自動裝箱,可水平擴展,可自我修復
  • 有服務發(fā)現(xiàn)和負載均衡
  • 可集中化配置管理和秘鑰管理
  • 可存儲編排
  • 可任務批處理運行
  • 可自動發(fā)布和回滾 等等

此處的自動發(fā)布默認是滾動發(fā)布模式

自動發(fā)布模式有如下 4 種:

  • 藍綠發(fā)布
  • 滾動發(fā)布 (kubernetes 默認發(fā)布方式)
  • 灰度發(fā)布
  • 金絲雀發(fā)布

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

網(wǎng)絡訪問,包括接口

  • USER

將本地的虛擬user-id映射到真實的user-id

Pod 控制器是 Pod 啟動的一種模板,用來保證 K8S 里面啟動的 Pod 能夠始終按照人們的預期運行,例如副本數(shù),生命周期,健康狀態(tài)的檢查等等

K8S 里面提供了多個 Pod 控制器,如下 6 種最為常見 Pod 控制器,具體使用的時候我們再詳細的說明其作用和原理:

  • Deployment

部署,為無狀態(tài)服務而設計的,

  • DaemonSet

DaemonSet保證在每個Node上都運行一個容器副本,常用來部署一些集群的日志、監(jiān)控或者其他系統(tǒng)管理應用

  • ReplicaSet

為無狀態(tài)服務而設計,簡稱為RC,是復本控制器,主要作用是確保 Pod 以我們指定的副本數(shù)運行

Deployment 控制 ReplicaSet,ReplicaSet 控制 Pod

  • StatefulSet

是為了解決有狀態(tài)服務的一系列問題

  • Job

負責批量處理短暫的一次性任務 (short lived one-off tasks),即僅執(zhí)行一次的任務,它保證批處理任務的一個或多個Pod成功結束

  • CronJob

即定時任務,就類似于Linux系統(tǒng)的crontab,在指定的時間周期運行指定的任務

其中 Deployment 和 DaemonSet 最為核心

Name 和 Namespace

Name 就是名稱

在 K8S 里面,是用資源來定義每一種邏輯概念或者功能,每種資源就要有自己的名稱,名稱通常定義在資源元數(shù)據(jù)里面

例如:

  • 資源的 api 版本
  • 類別 kind
  • 元數(shù)據(jù) metadata
  • 定義清單 spec
  • 狀態(tài) status 等配置文件

Namespace 就是命名空間

隨著項目,人員,集群規(guī)模不斷擴張,我們就需要一種能隔離 K8S 內(nèi)部資源的方法,就會使用命名空間

  • 我們可以理解命名空間就是內(nèi)部的一個虛擬組

  • 不同的命名空間里面的資源名字可以相同,相同的命名空間內(nèi)的資源不能同名

  • K8S 里面默認存在的命名空間有:

    • default
    • kube-system
    • kube-public
  • 查詢 K8S 里面特定的資源需要帶上相應的命名空間

Lable 和 Label 選擇器

Lable 就是標簽

標簽是 K8S 特色的管理方式,便于分類管理資源對象,有如下幾個注意點:

  • 標簽的組成是 key=value 的形式
  • 標簽和資源是多對多的關系,一個標簽可以有多個資源,一個資源也可以有多個標簽
  • 一個資源擁有多個標簽的時候,可以實現(xiàn)不同維度的管理
  • 有一種形式叫做注解,他與標簽類似

根據(jù)官網(wǎng)的說明和解釋

image

標簽可以是 63 個字符以下,包含[a-z0-9A-Z],還可以包含-,_,.

Label 選擇器 就是可以對標簽進行過濾,進行管理

標簽選擇器目前有兩種:

  • 基于等值關系(等于 或者 不等于)
  • 基于集合關系(屬于 或者 不屬于)

許多的資源是支持內(nèi)嵌標簽選擇器字段的

  • matchLabels
  • matchExpressions

Service 和 Ingress

k8s 有三大網(wǎng)絡:

  • Node 節(jié)點網(wǎng)絡
  • Pod 容器網(wǎng)絡
  • service 集群網(wǎng)絡

K8S 面對一個問題,K8S 里面的每個 Pod 都會分配一個單獨的 IP 地址,但是這個地址會隨著 Pod 的銷毀而消失

K8S 就有專門的 Service 服務來處理這個問題

  • 一個 Service 服務可以看作一組提供相同服務的 Pod 對外訪問的接口

  • 然而 Service 作用與哪些 Pod ,這是通過標簽選擇器來定義的

Ingress 就是 K8S 里面網(wǎng)絡模型下第 7 層的應用,他是對外暴露接口的

  • service 只能進行在第 4 層上面進行流量調(diào)度,咱們能夠看到的表現(xiàn)形式是 ip + port

  • Ingress 就比較強大,他可以調(diào)度不同業(yè)務域,還可以調(diào)度不同 URL 訪問路徑的業(yè)務流量

K8S 的組成

K8S 邏輯架構圖,該圖來源于網(wǎng)絡

image

圖中涉及到的模塊,下面會逐個提到

CLI 客戶端 1 個

  • kubectl

核心附件有如下 4 個:

  • CNI 網(wǎng)絡插件 - flanel /calico
  • 服務發(fā)現(xiàn)插件 - coredns
  • 服務暴露插件 - traefik
  • GUI 管理插件 - Dashboard

核心組件

配置存儲中心 使用的是 ETCD 服務

主控節(jié)點(master)有如下 3 個:

  • kube-apiserver 服務

是整個 K8S 的大腦

他的作用非常強大,有如下 4 個主要的功能

1、提供集群管理的 RESTFUL API 接口,這里面包括鑒權,數(shù)據(jù)校驗及集群狀態(tài)變更等

2、負責其他模塊之間的數(shù)據(jù)交互,承擔通信樞紐的功能所有組件的交互都需要通過 apiserver

3、apiserver 是資源控制的入口

4、apiserver 提供完備的安全機制

  • kube-controller-manager 服務

就是用來管理控制器的 , 它由一系列控制器組成,所有的控制器都依賴于 kube-controller-manager ,通過 apiserver 監(jiān)控整個集群的狀態(tài),并確保他們都處于預期的工作,例如

1、Node 控制器

2、Deployment 控制器

3、service 控制器

4、Volume 控制器

5、Endpoint 控制器

6、Garbage 控制器

7、Namespace 控制器

8、Job 控制器

9、Resource quta 控制器 等等

  • kube-schedule 服務

主要就是接收調(diào)度 Pod 到合適的節(jié)點上面,他有 2 個策略:

1、預算策略(predict)

2、優(yōu)選策略(priorities)

運算節(jié)點有如下 2 個:

  • kube-kubelet 服務

kubelet 主要就是定時從某處節(jié)點上獲取 Pod 的期望狀態(tài),并調(diào)用對應的 docker 接口來達到這個狀態(tài)

此處的期望狀態(tài)有這些:

運行的容器,副本數(shù)量,網(wǎng)絡如何配置,存儲如何配置等等

1、kubelet 會定時匯報當前節(jié)點的狀態(tài)給到 apiserver,用于之后調(diào)度使用

2、kubelet 還做鏡像和容器的清理工作,保證節(jié)點的鏡像不會占滿磁盤空間

  • kube-proxy 服務

kube-proxy 就是一個 K8S 上運行網(wǎng)絡的代理,service 服務資源的載體

1、kube-proxy 可以建立 Pod 網(wǎng)絡和集群網(wǎng)絡的關系 (clusterip -> podip)

2、kube-proxy 負責建立、刪除和更新調(diào)度規(guī)則,通知 apiserver 自身更新,或者從 apiserver 獲取調(diào)度規(guī)則,更新 kube-proxy 自身

kube-proxy 常用的三種流量調(diào)度模式:

  • Userspace
  • Iptables
  • Ipvs

K8S 集群網(wǎng)絡圖示例

image

一般主控節(jié)點可以揉在一起部署,主控節(jié)點和 Pod 節(jié)點,邏輯上是分開的,物理上實際上是可以部署在一起,主控節(jié)點一般部署 2 個

例如可以這樣高可用部署,

image

etcd 一般部署奇數(shù)個,例如1、3、5、7等等,因為其中一個 etcd 掛了,會通過選舉投票的方式來選舉下一個 etcd 作為主,若部署的是偶數(shù)個 etcd 就無法選舉出結果

其中 Proxy 代理 四層網(wǎng)絡和七層網(wǎng)絡,分別主要是代理 apiserver 和 ingress 應用

參考資料:

kubernetes docs

歡迎點贊,關注,收藏

朋友們,你的支持和鼓勵,是我堅持分享,提高質(zhì)量的動力

image

好了,本次就到這里

技術是開放的,我們的心態(tài),更應是開放的。擁抱變化,向陽而生,努力向前行。

我是小魔童哪吒,歡迎點贊關注收藏,下次見~

?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容