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。
