Kubernetes(k8s)是Google開源的容器集群管理系統(tǒng)纵竖。在Docker技術(shù)的基礎(chǔ)上漠烧,為容器化的應(yīng)用提供部署運行、資源調(diào)度靡砌、服務(wù)發(fā)現(xiàn)和動態(tài)伸縮等一系列完整功能已脓,提高了大規(guī)模容器集群管理的便捷性。
Kubernetes最主要的設(shè)計思想是通殃,從更宏觀的角度度液,以統(tǒng)一的方式來定義任務(wù)之間的各種關(guān)系厕宗,并且為將來支持更多種類的任務(wù)留足余地。
Kubernetes所擅長的堕担,是按照用戶的意愿和整個系統(tǒng)的規(guī)則已慢,完全自動化地處理好容器之間的各種關(guān)系。這種功能霹购,就是我們經(jīng)常聽到的一個概念:編排佑惠。所以說,Kubernetes的本質(zhì)齐疙,是為用戶提供一個具有普遍意義的容器編排工具膜楷。
k8s中幾個重要概念
(1) Cluster,Cluster是 計算、存儲和網(wǎng)絡(luò)資源的集合贞奋,k8s利用這些資源運行各種基于容器的應(yīng)用赌厅。
(2) Master, Master是cluster的大腦,他的主要職責(zé)是調(diào)度轿塔,即決定將應(yīng)用放在那里運行特愿。master運行l(wèi)inux操作系統(tǒng),可以是物理機或者虛擬機勾缭。為了實現(xiàn)高可用揍障,可以運行多個master。
(3) Node, Node的職責(zé)是運行容器應(yīng)用漫拭。node由master管理亚兄,node負責(zé)監(jiān)控并匯報容器的狀態(tài),同時根據(jù)master的要求管理容器的生命周期采驻。node運行在linux的操作系統(tǒng)上审胚,可以是物理機或者是虛擬機。
(4),pod,pod是k8s的最小工作單元礼旅。每個pod可以包含一個或者多個容器膳叨。pod中的容器會作為一個整體被master調(diào)度到一個node上運行。 Pod有兩種使用方式痘系,運行單一容器和運行多個容器菲嘴, 運行單一容器是Kubernetes 最常見的模型,即便是只有一個容器汰翠,Kubernetes 管理的也是Pod 而不是直接管理容器龄坪。而pod中運行多個容器的話,哪些容器應(yīng)該放到一個Pod中复唤?答案是:這些容器聯(lián)系必須非常緊密健田,而且需要直接共享資源。
(5)controller, k8s不會直接創(chuàng)建pod,而是通過controller來管理pod的佛纫。controller中定義了pod的部署特性妓局,比如有幾個副本总放,在什么樣的node上運行等。為了滿足不同的業(yè)務(wù)場景好爬,k8s提供了多種controller局雄,包括Replication Controller(RC)、Replica Set(RS)存炮、Deployment 炬搭、daemonset、statefulset僵蛛、job等尚蝌。
RC是K8s集群中最早的保證Pod高可用的API對象,通過監(jiān)控運行中的Pod來保證集群中運行指定數(shù)目的Pod副本充尉。指定的數(shù)目可以是多個也可以是1個;少于指定數(shù)目衣形,RC就會啟動運行新的Pod副本驼侠;多于指定數(shù)目,RC就會殺死多余的Pod副本谆吴。即使在指定數(shù)目為1的情況下倒源,通過RC運行Pod也比直接運行Pod更明智,因為RC也可以發(fā)揮它高可用的能力句狼,保證永遠有1個Pod在運行笋熬。
(6)Replica Set (RS)
RS是新一代RC,提供同樣的高可用能力腻菇,區(qū)別主要在于RS后來居上胳螟,能支持更多種類的匹配模式。RS對象一般不單獨使用筹吐,而是作為Deployment的理想狀態(tài)參數(shù)使用糖耸。使用deployment時會自動創(chuàng)建Replica Set ,也就是說deployment是通過Replica.Set來管理pod的多個副本的丘薛,我們通常不需要直接使用Replica Set 嘉竟。
(7) deployment(部署)
Deployment表示用戶對K8s集群的一次更新操作,它是一個比RS應(yīng)用模式更廣的API對象洋侨,可以是創(chuàng)建一個新的服務(wù)舍扰,更新一個新的服務(wù),也可以是滾動升級一個服務(wù)希坚。以K8s的發(fā)展方向边苹,未來對所有長期伺服型的的業(yè)務(wù)的管理,都會通過Deployment來管理吏够。
(8) daemonset(后臺支撐型服務(wù))
長期伺服型和批處理型服務(wù)的核心在業(yè)務(wù)應(yīng)用勾给,可能有些節(jié)點運行多個同類業(yè)務(wù)的Pod滩报,有些節(jié)點上又沒有這類Pod運行;而后臺支撐型服務(wù)的核心關(guān)注點在K8s集群中的節(jié)點(物理機或虛擬機)播急,要保證每個節(jié)點上都有一個此類Pod運行脓钾。節(jié)點可能是所有集群節(jié)點選定的一些特定節(jié)點。典型的后臺支撐型服務(wù)包括桩警,存儲可训,日志和監(jiān)控等在每個節(jié)點上支持K8s集群運行的服務(wù)。
(9) statefuleset
能夠保證pod的每個副本在整個生命周期中名稱是不變的捶枢,而其他controller不提供這個功能握截。當某個pod發(fā)生故障需要刪除并重新啟動時,pod的名稱不會發(fā)生變化烂叔,同時statefulset會保證副本按照固定的順序啟動谨胞、更新或者刪除。蒜鸡、
(10) job 用于運行結(jié)束就刪除的應(yīng)用胯努,而其他controller中的pod通常是長期持續(xù)運行的。
(11) service, deployment可以部署多個副本逢防,每個pod 都有自己的IP叶沛,外界如何訪問這些副本那?答案是service忘朝。
k8s的service定義了外界訪問一組特定pod的方式灰署。service有自己的IP和端口,service為pod提供了負載均衡局嘁。
k8s運行容器pod與訪問容器這兩項任務(wù)分別由controller和service執(zhí)行溉箕。
(12)、namespace
可以將一個物理的cluster邏輯上劃分成多個虛擬cluster导狡,每個cluster就是一個namespace约巷。不同的namespace里的資源是完全隔離的。Kubernetes 默認創(chuàng)建了兩個
Kubernetes 默認創(chuàng)建了兩個,Namespace旱捧。default -- 創(chuàng)建資源時如果不指定独郎,將被放到這個
Namespace 中。kube-system:Kubernetes 自己創(chuàng)建的系統(tǒng)資源將放到這個Namespace 中
1枚赡、k8s中master的組成
(1) API, Server(kube-apiserver),API Server是k8s的前端接口氓癌,各種客戶端工具以及k8s其他組件可以通過它管理集群的各種資源。
(2) Scheduler(kube-scheduler),scheduer負責(zé)決定將pod放在哪個node上運行贫橙。另外scheduler在調(diào)度時會充分考慮集群的架構(gòu)贪婉,當前各個節(jié)點的負載,以及應(yīng)用對高可用卢肃、性能疲迂、數(shù)據(jù)親和性的需求才顿。
(3) Controller,Manager(kube-controller-manager),負責(zé)維護集群的狀態(tài),比如故障檢測尤蒿、自動擴展诀蓉、滾動更新等红选。Controller
Manager 由多種 controller組成雷逆,包括 replication controller壤追、endpoints,controller、namespace,controller示弓、serviceaccounts controller 等讳侨。
不同的 controller管理不同的資源。例如 replication controller 管理 Deployment奏属、StatefulSet跨跨、DaemonSet 的生命周期,namespace controller 管理 Namespace資源囱皿。
(4)etcd
負責(zé)保存k8s集群的配置信息和各種資源的狀態(tài)信息歹叮,K8S中所有的服務(wù)節(jié)點的信息數(shù)據(jù)、配置數(shù)據(jù)都是存儲在ETCD中铆帽,當數(shù)據(jù)發(fā)生變化時,etcd會快速的通知k8s相關(guān)組件德谅。
(5)pod網(wǎng)絡(luò)(flannel )
pod要能夠相互通信爹橱,k8s集群必須掌握pod網(wǎng)絡(luò),flannel是其中一個可選的方案窄做。
k8s中node的組成
(1)kubelet,? 是node的agent愧驱,當scheduler去確定在某個node上運行pod后,會將pod的具體配置信息發(fā)送給該節(jié)點的kubelet椭盏,kubelet會根據(jù)這些信息創(chuàng)建和運行容器组砚,并向master報告運行狀態(tài)。
(2)kube-proxy, service 在邏輯上代表了后端的多個 Pod掏颊,外界通過service 訪問 Pod糟红。service接收到的請求是如何轉(zhuǎn)發(fā)到 Pod 的呢?這就是kube-proxy要完成的工作乌叶。proxy是配合service實現(xiàn)從pod到service盆偿, 以及從外部的node? port到service的訪問。每個 Node都會運行 kube-proxy 服務(wù)准浴,它負責(zé)將訪問 service 的 TCP/UPD,數(shù)據(jù)流轉(zhuǎn)發(fā)到后端的容器事扭。如果有多個副本,kube-proxy會實現(xiàn)負載均衡乐横。
(3)pod網(wǎng)絡(luò), pod能能夠互相通信求橄,k8s集群必須部署pod網(wǎng)絡(luò)今野,flannel是其中一個可以選擇的方案
1.? ?kubectl發(fā)送部署deployment的請求到API Server。
2罐农、API Server通知Controller Manager創(chuàng)建一個deployment資源条霜。
3、Deployment controller向API Server發(fā)送創(chuàng)建ReplicaSet的需求啃匿。
4蛔外、ReplicaSet通知ReplicaSet controller啟動。
5溯乒、ReplicaSet controller發(fā)送創(chuàng)建Pod需求到API Server
6夹厌、API Server通知Scheduler執(zhí)行調(diào)度任務(wù)
7、Scheduler根據(jù)副本數(shù)將分配Pod到集群中的node節(jié)點
8裆悄、API Server通知對應(yīng)的node節(jié)點上面的kubelet組件準備創(chuàng)建pod
9矛纹、kubelet告訴docker在本節(jié)點上運行容器。
10光稼、docker在節(jié)點上運行一個或多個容器或南。
Deployment 的概念
作為最常用的Kubernetes對象,Deployment經(jīng)常會用來創(chuàng)建 ReplicaSet和Pod艾君,我們往往不會直接在集群中使用ReplicaSet部署一個新的微服務(wù)采够,一方面是因為ReplicaSet 的功能其實不夠強大,一些常見的更新冰垄、擴容和縮容運維操作都不支持蹬癌,Deployment的引入就是為了支持這些復(fù)雜的操作
Deployment 執(zhí)行流程總結(jié)
最后,總結(jié)一下deployment實現(xiàn)的過程:
(1)首先用戶通過 kubectl 創(chuàng)建Deployment虹茶。
(2)接著逝薪,Deployment創(chuàng)建 ReplicaSet。
(3)然后蝴罪,ReplicaSet 創(chuàng)建Pod
(4)最后董济,pod在每個節(jié)點上通過kubelet調(diào)用docker完成容器創(chuàng)建。
這個工作就變成了一個挑戰(zhàn)要门,而且全部停止了服務(wù)虏肾,再逐步升級的方式會導(dǎo)致服務(wù)較長時間不可用。針對這個問題暂衡,k8s提供了滾動更新(rolling-update)的方式來解決上述問題询微。滾動更新是針對pod來操作的,它通過一次只更新一小部分副本狂巢,成功后撑毛,再更新更多的副本,最終完成所有副本的更新。滾動更新的最大的好處是零停機藻雌,整個更新過程始終有副本在運行雌续,從而保證了服務(wù)的連續(xù)性。
Kubectl?get 命令?:獲得資源信息
# 查看所有的資源信息
$ kubectl get all
$ kubectl get --all-namespaces
# 查看pod列表
$ kubectl get pod
# 顯示pod節(jié)點的標簽信息
$ kubectl get pod --show-labels
# 根據(jù)指定標簽匹配到具體的pod
$ kubectl get pods -l app=example
# 查看node節(jié)點列表
$ kubectl get node
# 顯示node節(jié)點的標簽信息
$ kubectl get node --show-labels
# 查看pod詳細信息胯杭,也就是可以查看pod具體運行在哪個節(jié)點上(ip地址信息)
$ kubectl get pod -o wide
# 查看服務(wù)的詳細信息驯杜,顯示了服務(wù)名稱,類型做个,集群ip鸽心,端口,時間等信息
$ kubectl get svc
$ kubectl get svc -n kube-system
# 查看命名空間
$ kubectl get ns
$ kubectl get namespaces
# 查看所有pod所屬的命名空間
$ kubectl get pod --all-namespaces
# 查看所有pod所屬的命名空間并且查看都在哪些節(jié)點上運行
$ kubectl get pod --all-namespaces? -o wide
# 查看目前所有的replica set居暖,顯示了所有的pod的副本數(shù)顽频,以及他們的可用數(shù)量以及狀態(tài)等信息
$ kubectl get rs
# 查看已經(jīng)部署了的所有應(yīng)用,可以看到容器太闺,以及容器所用的鏡像糯景,標簽等信息
$ kubectl get deploy -o wide
$ kubectl get deployments -o wide