k8s實踐(1)--k8s集羣入門

 

我們學習安排:由淺入深


1、簡單瞭解集羣的工作原理和基礎概念,名詞解釋。
2、安裝etcd集羣:etcd分佈式鍵值存儲系統,用於保持集羣狀態,比如Pod、Service等對象信息。
3、安裝k8s集羣,簡單瞭解集羣的如何工作。
4、搭建集羣網絡:基礎網絡搞好,後面才能順利部署各種資源。
5、學習k8s的安全、Secrets,ssl認證。如果安全認證沒有搞好,創建pod和service都會報各種錯誤。
6、然後我們深入學習pod和service。
7、深入學習集羣工作原理分析,從基礎到深度,才能學的紮實。
8、有了pod和service,就需要知道如果發現,學習coreDNS
9、開始部署一些有狀態的服務
10、案例實踐

一、Kubernetes簡介


1.1 Kubernetes簡介

      Kubernetes是Google在2014年6月開源的一個容器集羣管理系統,使用Go語言開發,Kubernetes也叫K8S。
K8S是Google內部一個叫Borg的容器集羣管理系統衍生出來的,Borg已經在Google大規模生產運行十年之久。
K8S主要用於自動化部署、擴展和管理容器應用,提供了資源調度、部署管理、服務發現、擴容縮容、監控等一整套功能。
      Kubernetes目標是讓部署容器化應用簡單高效。
      Kubernets官方網站:www.kubernetes.io,目前在github.com/GoogleCloudPlatform/kubernetes進行維護。

       它既是一款容器編排工具,也是全新的基於容器技術的分佈式架構領先方案。在Docker技術的基礎上,爲容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等功能,提高了大規模容器集羣管理的便捷性。

Kubernetes特點:
     易學: 輕量級, 簡單, 容易理解
     便攜: 支持公有云, 私有云, 混合雲, 以及多種雲平臺
     可拓展: 模塊化, 可插拔, 支持鉤子, 可任意組合
     自修復: 自動重調度, 自動重啓, 自動複製

1.2 Kubernetes 主要功能

數據卷
Pod中容器之間共享數據,可以使用數據卷。

應用程序健康檢查
容器內服務可能進程堵塞無法處理請求,可以設置監控檢查策略保證應用健壯性。

複製應用程序實例
控制器維護着Pod副本數量,保證一個Pod或一組同類的Pod數量始終可用。

彈性伸縮
根據設定的指標(CPU利用率)自動縮放Pod副本數。

服務發現
使用環境變量或DNS服務插件保證容器中程序發現Pod入口訪問地址。

負載均衡
一組Pod副本分配一個私有的集羣IP地址,負載均衡轉發請求到後端容器。在集羣內部其他Pod可通過這個ClusterIP訪問應用。

滾動更新
更新服務不中斷,一次更新一個Pod,而不是同時刪除整個服務。

服務編排
通過文件描述部署服務,使得應用程序部署變得更高效。

資源監控
Node節點組件集成cAdvisor資源收集工具,可通過Heapster彙總整個集羣節點資源數據,然後存儲到InfluxDB時序數據庫,再由Grafana展示。

提供認證和授權
支持角色訪問控制(RBAC)認證授權等策略。

 

二、設計架構


任何優秀的項目都離不開好的架構和設計藍圖,Kubernetes集羣包含有節點代理kubelet和Master組件(APIs, scheduler, etc),一切都基於分佈式的存儲系統。下面這張圖是Kubernetes的架構圖。

2.1、功能組件

K8S集羣中有管理節點Master 與工作節點Node兩種類型。

1)、管理節點Master主要負責K8S集羣管理,集羣中各節點間的信息交互、任務調度,還負責容器、Pod、NameSpaces、PV等生命週期的管理。

2)、工作節點Node主要爲容器和Pod提供計算資源,Pod及容器全部運行在工作節點上,工作節點通過kubelet服務與管理節點通信以管理容器的生命週期,並與集羣其他節點進行通信。

1、Master 組件

     kube-apiserver
     Kubernetes API,資源操作的唯一入口,各組件協調者,以HTTP API提供接口服務,並提供認證、授權、訪問控制、API註冊和發現等機制;所有對象資源的增刪改查和監聽操作都交給APIServer處理後再提交給Etcd存儲。
    kube-controller-manager
    處理集羣中常規後臺任務,一個資源對應一個控制器,而ControllerManager就是負責管理這些控制器的。負責維護集羣的狀態,比如故障檢測、自動擴展、滾動更新等;
    kube-scheduler
   負責資源的調度,按照預定的調度策略將Pod調度到相應的Node節點上;

2、Node組件

    kubelet
    kubelet是Master在Node節點上的Agent,管理本機運行容器的生命週期,同時也負責Volume(CVI)和網絡(CNI)的管理;比如創建容器、Pod掛載數據卷、下載secret、獲取容器和節點狀態等工作。kubelet將每個Pod轉換成一組容器。
    kube-proxy
   在Node節點上實現Pod/Serviced網絡代理,提供cluster內部的服務發現和四層負載均衡工作;

3、docker

    運行容器,Container runtime負責鏡像管理以及Pod和容器的真正運行(CRI)

4、etcd集羣

     分佈式鍵值存儲系統。用於保持集羣狀態,比如Pod、Service等對象信息。

5、Add-ons組件

除了核心組件,還有一些推薦的Add-ons:

  • kube-dns/CoreDNS負責爲整個集羣提供DNS服務
  • Ingress Controller爲服務提供外網入口
  • Heapster提供資源監控
  • Dashboard提供GUI
  • Federation提供跨可用區的集羣
  • Fluentd-elasticsearch提供集羣日誌採集、存儲與查詢

2.2、分層架構

Kubernetes設計理念和功能其實就是一個類似Linux的分層架構,如下圖所示

  • 核心層:Kubernetes最核心的功能,對外提供API構建高層的應用,對內提供插件式應用執行環境
  • 應用層:部署(無狀態應用、有狀態應用、批處理任務、集羣應用等)和路由(服務發現、DNS解析等)
  • 管理層:系統度量(如基礎設施、容器和網絡的度量),自動化(如自動擴展、動態Provision等)以及策略管理(RBAC、Quota、PSP、NetworkPolicy等)
  • 接口層:kubectl命令行工具、客戶端SDK以及集羣聯邦
  • 生態系統:在接口層之上的龐大容器集羣管理調度的生態系統,可以劃分爲兩個範疇
    • Kubernetes外部:日誌、監控、配置管理、CI、CD、Workflow、FaaS、OTS應用、ChatOps等
    • Kubernetes內部:CRI、CNI、CVI、鏡像倉庫、Cloud Provider、集羣自身的配置和管理等

 

 

三、基本抽象概念


3.1 Pod

     在Kubernetes中,最小的管理元素不是一個個獨立的容器,而是Pod,Pod是最小的,管理,創建,計劃的最小單元.

     一個pod對應一個由相關容器和卷組成的容器組。相當於一個共享context的配置組,在同一個context下,應用可能還會有獨立的cgroup隔離機制,一個Pod是一個容器環境下的“邏輯主機”,它可能包含一個或者多個緊密相連的應用,這些應用可能是在同一個物理主機或虛擬機上。

3.2 Replication Controllers 複本控制器

         Replication Controller 保證了在所有時間內,都有特定數量的Pod副本正在運行,如果太多了,Replication Controller就殺死幾個,如果太少了,Replication Controller會新建幾個,和直接創建的pod不同的是,Replication Controller會替換掉那些刪除的或者被終止的pod,不管刪除的原因是什麼(維護阿,更新啊,Replication Controller都不關心)。基於這個理由,我們建議即使是隻創建一個pod,我們也要使用Replication Controller。Replication Controller 就像一個進程管理器,監管着不同node上的多個pod,而不是單單監控一個node上的pod,Replication Controller 會委派本地容器來啓動一些節點上服務(Kubelet ,Docker)。


3.3 ReplicaSet

      Replica Set是更高級的replication contorller 。確保任何給定時間指定的Pod副本數量,並提供聲明式更新等功能。
RC(Replication Controllers)與RS唯一區別就是lable selector支持不同,RS支持基於等式的seletor。RC僅支持基於等式的標籤。

replica set 主要功能:
      確保Pod數量:它會確保Kubernetes中有指定數量的Pod在運行,如果少於指定數量的Pod,RC就會創建新的,反之這會刪除多餘的,保證Pod的副本數量不變。

      確保Pod健康:當Pod不健康,比如運行出錯了,總之無法提供正常服務時,RC也會殺死不健康的Pod,重新創建新的。

     彈性伸縮:在業務高峯或者低峯的時候,可以用過RC來動態的調整Pod數量來提供資源的利用率,當然我們也提到過如果使用HPA這種資源對象的話可以做到自動伸縮。

      滾動升級:滾動升級是一種平滑的升級方式,通過逐步替換的策略,保證整體系統的穩定性。
 

3.4 Deployment

         Deployment是一個更高層次的API對象概念,它管理ReplicaSets和Pod,並提供對pod的聲明性更新以及許多其他的功能。
         官方建議使用Deployment管理ReplicaSets,而不是直接使用ReplicaSets,這就意味着可能永遠不需要直接操作ReplicaSet對象。除非您需要自定義更新編排或根本不需要更新。

         Deployment是Kubernetes系統的一個核心概念,主要職責和RC一樣的都是保證Pod的數量和健康,二者大部分功能都是完全一致的,我們可以看成是一個升級版的RC控制器。但那Deployment一些新特性:

       Deployment特性   

       RC的全部功能:Deployment具備上面描述的RC的全部功能
        事件和狀態查看:可以查看Deployment的升級詳細進度和狀態
       回滾:當升級Pod的時候如果出現問題,可以使用回滾操作回滾到之前的任一版本
       版本記錄:每一次對Deployment的操作,都能夠保存下來,這也是保證可以回滾到任一版本的基礎
       暫停和啓動:對於每一次升級都能夠隨時暫停和啓動

3.5 Service

       一個service定義了訪問pod的方式,即定義了一組Pod的策略的抽象,我們也有時候叫做宏觀服務。就像單個固定的IP地址和與其相對應的DNS名之間的關係。

        Kubernetes Pod是平凡的,它門會被創建,也會死掉(生老病死),並且他們是不可復活的。 ReplicationControllers動態的創建和銷燬Pods(比如規模擴大或者縮小,或者執行動態更新)。每個pod都由自己的ip,這些IP也隨着時間的變化也不能持續依賴。這樣就引發了一個問題:如果一些Pods(讓我們叫它作後臺,後端)提供了一些功能供其它的Pod使用(讓我們叫作前臺),在kubernete集羣中是如何實現讓這些前臺能夠持續的追蹤到這些後臺的?  

3.6、Volumes

        一個 volume 就是一個目錄,可能包含一些數據,這些數據對pod中的所有容器都是可用的,這個目錄怎麼使用,什麼類型,由什麼組成都是由特殊的volume 類型決定的

 

3.7  StatefulSet

      StatefulSet適合持久性的應用程序,有唯一的網絡標識符(IP),持久存儲,有序的部署、擴展、刪除和滾動更新。

3.8 DaemonSet

      DaemonSet確保所有(或一些)節點運行同一個Pod。當節點加入Kubernetes集羣中,Pod會被調度到該節點上運行,當節點從集羣中
移除時,DaemonSet的Pod會被刪除。刪除DaemonSet會清理它所有創建的Pod。

3.9 Job

      一次性任務,運行完成後Pod銷燬,不再重新啓動新容器。還可以任務定時運行。

3.10 Ingress

      通常情況下,service和pod的IP僅可在集羣內部訪問。集羣外部的請求需要通過負載均衡轉發到service在Node上暴露的NodePort上,然後再由kube-proxy將其轉發給相關的Pod。而Ingress就是爲進入集羣的請求提供路由規則的集合

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章