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

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

Kubernetes 概述

官網::https://kubernetes.io/

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

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

image

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 的形式
  • 標簽和資源是多對多的關系,一個標簽可以有多個資源,一個資源也可以有多個標簽
  • 一個資源擁有多個標簽的時候,可以實現不同維度的管理
  • 有一種形式叫做注解,他與標簽類似

根據官網的說明和解釋

image

標簽可以是 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 邏輯架構圖,該圖來源于網絡

image

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

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 集群網絡圖示例

image

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

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

image

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

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

參考資料:

kubernetes docs

歡迎點贊,關注,收藏

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

image

好了,本次就到這里

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

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

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容