[K8S 系列]k8s 學習一,Kubernetes 基本介紹及核心元件

小魔童哪吒發表於2021-12-23

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 應用

參考資料:

kubernetes docs

歡迎點贊,關注,收藏

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

好了,本次就到這裡

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

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

本作品採用《CC 協議》,轉載必須註明作者和本文連結
關注微信公眾號:小魔童哪吒

相關文章