Kubernetes 入門:基本概念梳理

《Kubernetes 入門:基本概念梳理》最先發布在 blog.hdls.me/15346044250…html

本篇文章介紹了 k8s 基本知識點和常見名詞。docker

Master

k8s 中做爲大腦存在的是 Master 節點,是集羣的控制節點,負責整個集羣的管理和控制。全部的其餘 Node 都會向 Master 註冊本身,並按期上報自身的全部信息。在 Master 節點上運行着下面 4 種進程:編程

  • Api Server :提供 HTTP Rest 接口的服務進程;全部資源的增刪改查操做的惟一入口;集羣控制的入口, kubectl 就是直接對 Api Server 負責;
  • Controller Manager :全部資源對象的自動化控制中心;
  • Scheduler :負責資源的調度,主要將 Pod 調度到指定的 Node 上;
  • etcd Server :全部資源對象的數據保存在 etcd 中。

Node

除了 Master 節點外,其餘的節點都稱爲 Node,即工做節點,且接受 Master 的控制。Node 超過指定時間不上報信息時,會被 Master 斷定爲失聯,則該 Node 的狀態被標記爲不可用,隨後 Master 會觸發"工做負載大轉移"的自動流程。而 Node 上運行着下面 3 種主要的進程:後端

  • kubelet :負責 Pod 對應的容器的建立、啓停等任務;與 Master 節點密切合做,實現集羣管理的基本面功能,Node 向 Master 上報信息,就是經過 kubelet 實現的;
  • kube-proxy :實現 Service 的通訊與負載均衡機制;
  • Docker Engine :負責本機容器的建立與管理。

Namespace

用於實現多租戶的資源隔離。經過將集羣內部的資源對象分配到不一樣的 Namespace 中。建立資源對象時能夠指定屬於哪一個 Namespace。服務器

Pod

Pod 是 k8s 的最小調度單元。網絡

如上圖所示,而 Pod 是由一個個容器組成的,稱爲容器組。而組成 Pod 的容器分爲 Pause 容器和一個個業務容器。其中以 Pause 容器的狀態表明整個 Pod 的狀態,因爲 Pause 容器不易死亡,這樣就能保證對 Pod 這個總體的狀態的判斷;而全部的業務容器共享 Pause 的 IP 和 Volume,這樣就解決了聯繫緊密的業務容器之間的通訊和共享資源的問題。Pod 在哪一個 Node 上工做是由 kubelet 調度的。架構

Pod 擁有惟一 IP ,k8s 以 Endpoint (pod_ip + containerPort) 做爲 Pod 中一個服務進程的對外通訊地址。而任意兩個 Pod 之間直接 TCP/IP 通訊,採用虛擬二層網絡技術實現,如 Flannel、Openvswitch。而 Pod 的 Endpoint 與 Pod 同生命週期,當 Pod 被銷燬,對應的 Endpoint 也隨之被銷燬。負載均衡

Pod 有兩種類型:ide

  • 普通 Pod ,存放在 etcd 中,被調度到 Node 中進行綁定,調度後被 Node 中的 kubelet 實例化成一組容器並啓動;
  • 靜態 Pod ,存放在某個具體的 Node 上的一個具體文件中,只在此 Node 中啓動運行。

Volume

定義在 Pod 上,被一個 Pod 裏的多個容器掛載到具體文件目錄下。須要注意的是 Volume 與 Pod 的生命週期相同。微服務

做用:Pod 中多個容器共享文件;讓容器的數據寫到宿主機的磁盤上;寫文件到網絡存儲中;容器配置文件集中化定義與管理。

類型

  • emptyDir:Pod 分配到 Node 上時建立,無需指定宿主機上的目錄文件。Pod 被移除時,emptyDir 上的數據被永久刪除。

  • hostPath:在 Pod 上掛載宿主機上的文件或目錄。在不一樣 Node 上具備相同配置的 Pod 可能會由於宿主機上的目錄和文件不一樣而致使對 Volume 上目錄和文件的訪問結果不一致;若使用了資源配額管理, k8s 沒法將 hostPath 在宿主機上使用的資源歸入管理。

    • 用途:容器生成的日誌文件須要永久保存;須要訪問宿主機上 Docker 引擎,將 hostPath 定義爲宿主機 /var/lib/docker 目錄。
  • 其餘:如 gcePersistentDisk 、 awsElasticBlockStore 等,都是由特定的雲服務提供的永久磁盤。Pod 結束時不會被刪除,只會被卸載。使用時須要按照要求安裝特定虛擬機和永久磁盤。

Deployment

用於更好地解決 Pod 的編排問題,其內部使用 ReplicaSet 來實現目的。

使用場景:

  • 生成 RS 並完成 Pod 副本的建立過程;
  • 檢查部署動做是否完成;
  • 更新 Deployment 以建立新的 Pod;
  • 回滾;
  • 掛起或恢復。

Pod 數量的描述

  • DESIRED:Pod 副本數量的指望值
  • CURRENT:當前的副本數
  • UP_TO_DATE:最新版本的 Pod 副本數
  • AVAILABLE:當前集羣中可用 Pod 副本數

Label

定義形式:key=value。咱們主要使用 Label Selector 來查詢和篩選某些 Label 的資源對象。

使用場景:

  • kube-controller 篩選要監控的 Pod
  • kube-proxy 進程創建 Service 對 Pod 的請求轉發路由表
  • kube-scheduler 進程實現 Pod 定向調度

Annotation

定義形式:key=value

與 Label 的區別:

  • Label 有嚴格命名規則
  • Label 定義的是 metadata ,且用於 Label Selector;Annotation 是用戶任意定義的附加信息

使用場景:

  • build 信息、 release 信息、 Docker 鏡像信息等
  • 日誌庫、監控庫、分析庫等資源庫的地址信息
  • 程序調試工具信息
  • 團隊的聯繫信息

Replica Set

Replica Set(RS) 是 Replication Controller(RC) 的升級版本。二者的惟一區別是對選擇器的支持。ReplicaSet 支持 labels user guide 中描述的 set-based 選擇器要求, 而 Replication Controller 僅支持 equality-based 的選擇器要求。

咱們通常用 Deployment 來定義 RS,不多直接建立 RS,從而造成一套完整的 Pod 的建立、刪除、更新的編排機制。

RS 中能夠定義的是:Pod 期待的副本數(Replicas);用於篩選目標 Pod 的 Label Selector;當 Pod 副本數小於預期數量時,用於建立新 Pod 的模板。

Master 的 Controller Manager 按期巡檢系統中當前存活的目標 Pod,確保目標 Pod 實例數等於指望值。刪除 RS 不會影響 Pod ,支持基於集合的 Label Selector;經過改變 RS 中 Pod 副本數量,實現 Pod 擴容和縮容;經過改變 RS 中 Pod 模板中的鏡像版本,實現 Pod 的滾動升級。

Service

定義:微服務架構中的微服務。

Service 定義了一個服務的訪問入口地址,客戶端經過該入口地址訪問背後的集羣實例。Service 經過 Label Selector 與後端 Pod 副本集羣之間實現對接。Service 之間經過 TCP/IP 通訊。

負載均衡

kube-proxy 進程是一個智能的負載均衡器,負責將對 Service 的請求轉發到後端的 Pod。Pod 的全部副本爲一組,提供一個對外的服務端口,將這些 Pod 的 Endpoint 列表加入該端口的轉發列表。客戶端經過負載均衡的對外 IP + 服務端口來訪問此服務。

ClusterIP

Service 擁有全局惟一虛擬 IP,稱爲 ClusterIP,每一個 Service 變成了具有全局惟一 IP 的通訊節點。與 Pod 不一樣的是,Pod 的 Endpoint 會隨 Pod 的銷燬而發生改變,但 ClusterIP 在 Service 的生命週期中不會發生改變。而且只要用 Service 的 Name 與 Service 的 ClusterIP 作一個 DNS 域名映射,便可實現服務發現。

Service 中通常會定義一個 targetPort,即提供該服務的容器暴露的端口,具體業務進程在容器內的 targetPort 上提供 TCP/IP 接入;而 Service 的 port 屬性定義了 Service 的虛接口。

服務發現

before:每一個 Service 生成一些對應的 Linux 環境變量,Pod 容器啓動時自動注入。

now:經過 Add-On 增值包的方式引入 DNS 系統,將服務名做爲 DNS 域名便可實現。

外部系統訪問 Service

k8s 中有三種類型的 IP:

  • Node IP

    集羣中每一個節點的物理網卡的 IP 地址;全部屬於這個網絡的服務器之間都經過這個網絡直接通訊;集羣以外的節點訪問該集羣時,必須經過 Node IP 通訊。

  • Pod IP

    Docker Engine 根據 docker0 網橋的 IP 地址段進行分配的;虛擬的二層網絡;不一樣 Pod 的容器之間互相訪問時,經過 Pod IP 所在的虛擬二層網絡進行通訊。

  • Cluster IP

    • 僅僅做用於 Service :由 kuber 管理和分配 IP 地址;
    • 沒法被 ping:由於沒有一個實體網絡對象來響應;
    • Cluster IP 只能結合 Service Port 組成一個具體的通訊端口:單獨的 Cluster IP 不具有 TCP/IP 通訊基礎;屬於 kuber 集羣的封閉空間;集羣外的節點若須要訪問,須要一些額外的操做;
    • Node IP 網、Pod IP 網和 Cluster IP 網之間的通訊是 kuber 自制的一種編程方式的路由規則;

k8s 中實現外部系統訪問 Service 的方法,主要是經過 NodePort,其實現方式是在每一個 Node 上爲須要提供外部訪問的 Service 開啓一個對應的 TCP 監聽端口。此時,外部系統只要用任意一個 Node 的 IP + NodePort 便可訪問此服務。

相關文章
相關標籤/搜索