1. 程式人生 > 實用技巧 >K8s基礎知識介紹

K8s基礎知識介紹

1. K8s介紹

K8s是源自於谷歌內部的Borg系統(容器編排工具),後經過Go語言重寫並捐獻給了CNCF基金會開源。
它的主要作用就是作為容器的開源編排框架工具。
官網:https://kubernetes.io(一年釋出四個大版本)
GitHub:https://github.com/kubernetes/kubernetes

2. K8s的優勢

- 自動裝箱,水平擴充套件,自我修復
- 服務發現和負載均衡
- 自動釋出(預設滾動釋出模式)和回滾
- 集中配置管理和祕鑰管理
- 儲存編排
- 任務批量處理執行

3. K8s基本概念

- Pod/Pod控制器
- Name/Namespace
- Label/Label選擇器
- Service/Ingress

3.1 Pod與Pod控制器

3.1.1 Pod

- Pod是K8S裡能夠被執行的最小邏輯單元(原子單元)。
- 1個Pod裡面可以執行多個容器,它們共享UTS+NET+IPC名稱空間。
- 可以把Pod理解成豌豆莢,而同一個Pod內的每個容器都是一顆顆豌豆。
- 一個Pod裡可以執行多個容器,這種模式稱為邊車(SideCar)模式。

3.1.2 Pod控制器

- Pod控制器是Pod啟動的一種模板,用來保證K8S裡啟動的Pod應始終按照人們的預期執行(副本數、生命週期、健康狀態檢查等)。
- K8S內提供了眾多的Pod控制器,常用的有以下幾種:
· Deployment
· DaemonSet
· ReplicaSet
· StatefulSet
· Job
· Cronjob

3.2 Name和Namespace

3.2.1 Name

- 由於K8S內部,使用“資源”來定義每一種邏輯概念(功能),故每種“資源”,都應該有自己的“名稱”。
- “資源”有api版本(apiVersion)、類別(kind)、元資料(metadata)、定義清單(spec)、狀態(status)等配置資訊。
- “名稱”通常定義在“資源”的“元資料”資訊裡。

3.2.2 Namespace

- 隨著專案增多、人員增加、叢集規模擴大,需要一種能夠隔離K8S內各種“資源”的方法,這就是名稱空間。
- 名稱空間可以理解為K8S內部的虛擬叢集組。
- 不同名稱空間內的“資源”,名稱可以相同,相同名稱空間內的同種“資源”,“名稱”不能相同。
- 合理的使用K8S的名稱空間,可以讓叢集管理員更好的對交付到K8S裡的服務進行分類管理和瀏覽。
- K8S裡預設存在的名稱空間有:default、kube-system、kube-pulic。
- 查詢K8S裡特定“資源”要帶上相應的名稱空間。

3.3 Label和Label選擇器

3.3.1 Label

- 標籤是K8S特色的管理方式,便於分類管理資源物件。
- 一個標籤可以對應多個資源,一個資源可以有多個標籤,它們是多對多的關係。
- 一個資源擁有多個標籤,可以實現不同維度的管理。
- 標籤的組成:key=value。
- 與標籤類似的,還有一種“註解”(annotations)。

3.3.2 Label選擇器

- 給資源打上標籤後,可以使用標籤選擇器過濾指定的標籤。
- 標籤選擇器目前有兩個:基於等值關係(等於、不等於)和基於集合關係(屬於、不屬於、存在)。
- 許多資源支援內嵌標籤選擇器欄位
· matchLabels
· matchExpressions

3.4 Service和Ingress

3.4.1 Service

- 在K8S的世界裡,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨著Pod的銷燬而消失。
- Service就是用來解決這個問題的核心概念。
- 一個Service可以看作一組提供相同服務的Pod的對外訪問介面。
- Service作用於哪些Pod是通過標籤選擇器來定義的。

3.4.2 Ingress

- Ingress是K8S叢集裡工作在OSI網路參考模型下,第7層的應用,對外暴露的介面。
- Service只能進行L4(4層)流量排程,表現形式是ip+port。
- Ingress則可以排程不同業務域、不同URL訪問路徑的業務流量。

4. K8S元件介紹

4.1 k8s核心元件

配置儲存中心 → etcd服務
主控節點(master)
    - kube-apiserver服務
    - kube-controller-manager服務
    - kube-scheduler服務
運算節點(node)
    - kube-kubelet服務
    - kube-proxy服務

4.1.1 核心元件詳解

(1)配置儲存中心 → etcd服務
- 類似於zk這種叢集管理中心,用來存放叢集的元資料資訊,如k8s叢集狀態、請求、資源配額等。儲存方式為鍵值對。

(2)kube-apiserver服務
- 提供了叢集管理的REST API介面(包括鑑權、資料校驗及叢集狀態變更)。
- 負責其他模組之間的資料互動,承擔通訊樞紐功能(叢集大腦,所有元件都要通過它來進行通訊)。
- 是資源配額控制的入口。
- 提供完備的叢集安全機制。

(3)kube-controller-manager服務(控制器管理器)
- 由一系列控制器組成,通過apiserver監控整個叢集的狀態,並確保叢集處於預期的工作狀態。
- Node Controller          # 節點控制器
- Deployment Controller    # pod控制器
- Service Controller       # 服務控制器
- Volume Controller        # 儲存卷控制器
- Endpoint Controller      # 接入點控制器
- Garbage Controller       # 垃圾回收控制器
- Namespace Controller     # 名稱空間控制器
- Job Controller           # 任務控制器
- Resource quta Controller # 資源配額控制器
- ……………………

(3)kube-scheduler服務
- 主要功能是接收排程pod到適合的運算節點上,主要用下面兩種策略來選擇合適的節點排程。
- 預算策略(predict)
- 優選策略(priorities)

(4)kube-kubelet服務
- 簡單的說,kubelet的主要功能就是定時從某個地方獲取節點上pod的期望狀態(執行什麼容器、執行的副本數量、網路或儲存如何配置等等),並呼叫對應的容器平臺介面達到這個狀態。
- 定時彙報當前節點狀態給apiserver,並存儲到etcd裡,以供排程的時候使用。
- 映象和容器的清理工作,保證節點上映象不會沾滿磁碟空間,退出的容器不會佔用太多的資源。

(5)kube-proxy服務
- 是k8s在每個節點上執行的網路代理,service資源的載體、
- 建立了pod網路和叢集網路關係(clusterip → podip)。
- 常用三種流量排程模式
  · Userspace(廢棄)
  · Iptables(瀕臨廢棄)
  · Ipvs(推薦)
- 負責建立和刪除包括更新排程規則,通知apiserver自己的更新,或者從apiserver那裡獲取其他kube-proxy的排程規則變化,來更新自己的

4.2 核心附件

CNI網路外掛 → flannel/calico
服務發現用外掛 → coredns
服務暴露用外掛 → traefik
GUI管理外掛 → Dashboard

4.3 CLI客戶端

kubectl

5. K8S常見安裝方式介紹

(1)Minikube,單節點微型K8S(僅供學習、預覽k8s特性使用)
(2)二進位制安裝部署(生產首選,新手推薦,但是安裝步驟繁雜)
(3)kubeadmin,k8s的部署工具,跑在k8s裡(相對簡單,熟手推薦)