k8s學習 - 概念 - master/node


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。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM