Kubernetes(k8s)是Google開源的容器集群管理系統。在Docker技術的基礎上,為容器化的應用提供部署運行、資源調度、服務發現和動態伸縮等一系列完整功能,提高了大規模容器集群管理的便捷性。
Kubernetes最主要的設計思想是,從更宏觀的角度,以統一的方式來定義任務之間的各種關系,并且為將來支持更多種類的任務留足余地。
Kubernetes所擅長的,是按照用戶的意愿和整個系統的規則,完全自動化地處理好容器之間的各種關系。這種功能,就是我們經常聽到的一個概念:編排。所以說,Kubernetes的本質,是為用戶提供一個具有普遍意義的容器編排工具。
k8s中幾個重要概念
(1) Cluster,Cluster是 計算、存儲和網絡資源的集合,k8s利用這些資源運行各種基于容器的應用。
(2) Master, Master是cluster的大腦,他的主要職責是調度,即決定將應用放在那里運行。master運行linux操作系統,可以是物理機或者虛擬機。為了實現高可用,可以運行多個master。
(3) Node, Node的職責是運行容器應用。node由master管理,node負責監控并匯報容器的狀態,同時根據master的要求管理容器的生命周期。node運行在linux的操作系統上,可以是物理機或者是虛擬機。
(4),pod,pod是k8s的最小工作單元。每個pod可以包含一個或者多個容器。pod中的容器會作為一個整體被master調度到一個node上運行。 Pod有兩種使用方式,運行單一容器和運行多個容器, 運行單一容器是Kubernetes 最常見的模型,即便是只有一個容器,Kubernetes 管理的也是Pod 而不是直接管理容器。而pod中運行多個容器的話,哪些容器應該放到一個Pod中?答案是:這些容器聯系必須非常緊密,而且需要直接共享資源。
(5)controller, k8s不會直接創建pod,而是通過controller來管理pod的。controller中定義了pod的部署特性,比如有幾個副本,在什么樣的node上運行等。為了滿足不同的業務場景,k8s提供了多種controller,包括Replication Controller(RC)、Replica Set(RS)、Deployment 、daemonset、statefulset、job等。
RC是K8s集群中最早的保證Pod高可用的API對象,通過監控運行中的Pod來保證集群中運行指定數目的Pod副本。指定的數目可以是多個也可以是1個;少于指定數目,RC就會啟動運行新的Pod副本;多于指定數目,RC就會殺死多余的Pod副本。即使在指定數目為1的情況下,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發揮它高可用的能力,保證永遠有1個Pod在運行。
(6)Replica Set (RS)
RS是新一代RC,提供同樣的高可用能力,區別主要在于RS后來居上,能支持更多種類的匹配模式。RS對象一般不單獨使用,而是作為Deployment的理想狀態參數使用。使用deployment時會自動創建Replica Set ,也就是說deployment是通過Replica.Set來管理pod的多個副本的,我們通常不需要直接使用Replica Set 。
(7) deployment(部署)
Deployment表示用戶對K8s集群的一次更新操作,它是一個比RS應用模式更廣的API對象,可以是創建一個新的服務,更新一個新的服務,也可以是滾動升級一個服務。以K8s的發展方向,未來對所有長期伺服型的的業務的管理,都會通過Deployment來管理。
(8) daemonset(后臺支撐型服務)
長期伺服型和批處理型服務的核心在業務應用,可能有些節點運行多個同類業務的Pod,有些節點上又沒有這類Pod運行;而后臺支撐型服務的核心關注點在K8s集群中的節點(物理機或虛擬機),要保證每個節點上都有一個此類Pod運行。節點可能是所有集群節點選定的一些特定節點。典型的后臺支撐型服務包括,存儲,日志和監控等在每個節點上支持K8s集群運行的服務。
(9) statefuleset
能夠保證pod的每個副本在整個生命周期中名稱是不變的,而其他controller不提供這個功能。當某個pod發生故障需要刪除并重新啟動時,pod的名稱不會發生變化,同時statefulset會保證副本按照固定的順序啟動、更新或者刪除。、
(10) job 用于運行結束就刪除的應用,而其他controller中的pod通常是長期持續運行的。
(11) service, deployment可以部署多個副本,每個pod 都有自己的IP,外界如何訪問這些副本那?答案是service。
k8s的service定義了外界訪問一組特定pod的方式。service有自己的IP和端口,service為pod提供了負載均衡。
k8s運行容器pod與訪問容器這兩項任務分別由controller和service執行。
(12)、namespace
可以將一個物理的cluster邏輯上劃分成多個虛擬cluster,每個cluster就是一個namespace。不同的namespace里的資源是完全隔離的。Kubernetes 默認創建了兩個
Kubernetes 默認創建了兩個,Namespace。default -- 創建資源時如果不指定,將被放到這個
Namespace 中。kube-system:Kubernetes 自己創建的系統資源將放到這個Namespace 中
1、k8s中master的組成
(1) API, Server(kube-apiserver),API Server是k8s的前端接口,各種客戶端工具以及k8s其他組件可以通過它管理集群的各種資源。
(2) Scheduler(kube-scheduler),scheduer負責決定將pod放在哪個node上運行。另外scheduler在調度時會充分考慮集群的架構,當前各個節點的負載,以及應用對高可用、性能、數據親和性的需求。
(3) Controller,Manager(kube-controller-manager),負責維護集群的狀態,比如故障檢測、自動擴展、滾動更新等。Controller
Manager 由多種 controller組成,包括 replication controller、endpoints,controller、namespace,controller、serviceaccounts controller 等。
不同的 controller管理不同的資源。例如 replication controller 管理 Deployment、StatefulSet、DaemonSet 的生命周期,namespace controller 管理 Namespace資源。
(4)etcd
負責保存k8s集群的配置信息和各種資源的狀態信息,K8S中所有的服務節點的信息數據、配置數據都是存儲在ETCD中,當數據發生變化時,etcd會快速的通知k8s相關組件。
(5)pod網絡(flannel )
pod要能夠相互通信,k8s集群必須掌握pod網絡,flannel是其中一個可選的方案。
k8s中node的組成
(1)kubelet,? 是node的agent,當scheduler去確定在某個node上運行pod后,會將pod的具體配置信息發送給該節點的kubelet,kubelet會根據這些信息創建和運行容器,并向master報告運行狀態。
(2)kube-proxy, service 在邏輯上代表了后端的多個 Pod,外界通過service 訪問 Pod。service接收到的請求是如何轉發到 Pod 的呢?這就是kube-proxy要完成的工作。proxy是配合service實現從pod到service, 以及從外部的node? port到service的訪問。每個 Node都會運行 kube-proxy 服務,它負責將訪問 service 的 TCP/UPD,數據流轉發到后端的容器。如果有多個副本,kube-proxy會實現負載均衡。
(3)pod網絡, pod能能夠互相通信,k8s集群必須部署pod網絡,flannel是其中一個可以選擇的方案
1.? ?kubectl發送部署deployment的請求到API Server。
2、API Server通知Controller Manager創建一個deployment資源。
3、Deployment controller向API Server發送創建ReplicaSet的需求。
4、ReplicaSet通知ReplicaSet controller啟動。
5、ReplicaSet controller發送創建Pod需求到API Server
6、API Server通知Scheduler執行調度任務
7、Scheduler根據副本數將分配Pod到集群中的node節點
8、API Server通知對應的node節點上面的kubelet組件準備創建pod
9、kubelet告訴docker在本節點上運行容器。
10、docker在節點上運行一個或多個容器。
Deployment 的概念
作為最常用的Kubernetes對象,Deployment經常會用來創建 ReplicaSet和Pod,我們往往不會直接在集群中使用ReplicaSet部署一個新的微服務,一方面是因為ReplicaSet 的功能其實不夠強大,一些常見的更新、擴容和縮容運維操作都不支持,Deployment的引入就是為了支持這些復雜的操作
Deployment 執行流程總結
最后,總結一下deployment實現的過程:
(1)首先用戶通過 kubectl 創建Deployment。
(2)接著,Deployment創建 ReplicaSet。
(3)然后,ReplicaSet 創建Pod
(4)最后,pod在每個節點上通過kubelet調用docker完成容器創建。
這個工作就變成了一個挑戰,而且全部停止了服務,再逐步升級的方式會導致服務較長時間不可用。針對這個問題,k8s提供了滾動更新(rolling-update)的方式來解決上述問題。滾動更新是針對pod來操作的,它通過一次只更新一小部分副本,成功后,再更新更多的副本,最終完成所有副本的更新。滾動更新的最大的好處是零停機,整個更新過程始終有副本在運行,從而保證了服務的連續性。
Kubectl?get 命令?:獲得資源信息
# 查看所有的資源信息
$ kubectl get all
$ kubectl get --all-namespaces
# 查看pod列表
$ kubectl get pod
# 顯示pod節點的標簽信息
$ kubectl get pod --show-labels
# 根據指定標簽匹配到具體的pod
$ kubectl get pods -l app=example
# 查看node節點列表
$ kubectl get node
# 顯示node節點的標簽信息
$ kubectl get node --show-labels
# 查看pod詳細信息,也就是可以查看pod具體運行在哪個節點上(ip地址信息)
$ kubectl get pod -o wide
# 查看服務的詳細信息,顯示了服務名稱,類型,集群ip,端口,時間等信息
$ kubectl get svc
$ kubectl get svc -n kube-system
# 查看命名空間
$ kubectl get ns
$ kubectl get namespaces
# 查看所有pod所屬的命名空間
$ kubectl get pod --all-namespaces
# 查看所有pod所屬的命名空間并且查看都在哪些節點上運行
$ kubectl get pod --all-namespaces? -o wide
# 查看目前所有的replica set,顯示了所有的pod的副本數,以及他們的可用數量以及狀態等信息
$ kubectl get rs
# 查看已經部署了的所有應用,可以看到容器,以及容器所用的鏡像,標簽等信息
$ kubectl get deploy -o wide
$ kubectl get deployments -o wide