k8s學習 - 概念 - master/node

軒脈刃發表於2019-07-15

k8s學習 - 概念 - master/node

在k8s中,有各種各樣的概念和術語。這些概念是必須要學習和掌握的。我們先羅列下所有概念,然後再一個個看具體例項。

大概說一下這些概念:

  • Master: k8s的主控元件,對應的物件是node。
  • Node: 是k8s叢集的機器節點,相當於master-node。一個node就對應一個具體的物理機或者虛擬機器。
  • Container: 是一個映象容器,一個container是一個映象例項
  • Pod: 是k8s叢集的最小單元,一個pod可以包含一個或者多個container
  • Service: 多個相同的pod組成一個服務,統一對外提供服務。
  • Volume: 儲存卷,pod對外暴露的共享目錄,它可以掛載在宿主機上,這樣就能讓同node上多個pod共享一個目錄。
  • Replication Controller: 用於控制pod叢集的控制器,可以制定各種規則來讓它控制一個service中的多個pod的建立和消亡, 很多地方簡稱為rc。
  • Namespace: 名稱空間,用於將一個k8s叢集隔離成不同的空間,pod, service, rc, volume 都可以在建立的時候指定其namespace。
  • StatefulSet: 有狀態叢集,比如一個主從的mysql叢集就是有狀態叢集,需要先啟動主再啟動從,這就是一種有狀態的叢集。
  • Persistent Volume: 持久儲存卷。之前說的volume是掛載在一個pod上的,多個pod(非同node)要共享一個網路儲存,就需要使用持久儲存卷,簡稱為pv。
  • Persistent Volume Claim: 持久儲存卷宣告。他是為了宣告pv而存在的,一個持久儲存,先申請空間,再申明,才能給pod掛載volume,簡稱為pvc。
  • Label: 標籤。我們可以給大部分物件概念打上標籤,然後可以通過selector進行叢集內標籤選擇物件概念,並進行後續操作。
  • Secret: 私密憑證。密碼儲存在pod中其實是不利於分發的。k8s支援我們建立secret物件,並將這個物件打到pod的volume中,pod中的服務就以檔案訪問的形式獲取金鑰。
  • EndPoint: 用於記錄 service 和 pod 訪問地址的對應關係。只有 service 配置了 selector, endpoint controller 才會自動建立endpoint物件。

如果不理解沒啥關係,看一遍有印象下,下面我們一個個琢磨琢磨。

master

k8s的master節點上有三個程式,它們都是以docker的形式存在的。我們在k8s的master節點看docker ps 就可以看到這幾個程式:

8824aad1ee95        e851a7aeb6e8                     "kube-apiserver --ad…"   3 days ago          Up 3 days                               k8s_kube-apiserver_kube-apiserver-docker-for-desktop_kube-system_f23c0965aad6df9f61b1c9c4bb953cf5_0
a9ce81ec9454        978cfa2028bf                     "kube-controller-man…"   3 days ago          Up 3 days                               k8s_kube-controller-manager_kube-controller-manager-docker-for-desktop_kube-system_1dc44822f21a9cbd68cc62b1a4684801_0
85da3f6e700f        d2c751d562c6                     "kube-scheduler --ad…"   3 days ago          Up 3 days                               k8s_kube-scheduler_kube-scheduler-docker-for-desktop_kube-system_b6155a27330304c86badfef38a6b483b_0

其中的 apiserver 是提供 k8s 的 rest api 服務的程式。當然它也包括了 restapi 的許可權認證機制。 k8s 的 apiserver 提供了三種許可權認證機制:

  • https
  • http + token
  • http + base(username + password)

我們也可以通過使用kubectl proxy 在 master 上來建立一個代理,從而外部可以訪問這個 k8s 叢集。

kube-controller-manager 是用來管理所有的 controller 的。之前我們說的 Replication Controller 就是一種管控 Pod 副本的Controller, 其他相關的 Controller 還有:

  • Replication Controller
  • Node Controller: 實時獲取Node的相關資訊,實現管理和監控叢集中的各個Node節點的相關控制功能
  • ResourceQuota Controller: 確保指定的資源物件在任何時候都不會超量佔用系統物理資源
  • NameSpace Controller: 定時通過API Server讀取這些Namespace資訊
  • ServiceAccount Controller: 監聽Service變化,如果是一個LoadBalancer型別的Service,則確保外部的雲平臺上對該Service對應的LoadBalancer例項被相應地建立、刪除及更新路由轉發表
  • Token Controller
  • Service Controller
  • EndPoint Controller : Service 和選擇 Pod 的對應關係。

kube-scheduler 負責 Pod 排程,接收 Controller Manager 建立的新的Pod,為其選擇一個合適的Node,並且在Node上建立Pod。

一個k8s叢集只有一個master節點,所以 master 節點的高可用性是一個問題,一旦 master 節點掛了,整個叢集也就掛了。這點真有點神奇。所以網上關於搭建高可用的k8s Master 節點的方案有很多:

https://jishu.io/kubernetes/kubernetes-master-ha/
https://blog.51cto.com/ylw6006/2164981
https://jimmysong.io/kubernetes-handbook/practice/master-ha.html

Node

Node 是 k8s 的工作節點,Node 一般是一個虛擬機器或者物理機,每個 node 上都執行三個服務:

  • docker
  • kubelet
  • kube-proxy

docker 就是 docker server,它提供

kubelet 是一個管理系統,它管理本個node上的容器的生命週期。它主要功能就是定時從某個地方獲取節點上pod/container的期望狀態,並呼叫對應的容器平臺介面,來達成這個狀態。它可以設定 http 監控,命令列監控等方式。

kube-proxy 是管理 service 的訪問入口,包括叢集內 pod 到 service 的訪問,以及叢集外訪問service。

可用性

其實k8s自身的可用性是比較弱的,如果master掛了,那麼master上的三個服務也就掛了。node掛了,如果node上的pod是被 controller控制住的話,controller會在其他node上啟動對應的pod。

相關文章