Kubernetes(k8s)入門學習


1、Kubernetes(k8s)是舵手的含義,Kubernetes(k8s)是什么?

  答:Kubernetes(k8s)是一個開源的系統,讓應用、部署、擴縮容自動化,管理容器化的應用。

 

2、Kubernetes(k8s)的主要特征?

  答:1)、一切以服務為中心,圍繞着服務轉,使用者不用關心服務運行的環境和運行的細節,構建在Kubernetes(k8s)的系統不僅可以獨立運行在物理機、虛擬機、私有雲、公有雲等等。
    2)、自動化,在Kubernetes(k8s)的服務可以自動擴縮容,自動升級、更新、部署。

    3)、Kubernetes的特點:輕量級,消耗資源小、開源、彈性伸縮、負載均衡。

 

3、Kubernetes(k8s)和Docker的關系。

  答:Kubernetes(k8s)可以看作是Docker的上層架構,就像是Java與JavaEE的關系,Kubernetes(k8s)以Docker為基礎,准確的說是以Docker技術的標准為基礎,去打造一個全新的分布式架構系統,Kubernetes(k8s)並不一定要依賴於Docker,Docker是一個產品,Docker技術是一系列的標准,所以說只要實現了這個標准的產品都可以替代Docker,所以說,Kubernetes(k8s)在底層可以支持自己的容器技術。

 

4、kubernetes的核心概念,如下所示:

  1)、Container容器:一個容器都是由一個鏡像起來的,通過這個鏡像運行了一個容器。
  2)、POD:Container容器外面的一層就是POD。POD里面可以有一個或者多個容器。POD的特征,POD里面的所有容器都是運行在一台機器上的,POD里面的容器共享網絡,POD里面有一個唯一的ip,每一個POD里面都會有一個容器叫做Pause容器(Pause容器非常簡單,里面會有一個特定的鏡像)。
  3)、Pause容器:Pause容器就是作為一個根容器,把其他容器都Link到一起,Pause容器把容器關聯到一起。Pause容器負責整個POD的健康檢查,然后匯報給k8s。當業務里面有兩個容器或者多個容器的時候,他們的關系非常的緊密,此時,就可以考慮將他們放到同一個POD里面。
  4)、ReplicaSet(RS):POD的上一層是RS,叫做副本集。同一個應用下,要運行幾個實例呢,ReplicaSet(RS)負責管理這個的。ReplicaSet(RS)可以管理多個POD的。運行過程中,如果某一個POD出現異常或者異常退出,ReplicaSet(RS)會保證副本始終為2,在另外一台機器重新調度起來一個。
  5)、Deployment:叫做部署,ReplicaSet(RS)的上一層是Deployment。

      如果一個舊的應用運行了兩個實例,如果此時想更新該應用,比如,此時舊的應用就是左邊的兩個POD,如果更新這個應用的時候,一般我們更新的就是Deployment,Deployment會自動的幫我們再創建一個ReplicaSet(RS),創建一個副本集,會滾動先啟動一個新版本的POD,例如升級了鏡像的版本,副本集先啟動了一個實例,此時Deployment管理的是三個實例,對外提供服務的是三個實例,新的實例啟動完成以后,健康檢查通過以后,Deployment會控制舊的ReplicaSet(RS)去先停止一個舊的POD,將這個舊的POD刪除掉,此時,提供服務的是一個新版本,一個舊版本哦,舊版本的POD下掉以后,新的ReplicaSet(RS)會通過新的POD再創建一個新的POD實例,新啟動的POD實例也會被ReplicaSet(RS)管理起來,新啟動的第二個POD通過健康檢查以后,會讓舊的ReplicaSet(RS)將剩下的這一個POD停止掉,停掉以后,將舊的ReplicaSet(RS)清理掉,此時整個服務更新的過程就完成了,就進行了滾動部署。

  注意:ReplicaSet(RS)、POD的創建,刪除都不需要手動管理的,需要手動管理的層面都是Deployment,Deployment會自動的幫我們創建和銷毀ReplicaSet(RS),以及整個POD的創建和銷毀過程。
  6)、Service:叫做服務。舉例說明,Selector(app=login)這個Selector表示這個Service負責管理的POD需要有這個標簽app=login,會自動去找到有對應標簽的POD。Service對外會有一個ClusterIP,其他服務或者客戶端就可以通過ClusterIP去訪問到Service服務,然后訪問到底層的POD服務。
  7)、Label:叫做標簽。標簽是k8s里面非常多的一個東西,很多組件都可以進行打標簽,起到一個標識作用。Deployment,POD都進行打標簽。

 

5、如果一個舊的應用運行了兩個實例,如果此時想更新該應用。

  比如,此時舊的應用就是左邊的兩個POD,如果更新這個應用的時候,一般我們更新的就是Deployment,Deployment會自動的幫我們再創建一個ReplicaSet(RS),創建一個副本集,會滾動先啟動一個新版本的POD,例如升級了鏡像的版本,副本集先啟動了一個實例,此時Deployment管理的是三個實例,對外提供服務的是三個實例。

  新的實例啟動完成以后,健康檢查通過以后,Deployment會控制舊的ReplicaSet(RS)去先停止一個舊的POD,將這個舊的POD刪除掉,此時,提供服務的是一個新版本,一個舊版本哦,舊版本的POD下掉以后。

  新的ReplicaSet(RS)會通過新的POD再創建一個新的POD實例,新啟動的POD實例也會被ReplicaSet(RS)管理起來,新啟動的第二個POD通過健康檢查以后,會讓舊的ReplicaSet(RS)將剩下的這一個POD停止掉,停掉以后,將舊的ReplicaSet(RS)清理掉,此時整個服務更新的過程就完成了,就進行了滾動部署。

 

6、kubernetes的架構設計,如下所示:

  1)、Master節點:稱為主節點。Master節點負責管理Worker節點。
  2)、Worker節點:可以存在很多Worker節點,在Worker節點上負責運行我們的服務。
  3)、ETCD集群:Kubernetes(k8s)有自己的存儲,需要管理自己的機器,節點,管理我們的服務,持久化存儲管理。
  4)、APIServer:Master節點上面的服務,通過APIServer去訪問ETCD集群,比如說需要創建一個服務,就需要和k8s集群進行交互。APIServer用來操作k8s的唯一入口,對外提供基於http或者https的api。當ApiServer接收到客戶端的請求以后,比如說是創建Deployment的請求,首選,選擇一個Worker節點,將POD調度到Worker節點上,如何調度呢,使用的是Scheduler調度器組件。
  5)、Scheduler調度器:會收集每一個Worker節點的詳細信息,包括他們的資源,內存,CPU,包括他們節點運行什么服務,等等各種各樣的信息。通過預算策略算法或者優選算法策略最終會選擇出一個最優的節點,將這個節點和POD建立起一個關系,然后告訴APIServer這個POD可以運行在某一個節點上,APIServer會將這個消息存儲到ETCD集群做持久化。POD和Node節點之間的關系做了綁定以后,接下來,需要把真正的POD啟動起來了,啟動的話需要另外一個模塊,稱為ControllerManager模塊。
  6)、ControllerManager模塊:集群內部的控制中心,負責維護各種各樣的k8s對象,比如,Service Controller負責管理服務的,Endpoint Controller負責管理Pod列表的,Replication Controller負責管理副本的,ResourceQuota Controller負責管理資源的配額的。ControllerManager會通過APIServer獲取ETCD集群里面的持久化信息,比如節點的變化,POD和節點的綁定關系,會被ControllerManager監聽到,會通過一些目錄去發現這個POD當前處於等待調度的狀態,它就會去完成這個調度,然后讓POD運行起來。那么POD是如何在Worker節點上運行起來的呢。
  7)、Kubelet服務:完成POD在Worker節點上運行起來,在每一個Worker節點上安裝Kubelet服務,主要負責維護POD的生命周期,包括容器的網絡等等管理。最終會調用起本地的Docker,實現運行起容器,運行起各個的POD。

 

7、kubernetes的認證與授權。

  1)、客戶端證書認證(TLS雙向認證,TLS是一種協議)。kubectl去訪問ApiServer的時候,第一步就是進行認證,k8s需要知道訪問它的人是誰。kubectl一般使用的是客戶端證書認證的方式去和ApiServer進行認證,TLS雙向認證,TLS是一種協議,為什么需要雙向認證呢,kubectl去訪問ApiServer的時候,要驗證ApiServer的證書是不是合法的,同樣,kubectl去訪問ApiServer的時候,要驗證ApiServer是不是我真正要訪問的ApiServer,同樣,ApiServer在被kubectl訪問的時候,也要去驗證kubectl客戶端是不是一個合法的客戶端。所以說,他們之間的認證是一個雙向的認證。kubectl需要有一個CA,用來判斷和保證每個證書的合法性的,k8s使用自己的認證機構,認證中心,在自定義的CA里面給每一個組件頒發證書,比如Controller Manager組件、Scheduler組件、ApiServer、etcd組件等等。比如kubectl將自己的證書發給ApiServer,ApiServer將自己的證書發給kubectl,他們之間互相驗證對方的證書是不是CA頒發的證書,如果是就進行通過認證加密的通訊了,這個通訊過程就是客戶端證書認證。

  2)、BearerToken的認證方式。是一種簡單的方式,可以理解為,有一個復雜的密碼,預先在ApiServer中定義一個復雜的密碼,把這個密碼告訴指定的客戶端,kubectl去訪問ApiServer的時候,就將BearerToken帶上,然后ApiServer驗證一下,如果沒有問題,就可以進行通訊了。

  3)、ServiceAccount認證方式。以上兩種都是在集群的外部去訪問ApiServer的時候進行認證。ServiceAccount認證方式是在k8s內部,運行的POD,運行的容器要和ApiServer交互的時候,使用的就是ServiceAccount認證方式,ServiceAccount和k8s的其他資源都是一樣的,用戶也可以創建自己的ServiceAccount。ServiceAccount主要包含了三個內容,namespace命名空間、token密碼、ca驗證ApiServer的證書,通過目錄掛載的方式掛載到POD的文件系統里面,然后應用就可以讀取指定目錄的文件去獲取到這些信息,然后拿到這些信息以后就可以和ApiServer進行交互了。

 

8、認證是訪問ApiServer的第一關,授權是訪問ApiServer的第二關。認證是認證了身份,身份沒有了問題,就需要這個身份的人能夠干什么事情,k8s里面有一系列的鑒權機制。

 

9、授權,ABAC、WebHook、RBAC。RBAC是k8s1.6版本引入的,也是最新的授權策略,k8s對RBAC投入最大,所以是更好的選擇,RBAC的全稱是Role Based Access Control,基於角色的訪問控制。

  1)、用戶層面:兩種User用戶,一種是普通的User用戶,比如kubectl去訪問ApiServer的時候,都屬於普通的user用戶。另外一種用戶是ServerAccount,專門用於在集群內部去訪問ApiServer的。
  2)、權限層面:k8s里面有很多類型的對象,資源,比如POD、Deployment、Service等等各種各樣的資源。需要考慮將權限需要區分開,什么樣的資源是可以訪問的,什么樣的資源是不可以訪問的。一種是資源的維度Resource,另外一種是對資源控制的方式,比如說常見的增刪改查CURD操作(List列表、Create新增、Update更新、Delete刪除),叫做Verbs動詞,動作的含義。
  3)、角色層面:需要有一種最基本的角色,該角色一般包含了名字Name,權限Resouce,操作Verbs。
  4)、用戶和角色之間的關系,k8s里面使用RoleBinding描述這種用戶和角色之間對應關系。
  5)、Nameplace命名空間,對k8s里面的資源起到進行隔離的作用,如果某個人需要訪問某一個或者某幾個命名空間下面的資源,需要加上Nameplace命名空間,將Role角色放到Nameplace命名空間下面,如果擁有了該角色,也就只能擁有當前命名空間下的這個角色對應的權限。如果某個人需要某一個或者某幾個Namespace命名空間下面的權限,就可以給他定義對應的Role角色,再把它對應的RoleBinding關聯起來。
  6)、ClusterRole:跨Nameplace命名空間,如果一個人擁有所有的權限呢,k8s提出了ClusterRole,集群的角色,對應的是ClusterRoleBinding,集群的角色綁定。集群的角色除了可以定義和普通的角色一樣的Resource、Verbs以外呢,還可以定義集群范圍內的資源,並不是所有資源都屬於Namespace命名空間的,比如Node節點資源就不屬於任何Namespace的,如果需要給一個人定義Node節點資源的操作權限,就需要定義一個ClusterRole集群角色,然后把Node資源加到該角色里面,這樣的話,角色的控制就比較靈活了,可以滿足各種各樣的需求了。如果用戶需要整個集群的POD Service的訪問權限,可以定義一個ClusterRole,在這個Role的Resouce里面可以自定義POD Service,然后再建立一個ClusterRoleBinding綁定用戶,綁定到這個ClusterRole上面,然后就可以訪問集群范圍內的POD和Service了,不受命名空間的制約了。需要注意的是,所有的RoleBinding、ClusterRoleBinding,都是同時支持普通的User和ServiceAccount的,這兩種用戶在權限設計里面是對等的概念。
至此,授權就完畢了。

 

10、 AdmisionControl,准入控制,一個個的小插件,小代碼,它們之間獨立存在,並沒有之間的聯系。請求會一個一個從AdmisionControl准入控制的代碼段里面,執行一遍,一個一個的執行。可以類比於Java里面的Filter過濾器。k8提供的准入控制大概有一二十種。AlwaysAdmit總是運行所有請求通過、AlwaysDeny拒絕所有請求、ServiceAccount提供自動化,輔助ServiceAccount、DenyEscolatingExec拒絕所有的Exec,等等。


11、k8s的安裝部署。

方式一,使用Kubeadm的優點。

  1)、優雅,幾乎所有組件都是運行在容器中的,並且都是運行在k8s的POD里面的,這是非常優雅的地方。
  2)、簡單,安裝過程非常簡單,配置好一個配置文件,運行一個命令。
  3)、支持高可用,支持高可用和非高可用的安裝。
  4)、升級方便,升級隨時隨地,只要拿到Kubeadm命令,肯定可以拿到最新的k8s集群,因為它是官方出的,肯定會和k8s同步更新。
使用Kubeadm的缺點。
  1)、不易維護,對容器不熟悉或者對k8s機制不熟悉,維護起來很困難。
  2)、文檔不夠細致,文檔簡陋。

方式二,Binary,二進制安裝方式優點,也是官方的安裝方式。

  1)、易於維護,和Kubeadm是相反的,因為都是通過進程直接運行的,都是需要配置好的,並且手動運行起來的,就會清楚組件如何運行,組件之間的調用關系,方便理解。
  2)、非常靈活,搭建單機還是高可用,都是一個模塊一個模塊運行起來的,想怎么配置就怎么配置,非常靈活。
  3)、升級方便,和Kubeadm是一樣的,可以一點點去升級,b不會對整個集群造成太大影響。
Binary,二進制安裝方式缺點。
  1)、沒有安裝文檔,官方沒有提供安裝文檔。
  2)、安裝復雜,每個組件都需要自己配置。

 

作者:別先生

博客園:https://www.cnblogs.com/biehongli/

如果您想及時得到個人撰寫文章以及著作的消息推送,可以掃描上方二維碼,關注個人公眾號哦。

 


免責聲明!

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



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