1. 程式人生 > >Kubernetes筆記(二):瞭解k8s的基本元件與概念

Kubernetes筆記(二):瞭解k8s的基本元件與概念

前文 [Kubernetes筆記(一):十分鐘部署一套K8s環境](http://blog.jboost.cn/k8s1-installation.html) 介紹瞭如何快速搭建一個k8s系統。為了繼續使用k8s來部署我們的應用,需要先對k8s中的一些基本元件與概念有個瞭解。 ## Kubernetes是什麼 Kubernetes是Google於2014年基於其內部Brog系統開源的一個容器編排管理系統,可使用宣告式的配置(以yaml檔案的形式)自動地執行容器化應用程式的管理,包括部署、伸縮、負載均衡、回滾等。 kubernetes提供的功能: * 自動釋出與伸縮:可以通過宣告式的配置檔案定義想要部署的容器,Kubernetes將自動進行容器的部署,達到期望的結果;通過指定容器副本數,或者設定根據資源負載情況(如CPU、記憶體使用率),自動對容器組進行快速的伸縮——增大或縮小容器數量 * 滾動升級與灰度釋出:採用逐步替換的策略實現滾動升級,使用Kubernetes也可以很輕易地管理系統的灰度釋出 * 服務發現與負載均衡:Kubernetes通過DNS名稱或IP地址暴露容器的訪問方式,並且可在同一容器組內實現負載分發與均衡 * 儲存編排:Kubernetes可以自動掛載指定的儲存系統,如local storage/nfs/雲端儲存等 * 故障恢復:Kubernetes自動重啟已經停機的容器,替換不滿足健康檢查的容器 * 金鑰與配置管理:Kubernetes可以儲存與管理敏感資訊,如Docker Registry的登入憑證,密碼,ssh金鑰等 ## Kubernetes架構 我們先來看一張Kubernetes的架構圖 ![k8s-arch](https://img2020.cnblogs.com/other/632381/202005/632381-20200508110949254-928911372.png) Kubernetes是一套分散式系統, 與大多數分散式系統類似,包含控制節點(master node)與工作節點(worker node)。 ### master node 控制節點就是指揮官,負責發號施令的,其上執行一些管理服務來對整個系統進行管理與控制,包括 * apiserver:作為整個系統的對外介面,提供一套Restful API供客戶端呼叫,任何的資源請求/呼叫操作都是通過kube-apiserver提供的介面進行,如kubectl、kubernetes dashboard等管理工具就是通過apiserver來實現對叢集的管理 * kube-scheduler:資源排程器,負責將容器組分配到哪些節點上 * kube-controller-manager:管理控制器,叢集中處理常規任務的後臺執行緒,包括節點控制器(負責監聽節點停機的事件並作出對應響應)、endpoint-controller(重新整理服務與容器組的關聯資訊)、replication-controller(維護容器組的副本數為指定的數值)、Service Account & Token控制器(負責為新的名稱空間建立預設的 Service Account 以及 API Access Token) * etcd:資料儲存,儲存叢集所有的配置資訊 * coredns:實現叢集內部通過服務名稱進行容器組訪問的功能 ### worker node 工作節點就是具體幹活的小兵,其上也執行一些服務來執行指揮官分派的任務,包括 * kubelet:是工作節點上執行操作的代理程式,負責容器的生命週期管理,定期執行容器健康檢查,並上報容器的執行狀態 * kube-proxy:是一個具有負載均衡能力的簡單的網路訪問代理,負責將訪問某個服務的請求分配到工作節點的具體某個容器上(kube-proxy也運行於master node上) * Docker Daemon:這個不難理解,所有服務或容器組都要以Docker容器的形式來執行(但Kubernetes其實不侷限於Docker,它支援任何實現了Kubernetes容器引擎介面的容器引擎,如containerd、rktlet) 另外還有既在master node上也在worker node上執行的網路通訊元件 kube-flannel。這些服務元件一般執行在kube-system的名稱空間中,如圖 ![kube-system](https://img2020.cnblogs.com/other/632381/202005/632381-20200508110949478-1179327366.png) ## Kubernetes基本概念 我們再來看第二張圖 ![k8s](https://img2020.cnblogs.com/other/632381/202005/632381-20200508110949972-701054865.png) 功能元件在上面已經做了介紹。Kubernetes的操作物件主要包括容器組(Pod),服務(Service),副本控制器(replication-controller),及圍繞這些的其它輔助物件 ### Pod Pod是Kubernetes建立或部署的最小基本單元。一個Pod封裝一個或多個應用容器、儲存資源、一個獨立的網路IP以及管理控制容器執行方式的策略選項。Pod中的每個容器共享網路名稱空間(包括IP與埠),Pod內的容器可以使用localhost相互通訊。Pod可以指定一組共享儲存卷Volumes,Pod中所有容器都可以訪問共享的Volumes,Volumes用於資料持久化,防止容器重啟丟失資料。 ### Volume Kubernetes使用Volume來解決Pod中容器重啟資料丟失的問題,以及Pod中多個容器間資料共享的問題。Kubernetes支援的Volume型別包括: * emptyDir:當Pod分配到Node上時,將會建立emptyDir,只要Node上的Pod一直執行,Volume就會一直存在。當Pod(不管任何原因)從Node上被刪除時,emptyDir也同時會刪除,儲存的資料也將永久刪除,但刪除容器不影響emptyDir * hostPath:hostPath允許掛載Node上的檔案系統到Pod裡面去。如果Pod需要使用Node上的檔案,可以使用hostPath * nfs: 使用nfs網路檔案系統提供的共享目錄 ### ReplicationController ReplicationController確保在任何時候都有按配置的Pod副本數在執行。現在推薦使用配置ReplicaSet(下一代ReplicationController)的Deployment來建立副本管理機制。 ### ReplicaSet ReplicaSet是下一代ReplicationController,兩者的唯一區別是ReplicaSet支援新的基於集合的選擇器,而ReplicationController僅支援基於相等選擇器的需求。 ### Deployment Deployment為Pod與ReplicaSet提供了宣告式的定義,描述你想要的目標狀態是什麼,Deployment controller就會幫你將Pod與ReplicaSet的實際狀態改變到你想要的目標狀態。 ### Service 一個Service可以看做一組提供相同服務的Pod的對外訪問介面。Kubernetes提供兩種型別的Service: * NodePort: 叢集外部可以通過Node IP與Node Port來訪問具體某個Pod * ClusterIP:指通過叢集的內部IP暴露服務,服務只能夠在叢集內部可以訪問,這也是預設的 ServiceType ### Label Label就是一對key/value,可以附加到各種資源物件上,如Node、Pod、Service等,一個資源物件可以定義任意數量的Label。可以通過Label選擇器來選擇具備某個(些)Label的資源。 ### PV & PVC PersistentVolume(PV) 為使用者提供了一個儲存抽象,由管理員設定,它是叢集的一部分。就像節點是叢集中的資源一樣,PV也是叢集中的資源。 PV是Volume之類的卷外掛,但具有獨立於Pod的生命週期。 PersistentVolumeClaim(PVC)是使用者儲存的請求。它與Pod相似。Pod消耗節點資源,PVC消耗PV資源。Pod可以請求特定級別的資源(CPU和記憶體)。PVC可以請求特定大小和訪問模式的儲存資源(例如,可以以讀/寫或只讀模式掛載)。 ### Secret Secret解決了密碼、token、金鑰等敏感資料的儲存問題,Secret的三種類型: * Service Account :用來訪問Kubernetes API,由Kubernetes自動建立,並且會自動掛載到Pod的/run/secrets/kubernetes.io/serviceaccount目錄中 * Opaque :Base64編碼格式的Secret,用來儲存密碼、金鑰等 * kubernetes.io/dockerconfigjson :用來儲存docker registry的認證資訊 ### ConfigMap ConfigMap用來儲存key/value對的配置資料,這個資料可以在Pods裡使用,或者被用來為像controller一樣的系統元件儲存配置資料。ConfigMap可以方便的處理不含敏感資訊的字串(敏感資訊可使用Secret)。 ### Namespace Namespace類似於Kubernetes中的虛擬叢集,便於不同的分組在共享使用整個叢集的資源的同時還能被分別管理。比如我們如果開發測試共用一個Kubernetes叢集,則可以將開發環境的服務部署到dev的namespace,測試環境的部署到test的namespace。 ### Ingress 為叢集服務提供外部訪問,包括基於Nginx與Traefik兩個版本,為服務提供域名繫結訪問與路徑路由功能。也可以基於Ingress實現服務的灰度釋出。 ## 總結 本文對Kubernetes中涉及的基本元件與概念進行了整理,對其基本構成有了一個大致的理解與印象。下一篇將從一個實踐出發,實現一個基於Gitlab+Jenkins+K8s的CI/CD流程,以對涉及的各個元件進行深入瞭解與學習。 --- 相關閱讀: - [Kubernetes筆記(一):十分鐘部署一套K8s環境](http://blog.jboost.cn/k8s1-installation.html) --- 作者:雨歌 歡迎關注作者微信公眾號:半路雨歌,一起學習成長 ![微信公眾號](https://img2020.cnblogs.com/other/632381/202005/632381-20200508110950191-436080