《深入剖析Kubernetes》總結三:Kubernetes架構

Kubernetes架構

一個正在運行的 Linux 容器可以被“一分爲二”地看待:

  1. 一組聯合掛載在 /var/lib/docker/aufs/mnt 上的 rootfs,這一部分可以稱爲“容器鏡像”(Container Image),是容器的靜態視圖;
    1. 一個由 Namespace+Cgroups 構成的隔離環境,這一部分可以稱爲“容器運行時”(Container Runtime),是容器的動態視圖

Kubernetes關心的是“容器鏡像”

  • 架構
    在這裏插入圖片描述
    由 Master 和 Node 兩種節點組成,分別對應着控制節點和計算節點

控制節點(Master):由負責 API 服務的 kube-apiserver(整個集羣的持久化數據,也由 kube-apiserver 處理後保存在 Ectd 中)、負責調度的 kube-scheduler,以及負責容器編排的 kube-controllermanager組成,在kubeadm這種部署方式中,一個組件以一個Pod形式被部署

計算節點(Node):

kubelet主要負責同容器運行時(比如 Docker 項目)打交道,使用 CRI(Container Runtime Interface),接口,該接口定義了 容器運行時的各項核心操作,比如啓動一個容器需要的所有參數

OCI:具體的容器運行時,比如 Docker 項目,一般通過 OCI 這個容器運行時規範同底層的 Linux 操 作系統進行交互,即:把 CRI 請求翻譯成對 Linux 操作系統的調用(操作 Linux Namespace 和 Cgroups 等)。

gRPC:和 Device Plugin進行交互。該插件是 Kubernetes 項目用來管理 GPU 等宿主機物理設備的主要組件,也是基於 Kubernetes 項目進行機器學習訓練、高性能作業支持等工作必須關注的功能

CNI:調用網絡插件爲容器配置網絡

CSI:調用存儲插件爲容器配置持久化存儲

  • 核心理念

聲明式API: API 對應的“編排對象”和“服務對象”,都是 Kubernetes 項目中的 API 對象(API Object)。
首先,通過一個“編排對象”,比如 Pod、Job、CronJob 等,來描述你試圖管理的應用;
然後,再爲它定義一些“服務對象”,比如 Service、Secret、Horizontal Pod Autoscaler(自 動水平擴展器)等;這些對象,會負責具體的平臺級功能。

容器間的關係

Pod:最基礎的一個對象,Pod 裏的容器共享同一個 Network Namespace、同一組數據卷,從而達到高效率交換信息的目的,可以將交互密切的容器放在同一個Pod裏,可以等價爲一個應用

Service:解決不同服務的交互問題,比如 Web 應用與數據庫之間的訪問關係;
給 Pod 綁定一個 Service 服務,而 Service 服務聲明的 IP 地址等信息是固定的,Service 服務的主要作用就是作爲 Pod 的代理入口(Portal),從 而代替 Pod 對外暴露一個固定的網絡地址。 這樣,對於 Web 應用的 Pod 來說,它需要關心的就是數據庫 Pod 的 Service 信息,而Service 後端真正代理的 Pod 的 IP 地址、端口等信息的自動更新、維護,則是 Kubernetes 的職責。

Deployment:Pod多實例管理器,能一次啓動多個應用的實例

容器的形態

Secret:是一個保存在 Etcd 裏的鍵值對數據。把 Credential(數據庫的用戶名和密碼)信息以 Secret 的方式存在 Etcd 裏,Kubernetes 就會在指定的 Pod啓動時,自動把 Secret 裏的數據以 Volume 的方式掛載到容器裏

Job:基於 Pod 改進後的對象,用來描述一次性運行的 Pod(比如,大數據任務)

DaemonSet:用來描述每個宿主機上必須且只能運行一個副本 的守護進程服務

Cronjob:用於描述定時任務
在這裏插入圖片描述
與Linux對比:(圖源《趣談Linux》)
在這裏插入圖片描述

使用

Kubernetes 推薦的使用方式,是用一個 YAML 文件來描述你所要部署的 API 對象。然 後,統一使用 kubectl apply 命令完成對這個對象的創建和更新操作

Kubernetes API 對象往往由 Metadata 和 Spec 兩部分組成;
Metadata 的字段是 API 對象 的“標識”,即元數據,也是從 Kubernetes 裏找到這個對象的主要依據,其中最主要 用到的字段是 Labels,是一組 key-value 格式的標籤,而像 Deployment 這樣的控制器對象,就可以通過這個 Labels 字段從 Kubernetes 中過濾出它所關心的被控制對象;
Spec存放屬於這個對象獨有的定義,用來描述它所要表達的功能,比如容器想要使用的數據卷Volume

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章