什么是Kubernetes
Kubernetes 是 Google 開源的基于容器技術(shù)的分布式架構(gòu)領(lǐng)先方案,提供應(yīng)用部署、維護(hù)、擴(kuò)展機(jī)制等功能,利用 Kubernetes 能方便地管理跨機(jī)器運(yùn)行容器化的應(yīng)用。
單容器( contianer )所遇到的問題
- 需要被管理
- 網(wǎng)絡(luò)環(huán)境復(fù)雜
- 容器需要被調(diào)度、分發(fā),以及配置負(fù)載均衡
- 數(shù)據(jù)需要被保存在其他地方
即
- 使用 Docker 對(duì)應(yīng)用程序打包、實(shí)例化、運(yùn)行
- 以集群的方式運(yùn)行、管理跨機(jī)器的容器
- 解決 Docker 跨機(jī)器容器之間的通訊問題
核心概念
分為 master 和 node 節(jié)點(diǎn),master 為集群控制節(jié)點(diǎn)
master 節(jié)點(diǎn)通常會(huì)占據(jù)一個(gè)獨(dú)立的服務(wù)器(高可用部署建議使用三臺(tái)服務(wù)器(如果 master 和 etcd 部在一起的話))
master上:etcd, controller, scheduler, api server
- etcd: key-value 存儲(chǔ),集群狀態(tài)管理,是運(yùn)行在多節(jié)點(diǎn)上的分布式鍵值存儲(chǔ),高可用(奇數(shù)個(gè),必須半數(shù)以上的選舉,容錯(cuò)能力限制于節(jié)點(diǎn)數(shù)的一半,選舉 raft)
- controller:控制器(多個(gè)控制器組成)選舉
- scheduler:調(diào)度器,負(fù)責(zé)資源調(diào)度(pod 調(diào)度)的進(jìn)程 選舉。scheduler 的職責(zé)很明確,就是負(fù)責(zé)調(diào)度 pod 到合適的 Node 上。如果把 scheduler 看成一個(gè)黑匣子,那么它的輸入是 pod 和由多個(gè) Node 組成的列表,輸出是 Pod 和一個(gè) Node 的綁定,即將這個(gè) pod 部署到這個(gè) Node 上。Kubernetes 目前提供了調(diào)度算法,但是同樣也保留了接口,用戶可以根據(jù)自己的需求定義自己的調(diào)度算法。
- api server:暴露接口,處理請(qǐng)求。提供了資源操作的唯一入口,并提供認(rèn)證、授權(quán)、訪問控制、API 注冊(cè)和發(fā)現(xiàn)等機(jī)制。APIServer負(fù)責(zé)對(duì)外提供RESTful的 Kubernetes API 服務(wù),它是系統(tǒng)管理指令的統(tǒng)一入口,任何對(duì)資源進(jìn)行增刪改查的操作都要交給 APIServer 處理后再提交給 etcd,kubectl( Kubernetes 提供的客戶端工具,該工具內(nèi)部就是對(duì) Kubernetes API 的調(diào)用)是直接和 APIServer 交互的。
node上:kubelet, kubeproxy, runtime
- kubelet:管理 pod,負(fù)責(zé) pod 對(duì)應(yīng)的容器的創(chuàng)建、啟停等任務(wù),同時(shí)與 master 節(jié)點(diǎn)密切協(xié)作,實(shí)現(xiàn)集群管理的基本功能
- kubeproxy: 實(shí)現(xiàn) kubernetes service 的通信與負(fù)載均衡機(jī)制的重要組件
- runtime: runtime 指的是容器運(yùn)行環(huán)境,目前 Kubernetes 支持 docker 和 rkt 兩種容器。
除了核心組件,還有一些推薦的 Add-ons:
- kube-dns:負(fù)責(zé)為整個(gè)集群提供 DNS 服務(wù)
- Ingress Controller:為服務(wù)提供外網(wǎng)入口
- Heapster:提供資源監(jiān)控
- Dashboard:提供GUI
- Federation:提供跨可用區(qū)的集群
- Fluentd-elasticsearch:提供集群日志采集、存儲(chǔ)與查詢
網(wǎng)絡(luò)預(yù)置
- 所有 pods 之間可以相互通信
- 所有 pods 和 nodes 可以相互通信
- 不做 NAT
設(shè)計(jì)原則
聲明式編程(Declarative)
聲明式與命令式的區(qū)別
Declarative 的定義是用戶設(shè)定期望的狀態(tài),系統(tǒng)會(huì)知道它需要執(zhí)行什么操作,來達(dá)到期望的狀態(tài)。
而對(duì)于 Imperative,需要用戶告訴系統(tǒng)需要做什么。比如說用戶說創(chuàng)建一個(gè)新的 Container,系統(tǒng)才會(huì)創(chuàng)建一個(gè)新的 Container。
Level-triggered
Pod
基本概念
- Kubernetes 中最小計(jì)算和被調(diào)度單元
- 是多個(gè)容器的集合,pod 中的容器共享 namespace 和 volume
- 一 pod 一 ip
pod 的五大狀態(tài)(生命周期,pod phase)
- Pending:系統(tǒng)已經(jīng)接受 pod 實(shí)例的創(chuàng)建,但其中所包含容器的一個(gè)或者多個(gè) image 還沒有創(chuàng)建成功。Pending 包含調(diào)度計(jì)算與通過網(wǎng)絡(luò)創(chuàng)建 image,所以此 phase 的時(shí)間可能會(huì)有點(diǎn)長(zhǎng)。
- Running:Pod 已經(jīng)被調(diào)度到某個(gè) node 上,pod 包含的所有容器已經(jīng)創(chuàng)建完成,至少有一個(gè)容器正常運(yùn)行或者處于啟動(dòng)與重啟動(dòng)過程。
- Failed:Pod 中所有容器已終止運(yùn)行,至少有一個(gè)容器非正常結(jié)束,比如退出碼非零,被系統(tǒng)強(qiáng)制殺死等。
- Succeeded:Pod 中的所有容器正常終止,并且不會(huì)再次啟動(dòng)。
- Unknown:無法取得 pod 狀態(tài),一般是網(wǎng)絡(luò)問題引起。
pod 的重啟策略
- Always:總是重啟
- Never:從不重啟
- OnFailure:失敗時(shí)重啟
API
API 資源結(jié)構(gòu)
- apiVersion:api 版本
- kind:資源類型
- metadata:元數(shù)據(jù)
- spec:Spec 是讓用戶寫入期望的狀態(tài),系統(tǒng)可以通過 Spec 讀出用戶的期望
- status:Status 是系統(tǒng)寫入觀察到的狀態(tài),用戶可以從中讀出系統(tǒng)當(dāng)前是什么狀態(tài)
API 擴(kuò)展方法
- CRD:自定義 api
- aggregator:讓用戶利用全部的 Kubernetes API 實(shí)現(xiàn)自己的 apiserver,封裝服務(wù)層
RC, RS, Deployment
RC
推薦使用 RS + Deployment 來代替 RC
是比 pod 高一級(jí)的存在
RC 與 Pod 的關(guān)聯(lián)是通過 Label 來實(shí)現(xiàn)的(通過 selector)
Label 是鍵值對(duì),可用于篩選資源
RS
大部分與 RC 相同,除了 rolling update (RS 特有)
Deployment
比 RS 高一級(jí)的定義微服務(wù)應(yīng)用的抽象層
Deployments 創(chuàng)建 RS
PV, PVC
PV 與 PVC 一一對(duì)應(yīng)
管理員定義 PV, 用戶使用 PVC