1. 程式人生 > >Kubernetes學習筆記(1)

Kubernetes學習筆記(1)

水平擴展 bec 主機 轉移 else sca 問題 create TE

1 Kubernetes入門


1.1 Kubernetes是什麽?

k8s是一個基於容器技術的分布式架支持平臺,以實現資源管理的自動化以及跨多個數據中心的資源利用率的最大化。它具備完備的集群管理能力:

  • 多層次的安全防護和準入機制
  • 多租戶應用支撐
  • 透明的服務註冊和服務發現機制
  • 內建的智能負載均衡器
  • 強大的故障發現和自我修復
  • 服務滾動升級和在線擴容能力
  • 可擴展的資源自動調度機制
  • 多力度資源配額管理能力。

k8s基本知識

  • Service(虛擬Cluster IP + Service Port):分布式集群架構的核心。都是基於Socket通信方式對外提供服務(Redis、Memcache、MySQL、WebServer),實現沒狗哥具體業務的一個特定的TCP Server進程。
  • Pod:運行於節點(NOde)之上,包含一個Pause容器和若幹業務容器的對象。其他業務容器共享Pause容器的網絡棧和Volume卷。
  • K8s通過給Pod貼標簽(Label),然後給Service定義標簽選擇器(Label Selector,),進行Service和Pod進行關聯。並不是每個Pod和它裏面運行的容器都能“映射”到一個Service上,只有那些提供服務的一組Pod才會被“映射”成一個服務。
  • Master節點:運行著kube-apiserver、kube-controller-manager和kube-scheduler服務進程,實現整個集群的資源管理、Pod調度、彈性伸縮、安全控制、系統監控和糾錯等管理功能的節點。
  • Node節點:運行著kubelet、kube-proxy服務進程,負責Pod的創建、啟動、監控、重啟、銷毀,以及實現軟件模式的負載均衡器。
  • RC(Replication Controller):用來定義Pod、Pod運行副本數量、監控目標Pod的標簽。

1.2 為什麽要用Kubernetes?

  • k8s是當前唯一被業界廣泛認可和看好的Docker分布式系統解決方案。
  • k8s全面擁抱微服務器,微服務器的核心是將一個巨大的單體應用分解為很多小的互相連接的微服務,一個微服務背後可能有多個實例副本在支撐,副本的數量可能會伴隨著系統的負荷變化而進行調整,內嵌的負載均衡器在這裏發揮重要作用。
  • k8s可以隨時隨地搬遷上雲,切具備超強的橫向擴容能力。

1.3 Kubernets基本概念和術語

1.3.1 Master

  • 每個k8s集群裏需要一個Master節點來負責整個集群的管理和控制,關鍵進程如下:
  • Kubernetes API Server(kube-apiserver):提供了HTTP Rest接口的關鍵服務進程,是k8s裏所有資源的增刪改查等操作的唯一入口,也是集群控制的入口進程。
  • Kubernetes Controller Manager(kube-controller-manager):K8s裏所有資源的自動化控制中心。
  • Kbernetes Scheduler(kube-scheduler):負責資源調度(Pod調度)的進程。
  • etcd服務:k8s所有資源對象的數據全部是保存在etcd中的。

1.3.2 Node

  • Node節點是k8s集群中的工作負載節點,每個Node會被Master分配一些工作負載(Docker容器),當某個Node宕機時,其上的工作負載會被Master自動轉移到其他Node上去。
  • Node節點關鍵進程如下:
  • kubelet:負責Pod對應的容器的創建、啟停等任務,同時與Master節點密切協作,實現集群管理的基本功能。
  • kube-prox:實現Kubernetes Service 的通信與負載均衡機制的重要組件。
  • Dokcer Engine(docker):Docker 引擎,負責本機的容器創建和管理工作。
  • 常用命令:
  • # kubectl get nodes //查看Nodes
  • # kubectl describe node k8s-node-1 //查看某個node信息

1.3.3 Pod

  • Pod:由一個Pause容器(根容器)和若幹個業務容器組成。引入業務無關並且不易死亡的Pause容器作為Pod的根容器,以它的狀態代表整個容器組的狀態。Pod裏的多個業務容器共享Pause容器的IP和Volume,解決業務容器之間的通信問題和文件共享問題。
  • 普通Pod:一經創建,就會被放入到etcd中存儲,隨後被Master調度到某個具體的Node上並進行綁定(Binding),隨後該Pod被對應的Node上的kubelet進程實例化成一組相關的Dokcer容器並啟動起來。
  • Pod Volume定義在Pod之上,可以用分布式文件系統GlusterFS實現後端存儲,然後被各種容器掛在到自己的文件系統中。
  • Event是一個事件的記錄,記錄了事件的最早產生時間、最後重現時間、重復次數、發起者、類型,以及導致此事件的原因等眾多信息。
  • 每個Pod都可以對其能使用的服務器上的計算資源設置限額,CPU以千分之一為最小配額單位,用m表示。100~300m,即占用0.1~0.3個CPU。Memory配額也是絕對值,單位是內存字節數,MiB。
  • #kubectl describe pod xxxx //查看pod信息

1.3.4 Label

  • Label(標簽):Label是一個key=value的鍵值對,打過Label後,隨後可以通過Label Selector(標簽選擇器)查詢和篩選擁有某些Label的資源對象。
  • Label Selector 在Kubernetes中的重要使用場景:
  • kube-controller進程通過資源對象RC上定義的Label Selector來篩選要監控的Pod副本的數量,從而實現Pod副本的數量始終符合預期設定的全自動控制流程。
  • kube-proxy進程通過Service的Label Selector 來選擇對應的Pod,自動建立起每個Service到對應Pod的請求轉發路由表,從而實現Service的智能負載均衡機制。
  • 通過對某些Node定義特定的Label,並且在Pod定義文件中使用NodeSelector 這種標簽調度策略,kube-scheduler進程可以實現Pod“定向調度”的特性。
  • 使用Label可以給對象創建多組標簽,Label和Label Selector 共同構成了kubernetes系統中最核心的應用模型,使得被管理對象能夠被精細的分組管理,同時實現了整個集群的高可用性。

1.3.5 Replication Controller

  • RC定義了一個期望場景,即聲明某種Pod的副本數量在任意時刻都符合某個預期值,RC的定義包括:
  • Pod期待的副本數
  • 用於篩選目標Pod的Label Selector
  • 當Pod的副本數量小於預期數量時,用於創建新Pod的Pod模板(template)。
  • 通過RC機制,k8s很容易實現停止一個舊版本Pod,創建一個新版本Pod,此消彼長,這種“滾動升級”。

1.3.6 Deployment

  • Deployment(內部使用Replica Set來實現),為了更好的解決Pod的編排問題。可以看為RC的一次升級,相速度超過90%。
  • 相比RC,Deployment最大升級是隨時知道當前Pod“部署”的進度。
  • # kubectl create -f tomcat-deployment.yaml
  • # kubectl get deployments //查看Deployment信息
  • # kubectl get rs //查看對應的Replica Set
  • # kubectl get pods //查看Pods
  • # kubectl describe deployments //查看Deployment控制的Pod的水平擴展過程。

1.3.7 Horizontal Pod Autoscaler

  • HPA也屬於k8s資源對象,通過跟蹤分析RC控制的所有目標Pod的負載變化情況,來確定是否需要針對性地調整目標Pod的副本數。HPA有兩種方式作為Pod負載的度量指標。
  • CPUUtilizationPercentage(CPU利用率),即目標Pod所有副本自身的CPU利用率的平均值。
  • TPS或QPS(應用程序自定義的度量指標),比如服務在每秒內的響應的請求數。

1.3.8 StatefulSet

  • StatefulSet裏的每個Pod都有穩定、唯一的網絡標識,可以用來發現集群內的其他成員。
  • StatefulSet控制的Pod副本的啟停順序受控。
  • StatefulSet裏的Pod采用穩定的持久化存儲卷,通過PV/PVC來實現,刪除Pod時默認不刪除與StatefulSet相關的存儲卷。

1.3.9 Service

  • k8s裏的每個Service其實就是微服務架構中的一個“微服務”。k8s的Service定義了一個服務的訪問入口地址,前端的應用(Pod)通過這個入口地址訪問其背後的一組由Pod副本組成的集群實例,Service與其後端Pod副本集群之間則是通過LabelSelector來實現“無縫對接”。RC的作用實際上是保證Service的服務能力和服務質量始終處於預期的標準。
  • K8s所提供的微服務網格架構,即通過分析、識別並建模系統中的所有服務為微服務——k8s Service,最終我們的系統由多個提供不同業務能力而又彼此獨立的微服務單元組成,服務之間通過TCP/IP進行通信,從而形成了我們強大而又靈活的彈性網格,擁有了強大的分布式能力、彈性擴展能力、容錯能力。
  • k8s的服務發現機制:前期使用Linux環境變量解決,後面通過Add-ON增值包的方引入DNS系統,把服務名作為DNS域名,直接通過服務名建立通信。
  • IP:
  • Node IP:Node節點IP地址,k8Is集群之外的節點訪問k8s集群之內的節點或者TCP/IP服務時,必須通過Node IP進行通信。
  • Pod IP:Pod IP地址,Dokcer Engine根據docker0網橋的IP地址段進行分配的,是個一個虛擬的二層網絡。k8s內一個Pod裏的容器訪問另外一個Pod裏的容器,就是通過Pod IP所在的虛擬二層網絡進行通信的,而真實的TCP/IP流量則是通過Node IP所在的物理網卡流出的。
  • Cluster IP:Service IP地址,又k8s管理和分配給Service對象的IP地址,無法被Ping,只能結合Service Port組成一個具體的通信端口,屬於k8s集群內部的地址。

1.3.10 Volume

  • Volume是Pod中能夠被多個容器訪問的共享目錄。類似於Docker的Volume,但不等價。首先,k8s的Volume定義在Pod上,被一個Pod裏的多個容器掛載使用,且與Pod的生命周期相同,和容器不相關,容器終止或重啟時,Volume數據不丟失。
  • Volume類型:
  • emptyDir:由k8s自動分配的忙碌,當Pod從Node上移除時,emptyDir數據會被永久刪除。一般作為臨時空間。
  • hostPath:Pod上掛載宿主機上的文件或目錄。
  • gcePersistentDisk:使用谷歌公有雲提供的永久磁盤(PD)。
  • awsElasticBlockStore:使用亞馬遜公有雲提供的EBS Volume存儲數據。
  • NFS:使用網絡文件系統提供的共享目錄存儲數據。
  • 其他:iscsi,flocker,glusterfs,rbd,gitRepo,secret

1.3.11 Persistent Volume

  • PV可以理解成k8s集群中的某個網絡存儲中對應的一塊存儲,PV只能是網絡存儲,PV並不是定義在Pod上,獨立於Pod之外。
  • PV的accessModes屬性:
  • ReadWriteOnce:讀寫權限、並且只能被單個Node掛載
  • ReadOnlyMany:只讀權限,允許被多個Node掛載
  • ReadWriteMany:讀寫權限,允許被多個Node掛載
  • PV的狀態:Available(空閑狀態)、Bound(已綁定到某個PVC上)、Released(對應的PVC已刪除,但資源未被集群收回)

1.3.12 Namespace

  • Names用於實現多租戶的資源隔離。我們可以給每一個租戶創建一個Namespace來實現多租戶的資源隔離,結合k8s的資源配額管理,限定不同租戶能占用的資源,例如CPU、內存使用量等。
  • 1.3.13 Annotation(註解)
  • Annotation使用鍵值對形式定義,是用戶可以任意定義的“附加信息”,以便於外部工具進行查找。

Kubernetes學習筆記(1)