目錄
5.5、Replication Controller(RC)
視頻中老師打開的文檔路徑:E:\meWork\study\project\subject-3\subject-3-k8s\專題三-Kubernetes_學習文檔-N.docx
1、Docker 容器的優勢
模塊化、層和鏡像版本控制、回滾、快速部署
2、使用 Docker 時有哪些限制
Docker 本身非常適合管理單個容器。但隨着您開始使用越來越多的容器和容器化應用程序,並把它們劃分成數百個部分,很可能會導致管理和編排變得非常困難。最終,您需要後退一步,對容器實施分組,以便跨所有容器提供網絡、安全、遙測等服務。於是,Kubernetes 應運而生。
3、爲什麼需要kubernetes
Kubernetes:又稱爲k8s,或簡稱爲kube
k8s:首字母爲k,首字母與尾字母之間有8個字符、尾字母爲s,所以簡稱k8s
由於真實的生產型應用會涉及多個容器。這些容器必須跨多個服務器主機進行部署。
提供了一個便捷有效的平臺,在物理機和虛擬機集羣上調度、運行容器,可以將許多相同任務交給容器來執行。
Kubernetes還提供了與聯網、存儲、安全性、遙測,等其他服務集成整合,來提供全面的容器基礎架構。
4、kubernetes的用途
1、跨多臺主機進行容器編排
2、更加充分地利用硬件,最大程度獲取運行企業應用所需的資源
3、有效管控應用部署和更新,並實現自動化操作
4、掛載和增加存儲,用於運行有狀態的應用
5、快速、按需擴展容器化應用及其資源
6、對服務進行聲明式管理,保證所部署的應用始終按照部署的方式運行
7、利用自動佈局、自動重啓、自動複製、自動擴展功能,對應用實施狀況檢查、自我修復。
但是Kubernetes需要依賴其他項目來全面提供這些經過編排的服務,這些功能、項目如下:
功能 : 項目
1、註冊表:Atomic註冊表、Docker註冊表
2、聯網:OpenSwitch和智能邊緣路由
3、遙測:heapster、kibana、hawkular、elastic
4、安全性:LDAP、SELinux、RBAC、OAUTH等項目,以及多租戶層來實現
5、自動化:參照Ansible手冊進行安裝、集羣生命週期管理
6、服務:自帶預建版的應用模式的內容目錄來提供
5、kubernetes核心概念
Kubernetes由各種資源對象來描述整個集羣的運行狀態。
可以看作資源對象的有:Node、Pod、Replication Controller、Service
這些對象都需要通過調用Kubernetes api來進行創建、修改、刪除,並保存在etcd庫。
5.1、kubernetes對象都有兩個關鍵字段
每個kubernetes對象都有兩個關鍵字段:
Object Spec:描述對象所期望達到的狀態
Object Status:描述該對象的實際狀態
5.2、kubernetes集羣的兩種角色
5.2.1、Master
master是集羣的控制節點,通常會佔據一個獨立的服務器(如果要達到高可用部署:建議用3臺服務器)。
master是整個集羣的“首腦”,如果它宕機或不可用,那麼對集羣內容器應用的管理都將失效。
master也可以作爲工作負載節點,但在企業中儘量將master只作爲一個控制節點
master節點上運行的一組關鍵進程:
kube-apiserver(Kubernetes API Server):提供HTTP Rest接口的關鍵服務進程,是集羣控制的入口進程
是Kubernetes裏所有資源的增、刪、改、查等操作的唯一入口
kube-controller-manager(Kubernetes Controller Manager):Kubernetes裏所有資源對象的“大總管”
kube-scheduler(Kubernetes Scheduler):負責資源調度的進程(Pod調度),相當於公交公司的“調度室”
另外,在master節點上需要啓動一個etcd服務,來保存kubernetes裏的所有資源對象。
5.2.2、Node
除了Master,Kubernetes集羣中的其他機器被稱爲Node節點,在較早的版本中也被稱爲Minion。
Node節點是Kubernetes集羣的工作負載節點,每個Node都會被Master分配一下工作(Docker容器),當某個Node宕機時,其上的工作會被master自動轉移到其他節點上去。
Node節點上運行的一組關鍵進程:
kubelet:負責Pod對應的容器創建、啓動、停止等任務,與master節點密切協作,實現集羣管理的基本功能
kube-proxy:實現Kubernetes Service的通信與負載均衡機制
Docker Engine(Docker引擎):負責本機的容器創建和管理工作
默認情況下kubelet會向master註冊自己,一旦node被納入集羣管理範圍,kubelet進尺就會定時向master彙報自身的情況。
彙報的內容如:操作系統、Docker版本、機器的CPU、內存情況、當前有哪些Pod在運行
當某個node超過指定時間不上報信息時,會被master判斷爲“失聯”,node的狀態被標記爲不可用(Not Ready),隨後master會觸發“負載大轉移”的自動流程。
5.3、Pod
Pod是Kubernetes最重要、最基本的概念,每個Pod都有一個特殊的Pause容器(根容器),每個Pod還包含一個或多個緊密相關的用戶業務容器(User container)
Pause容器:保證Pod的健康
用戶業務容器:真實的docker容器
5.3.1、Pod的特殊組成結構
1、在一組容器作爲一個單元時,需要一個與業務無關、不容易死亡的容器(Pause容器),用這個容器的狀態代表整組容器的狀態。
2、Pod裏的多個業務容器:共享Pause容器的IP、共享Pause容器掛接的Volume(數據卷)
這樣就簡化了業務容器之間的通信、文件共享的問題。
在Kubernetes中,一個Pod裏的容器與另外主機上的Pod能夠直接通信,這是採用虛擬網絡層技術實現的(eg:Flannel、OpenSwitch等)
5.3.2、Pod的兩種類型
1、普通的Pod
1、普通Pod一旦被創建,就會被放入到etcd中存儲;
2、隨後會被Kubernetes Master調度到某個具體的Node上,並進行綁定(binding);
3、隨後該Pod被對應的Node上的kubelet進程實例化成一組相關的Docker容器,並啓動起來;
在默認情況下,當Pod裏的某個容器停止時,Kubernetes會自動檢測到這個問題,並重啓這個Pod(重啓Pod裏的所有容器),如果Pod所在的Node宕機,則會將這個Node上的所有Pod重新調度到其他節點上。
2、靜態Pod(Static Pod)
不存放在Kubernetes的etcd庫,存放在某個具體的Node上的具體文件中,並且只在該Node上啓動運行。
Pod、容器與Node的關係圖如下圖:
5.4、Label(標籤)
一些常用等label示例如下:
版本標籤:"release" : "stable"
"release" : "canary"
環境標籤:"environment" : "dev"
"environment" : "production"
dev就是development(開發)
pro就是production(生產)
架構標籤:"tier" : "frontend"
"tier" : "backend"
"tier" : "middleware"
分區標籤:"partition" : "customerA"
"partition" : "customerB"
質量管控標籤:"track" : "daily"
"track" : "weekly"
5.5、Replication Controller(RC)
RC也是kubernetes系統中的核心概念之一
RC是定義一個期望的場景,聲明某種Pod的副本數量在任意時刻都符合某個預期值。
RC定義的3個部分:
1、Pod期待的副本數(replicas);
2、用於篩選目標Pod的Label Selector;
3、當Pod的副本數量小於預期數量時,用於創建新Pod的Pod模板(template)。
5.6、Deployment
是kubernetes v1.2引入的概念,目的是爲了更好的解決Pod的編排問題。Deployment內部使用Replica Set實現。
Deployment可以看作RC的一次升級,兩者的相似度超過90%。
Deployment相對於RC的一個最大升級是我們隨時知道當前Pod“部署”的進度。實際上由於一個Pod的創建、調度、綁定節點及在目標Node上啓動對應的容器這一完整過程需要一定的時間,所以我們期待系統啓動N個Pod副本的目標狀態,實際上是一個連續變化的“部署過程”導致的最終狀態。
Deployment的使用場景:
1、創建一個Deplyment對象來生成對應的Replica Set,並完成Pod副本的創建過程。
2、檢查Deployment的狀態來看部署動作是否完成(Pod副本的數量是否達到預期的值)。
3、更新Deployment以創建新的Pod(eg:鏡像升級)。
4、如果當前Deployment不穩定,則回滾到一個早先的Deployment版本。
5、暫停Deployment,以便於一次性修改多個PodTemplateSpec 的配置項,之後再恢復Deployment,進行新的發佈。
6、擴展Deployment以應對高負載。
7、查看Deployment的狀態,以此作爲發佈是否成功的指標。
8、清理不再需要的舊版本ReplicaSets。
5.7、StatefulSet(狀態集)
Pod的管理對象都是無狀態的服務。(RC、Deployment、DaemonSet、Job)
MySQL集羣、MongoDB集羣、Kafka集羣、Zookeepere集羣,有如下4個共同點:
1、每個節點都有固定的身份ID,集羣中的成員通過這個ID相互發現、通信
2、集羣的規模是比較固定的,集羣規模不能隨意變動
3、集羣裏的每個節點都是有狀態的,通常會持久化數據到永久存儲中
4、如果磁盤損壞,則集羣裏的某個節點無法正常運行,集羣功能受損
StatefulSet是集羣中Pod掛接的某種共享存儲,爲了在其他節點上恢復某個失敗的節點時使用
Kubernetes從v1.4版本開始引入PetSet這個新的資源對象,在v1.5版本更名爲StatefulSet。
StatefulSet:可以看作Deployment/RC的一個特殊變種,它有如下3個特性:
1、StatefulSet裏的每個Pod都有穩定、唯一的網絡標識,用來與集羣內其他成員發現、通信
假設StatefulSet的名字叫kafka,那麼第一個Pod叫kafka-0,第二個Pod叫kafka-1......以此類推
2、StatefulSet控制Pod副本的啓動、停止順序
操作第n個Pod時,前n-1個Pod已經是運行且準備好的狀態
3、StatefulSet裏的Pod採用穩定的持久化存儲卷
通過PV/PVC來實現,刪除Pod時,默認不會刪除與StatefulSet相關的存儲卷(爲了保證數據的安全)
在每個StatefulSet的定義中要聲明它屬於哪個Headless Service。
Headless Service與普通Service的關鍵區別在於,它沒有Cluster IP。
StatefulSet在Headless Service的基礎上又爲StatefulSet控制的每個Pod實例創建了一個DNS域名,這個域名的格式爲:
$(podname).$(headless service name)
eg:一個3節點的Kafka的StatefulSet集羣,對應的Headless Service的名字爲kafka,StatefulSet的名字爲kafka,則StatefulSet裏面的3個Pod的DNS名稱分別爲kafka-0.kafka、kafka-1.kafka、kafka-2.kafka,這些DNS名稱可以直接在集羣的配置文件中固定下來
5.8、Service(服務)
Service也是Kubernetes裏最核心的資源對象之一。
Service其實就是我們說的微服務架構中的一個“微服務”。
Pod、RC、Service的邏輯關係如下圖:
5.9、Volume(存儲卷)
與docker的Volume比較類似,但不等價。
Volume是Pod中能夠被多個容器訪問的共享目錄。
Kubernetes支持多種類型的Volume,eg:Gluster、Ceph
5.10、Namespace
Namespace(命名空間):用於實現多租戶的資源隔離
通過將集羣內部的資源對象“分配”到不同的Namespace中,形成邏輯上的分組,便於不同分組在共享使用集羣資源的同時,還能被分別管理。
5.11、Annotation(註解)
與Label類似,也使用key/value鍵值對的形式進行定義。
只是Annotation可以用戶任意命名。
用Annotation記錄的信息如下:
1、build信息、release信息、Docker鏡像信息等
eg:時間戳、release id號、PR號、鏡像hash值、docker registry地址
2、日誌庫、監控庫、分析庫、等資源庫的地址信息
3、程序調試工具信息
eg:工具、版本號
4、團隊等聯繫信息
eg:電話號碼、負責人名稱、網址
5.12、Kubelet
運行在節點上的服務,可讀取容器清單(container manifest),確保指定的容器啓動並運行。
5.13、kubectl
Kubernetes 的命令行配置工具
在Kubernetes系統中還有許多輔助配置的資源對象,eg:LimitRange、Resurce。另外,一些系統內部使用的對象Binding、Event等請參考Kubernetes的API文檔。
6、kubernetes術語
官方把 kubernetes 術語分爲 12 個分類:系統結構、社區、核心對象、擴展、基礎、網絡、操作、安全、存儲、工具、用戶類型、工作負載
想要了解更多 kubernetes 術語,請參照官方術語表,地址:https://kubernetes.io/docs/reference/glossary/?fundamental=true
常用的術語有(這裏列了23個):Pods、Labels、Namespace、Replication Controller、Node、ReplicaSets、Services、
Volumes、PV/PVC/StorageClass、Deployment、Secret、StatefulSet、DaemonSet、ervice Account、CronJob、
Job、Security Context 和 PSP、Resource Quotas、Network Policy、Ingress、ThirdPartyResources、ConfigMap、
PodPreset。
Replication Controller的一次升級是ReplicaSets,ReplicaSets的一次升級是Deployment
6.1、k8s核心概念