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。