kubernetes(K8s)01-簡介

原文鏈接:k8s.io

以下內容從其他地方搬的哈,對概念熟悉的同學可以直接略過!


介紹:

kubernetes,簡稱K8s,是用8代替8個字符“ubernete”而成的縮寫。是一個開源的,用於管理雲平臺中多個主機上的容器化的應用,Kubernetes的目標是讓部署容器化的應用簡單並且高效(powerful,Kubernetes提供了應用部署,規劃,更新,維護的一種機制。 [1] 

傳統的應用部署方式是通過插件或腳本來安裝應用。這樣做的缺點是應用的運行、配置、管理、所有生存週期將與當前操作系統綁定,這樣做並不利於應用的升級更新/回滾等操作,當然也可以通過創建虛擬機的方式來實現某些功能,但是虛擬機非常重,並不利於可移植性。

新的方式是通過部署容器方式實現,每個容器之間互相隔離,每個容器有自己的文件系統 ,容器之間進程不會相互影響,能區分計算資源。相對於虛擬機,容器能快速部署,由於容器與底層設施、機器文件系統解耦的,所以它能在不同雲、不同版本操作系統間進行遷移。

容器佔用資源少、部署快,每個應用可以被打包成一個容器鏡像,每個應用與容器間成一對一關係也使容器有更大優勢,使用容器可以在build或release 的階段,爲應用創建容器鏡像,因爲每個應用不需要與其餘的應用堆棧組合,也不依賴於生產環境基礎結構,這使得從研發到測試、生產能提供一致環境。類似地,容器比虛擬機輕量、更“透明”,這更便於監控和管理。

 

Kubernetes概述

Kubernetes是Google開源的一個容器編排引擎,它支持自動化部署、大規模可伸縮、應用容器化管理。在生產環境中部署一個應用程序時,通常要部署該應用的多個實例以便對應用請求進行負載均衡。

在Kubernetes中,我們可以創建多個容器,每個容器裏面運行一個應用實例,然後通過內置的負載均衡策略,實現對這一組應用實例的管理、發現、訪問,而這些細節都不需要運維人員去進行復雜的手工配置和處理。

Kubernetes 特點

  • 可移植: 支持公有云,私有云,混合雲,多重雲(multi-cloud)
  • 可擴展: 模塊化,插件化,可掛載,可組合
  • 自動化: 自動部署,自動重啓,自動複製,自動伸縮/擴展

Kubernetes 組件

  • 1Master 組件
    • 1.1kube-apiserver
    • 1.2ETCD
    • 1.3kube-controller-manager
    • 1.4cloud-controller-manager
    • 1.5kube-scheduler
    • 1.6插件 addons
    • 1.6.1DNS
    • 1.6.2用戶界面
    • 1.6.3容器資源監測
    • 1.6.4Cluster-level Logging
  • 2節點(Node)組件
    • 2.1kubelet
    • 2.2kube-proxy
    • 2.3docker
    • 2.4RKT
    • 2.5supervisord
    • 2.6fluentd

本文介紹了Kubernetes集羣所需的各種二進制組件。

uploading.gif轉存失敗重新上傳取消

 

uploading.gif轉存失敗重新上傳取消

Master 組件

Master組件提供集羣的管理控制中心。

Master組件可以在集羣中任何節點上運行。但是爲了簡單起見,通常在一臺VM/機器上啓動所有Master組件,並且不會在此VM/機器上運行用戶容器。請參考構建高可用羣集以來構建multi-master-VM。

kube-apiserver

kube-apiserver用於暴露Kubernetes API。任何的資源請求/調用操作都是通過kube-apiserver提供的接口進行。請參閱構建高可用羣集。

ETCD

etcdKubernetes提供默認的存儲系統,保存所有集羣數據,使用時需要爲etcd數據提供備份計劃。

kube-controller-manager

kube-controller-manager運行管理控制器,它們是集羣中處理常規任務的後臺線程。邏輯上,每個控制器是一個單獨的進程,但爲了降低複雜性,它們都被編譯成單個二進制文件,並在單個進程中運行。

這些控制器包括:

  • 節點(Node)控制器。
  • 副本(Replication)控制器:負責維護系統中每個副本中的pod。
  • 端點(Endpoints)控制器:填充Endpoints對象(即連接Services&Pods)。
  • Service Account和Token控制器:爲新的Namespace創建默認帳戶訪問API Token。

cloud-controller-manager

雲控制器管理器負責與底層雲提供商的平臺交互。雲控制器管理器是Kubernetes版本1.6中引入的,目前還是Alpha的功能。

雲控制器管理器僅運行雲提供商特定的(controller loops)控制器循環。可以通過將--cloud-providerflag設置爲external啓動kube-controller-manager ,來禁用控制器循環。

cloud-controller-manager 具體功能:

  • 節點(Node)控制器
  • 路由(Route)控制器
  • Service控制器
  • 卷(Volume)控制器

kube-scheduler

kube-scheduler監視新創建沒有分配到Node的Pod,爲Pod選擇一個Node。

插件 addons

插件(addon)是實現集羣pod和Services功能的。Pod由Deployments,ReplicationController等進行管理。Namespace 插件對象是在kube-system Namespace中創建。

DNS

雖然不嚴格要求使用插件,但Kubernetes集羣都應該具有集羣 DNS。

羣集 DNS是一個DNS服務器,能夠爲 Kubernetes services提供 DNS記錄。

由Kubernetes啓動的容器自動將這個DNS服務器包含在他們的DNS searches中。

用戶界面

kube-ui提供集羣狀態基礎信息查看。

容器資源監測

容器資源監控提供一個UI瀏覽監控數據。

Cluster-level Logging

Cluster-level logging,負責保存容器日誌,搜索/查看日誌。

節點(Node)組件

節點組件運行在Node,提供Kubernetes運行時環境,以及維護Pod。

kubelet

kubelet是主要的節點代理,它會監視已分配給節點的pod,具體功能:

  • 安裝Pod所需的volume。
  • 下載Pod的Secrets。
  • Pod中運行的 docker(或experimentally,rkt)容器。
  • 定期執行容器健康檢查。
  • Reports the status of the pod back to the rest of the system, by creating amirror podif necessary.
  • Reports the status of the node back to the rest of the system.

kube-proxy

kube-proxy通過在主機上維護網絡規則並執行連接轉發來實現Kubernetes服務抽象。

docker

docker用於運行容器。

RKT

rkt運行容器,作爲docker工具的替代方案。

supervisord

supervisord是一個輕量級的監控系統,用於保障kubelet和docker運行。

fluentd

fluentd是一個守護進程,可提供cluster-level logging.。 


各組件核心概念:

一、核心概念

http://docs.kubernetes.org.cn/230.html

1、Node

Node作爲集羣中的工作節點,運行真正的應用程序,在Node上Kubernetes管理的最小運行單元是Pod。Node上運行着Kubernetes的Kubelet、kube-  服務進程,這些服務進程負責Pod的創建、啓動、監控、重啓、銷燬、以及實現軟件模式的負載均衡。

Node包含的信息:

  • Node地址:主機的IP地址,或Node ID。
  • Node的運行狀態:Pending、Running、Terminated三種狀態。
  • Node Condition:…
  • Node系統容量:描述Node可用的系統資源,包括CPU、內存、最大可調度Pod數量等。
  • 其他:內核版本號、Kubernetes版本等。

查看Node信息:

kubectl describe node

2、Pod

Pod是Kubernetes最基本的操作單元,包含一個或多個緊密相關的容器,一個Pod可以被一個容器化的環境看作應用層的“邏輯宿主機”;一個Pod中的多個容器應用通常是緊密耦合的,Pod在Node上被創建、啓動或者銷燬;每個Pod裏運行着一個特殊的被稱之爲Pause的容器,其他容器則爲業務容器,這些業務容器共享Pause容器的網絡棧和Volume掛載卷,因此他們之間通信和數據交換更爲高效,在設計時我們可以充分利用這一特性將一組密切相關的服務進程放入同一個Pod中。

同一個Pod裏的容器之間僅需通過localhost就能互相通信。

 

一個Pod中的應用容器共享同一組資源:

  • PID命名空間:Pod中的不同應用程序可以看到其他應用程序的進程ID;
  • 網絡命名空間:Pod中的多個容器能夠訪問同一個IP和端口範圍;
  • IPC命名空間:Pod中的多個容器能夠使用SystemV IPC或POSIX消息隊列進行通信;
  • UTS命名空間:Pod中的多個容器共享一個主機名;
  • Volumes(共享存儲卷):Pod中的各個容器可以訪問在Pod級別定義的Volumes;

Pod的生命週期通過Replication Controller來管理;通過模板進行定義,然後分配到一個Node上運行,在Pod所包含容器運行結束後,Pod結束。

Kubernetes爲Pod設計了一套獨特的網絡配置,包括:爲每個Pod分配一個IP地址,使用Pod名作爲容器間通信的主機名等。

3、Service

在Kubernetes的世界裏,雖然每個Pod都會被分配一個單獨的IP地址,但這個IP地址會隨着Pod的銷燬而消失,這就引出一個問題:如果有一組Pod組成一個集羣來提供服務,那麼如何來訪問它呢?Service!

一個Service可以看作一組提供相同服務的Pod的對外訪問接口,Service作用於哪些Pod是通過Label Selector來定義的。

  • 擁有一個指定的名字(比如my-mysql-server);
  • 擁有一個虛擬IP(Cluster IP、Service IP或VIP)和端口號,銷燬之前不會改變,只能內網訪問;
  • 能夠提供某種遠程服務能力;
  • 被映射到了提供這種服務能力的一組容器應用上;

如果Service要提供外網服務,需指定公共IP和NodePort,或外部負載均衡器;

NodePort 

系統會在Kubernetes集羣中的每個Node上打開一個主機的真實端口,這樣,能夠訪問Node的客戶端就能通過這個端口訪問到內部的Service了

4、Volume

Volume是Pod中能夠被多個容器訪問的共享目錄。

5、Label

Label以key/value的形式附加到各種對象上,如Pod、Service、RC、Node等,以識別這些對象,管理關聯關係等,如Service和Pod的關聯關係。

6、RC(Replication Controller)

  • 目標Pod的定義;
  • 目標Pod需要運行的副本數量;
  • 要監控的目標Pod標籤(Lable);

Kubernetes通過RC中定義的Lable篩選出對應的Pod實例,並實時監控其狀態和數量,如果實例數量少於定義的副本數量(Replicas),則會根據RC中定義的Pod模板來創建一個新的Pod,然後將此Pod調度到合適的Node上啓動運行,直到Pod實例數量達到預定目標。

二、Kubernetes總體架構

Master和Node

Kubernetes將集羣中的機器劃分爲一個Master節點和一羣工作節點(Node)。其中,Master節點上運行着集羣管理相關的一組進程etcd、API Server、Controller Manager、Scheduler,後三個組件構成了Kubernetes的總控中心,這些進程實現了整個集羣的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能,並且全都是自動完成。在每個Node上運行Kubelet、Proxy、Docker daemon三個組件,負責對本節點上的Pod的生命週期進行管理,以及實現服務代理的功能。

 

流程 

通過Kubectl提交一個創建RC的請求,該請求通過API Server被寫入etcd中,此時Controller Manager通過API Server的監聽資源變化的接口監聽到這個RC事件,分析之後,發現當前集羣中還沒有它所對應的Pod實例,於是根據RC裏的Pod模板定義生成一個Pod對象,通過API Server寫入etcd,接下來,此事件被Scheduler發現,它立即執行一個複雜的調度流程,爲這個新Pod選定一個落戶的Node,然後通過API Server講這一結果寫入到etcd中,隨後,目標Node上運行的Kubelet進程通過API Server監測到這個“新生的”Pod,並按照它的定義,啓動該Pod並任勞任怨地負責它的下半生,直到Pod的生命結束。

隨後,我們通過Kubectl提交一個新的映射到該Pod的Service的創建請求,Controller Manager會通過Label標籤查詢到相關聯的Pod實例,然後生成Service的Endpoints信息,並通過API Server寫入到etcd中,接下來,所有Node上運行的Proxy進程通過API Server查詢並監聽Service對象與其對應的Endpoints信息,建立一個軟件方式的負載均衡器來實現Service訪問到後端Pod的流量轉發功能。

  • etcd 
    用於持久化存儲集羣中所有的資源對象,如Node、Service、Pod、RC、Namespace等;API Server提供了操作etcd的封裝接口API,這些API基本上都是集羣中資源對象的增刪改查及監聽資源變化的接口。
  • API Server 
    提供了資源對象的唯一操作入口,其他所有組件都必須通過它提供的API來操作資源數據,通過對相關的資源數據“全量查詢”+“變化監聽”,這些組件可以很“實時”地完成相關的業務功能。
  • Controller Manager 
    集羣內部的管理控制中心,其主要目的是實現Kubernetes集羣的故障檢測和恢復的自動化工作,比如根據RC的定義完成Pod的複製或移除,以確保Pod實例數符合RC副本的定義;根據Service與Pod的管理關係,完成服務的Endpoints對象的創建和更新;其他諸如Node的發現、管理和狀態監控、死亡容器所佔磁盤空間及本地緩存的鏡像文件的清理等工作也是由Controller Manager完成的。
  • Scheduler 
    集羣中的調度器,負責Pod在集羣節點中的調度分配。
  • Kubelet 
    負責本Node節點上的Pod的創建、修改、監控、刪除等全生命週期管理,同時Kubelet定時“上報”本Node的狀態信息到API Server裏。
  • Proxy 
    實現了Service的代理與軟件模式的負載均衡器。

客戶端通過Kubectl命令行工具或Kubectl Proxy來訪問Kubernetes系統,在Kubernetes集羣內部的客戶端可以直接使用Kuberctl命令管理集羣。Kubectl Proxy是API Server的一個反向代理,在Kubernetes集羣外部的客戶端可以通過Kubernetes Proxy來訪問API Server。

API Server內部有一套完備的安全機制,包括認證、授權和准入控制等相關模塊。

 

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