什么是Kubernetes
Kubernetes 是 Google 開源的基于容器技術的分布式架構領先方案,提供應用部署敬矩、維護、擴展機制等功能蠢挡,利用 Kubernetes 能方便地管理跨機器運行容器化的應用弧岳。
單容器( contianer )所遇到的問題
- 需要被管理
- 網絡環(huán)境復雜
- 容器需要被調度、分發(fā)业踏,以及配置負載均衡
- 數據需要被保存在其他地方
即
- 使用 Docker 對應用程序打包禽炬、實例化、運行
- 以集群的方式運行勤家、管理跨機器的容器
- 解決 Docker 跨機器容器之間的通訊問題
核心概念
分為 master 和 node 節(jié)點腹尖,master 為集群控制節(jié)點
master 節(jié)點通常會占據一個獨立的服務器(高可用部署建議使用三臺服務器(如果 master 和 etcd 部在一起的話))
master上:etcd, controller, scheduler, api server
- etcd: key-value 存儲,集群狀態(tài)管理伐脖,是運行在多節(jié)點上的分布式鍵值存儲热幔,高可用(奇數個,必須半數以上的選舉讼庇,容錯能力限制于節(jié)點數的一半绎巨,選舉 raft)
- controller:控制器(多個控制器組成)選舉
- scheduler:調度器,負責資源調度(pod 調度)的進程 選舉蠕啄。scheduler 的職責很明確场勤,就是負責調度 pod 到合適的 Node 上。如果把 scheduler 看成一個黑匣子歼跟,那么它的輸入是 pod 和由多個 Node 組成的列表和媳,輸出是 Pod 和一個 Node 的綁定,即將這個 pod 部署到這個 Node 上哈街。Kubernetes 目前提供了調度算法留瞳,但是同樣也保留了接口,用戶可以根據自己的需求定義自己的調度算法叹卷。
- api server:暴露接口撼港,處理請求。提供了資源操作的唯一入口骤竹,并提供認證帝牡、授權、訪問控制蒙揣、API 注冊和發(fā)現(xiàn)等機制靶溜。APIServer負責對外提供RESTful的 Kubernetes API 服務,它是系統(tǒng)管理指令的統(tǒng)一入口,任何對資源進行增刪改查的操作都要交給 APIServer 處理后再提交給 etcd罩息,kubectl( Kubernetes 提供的客戶端工具嗤详,該工具內部就是對 Kubernetes API 的調用)是直接和 APIServer 交互的。
node上:kubelet, kubeproxy, runtime
- kubelet:管理 pod瓷炮,負責 pod 對應的容器的創(chuàng)建葱色、啟停等任務,同時與 master 節(jié)點密切協(xié)作娘香,實現(xiàn)集群管理的基本功能
- kubeproxy: 實現(xiàn) kubernetes service 的通信與負載均衡機制的重要組件
- runtime: runtime 指的是容器運行環(huán)境苍狰,目前 Kubernetes 支持 docker 和 rkt 兩種容器。
除了核心組件烘绽,還有一些推薦的 Add-ons:
- kube-dns:負責為整個集群提供 DNS 服務
- Ingress Controller:為服務提供外網入口
- Heapster:提供資源監(jiān)控
- Dashboard:提供GUI
- Federation:提供跨可用區(qū)的集群
- Fluentd-elasticsearch:提供集群日志采集淋昭、存儲與查詢
網絡預置
- 所有 pods 之間可以相互通信
- 所有 pods 和 nodes 可以相互通信
- 不做 NAT
設計原則
聲明式編程(Declarative)
聲明式與命令式的區(qū)別
Declarative 的定義是用戶設定期望的狀態(tài),系統(tǒng)會知道它需要執(zhí)行什么操作安接,來達到期望的狀態(tài)翔忽。
而對于 Imperative,需要用戶告訴系統(tǒng)需要做什么盏檐。比如說用戶說創(chuàng)建一個新的 Container歇式,系統(tǒng)才會創(chuàng)建一個新的 Container。
Level-triggered
Pod
基本概念
- Kubernetes 中最小計算和被調度單元
- 是多個容器的集合糯笙,pod 中的容器共享 namespace 和 volume
- 一 pod 一 ip
pod 的五大狀態(tài)(生命周期贬丛,pod phase)
- Pending:系統(tǒng)已經接受 pod 實例的創(chuàng)建,但其中所包含容器的一個或者多個 image 還沒有創(chuàng)建成功给涕。Pending 包含調度計算與通過網絡創(chuàng)建 image豺憔,所以此 phase 的時間可能會有點長。
- Running:Pod 已經被調度到某個 node 上够庙,pod 包含的所有容器已經創(chuàng)建完成恭应,至少有一個容器正常運行或者處于啟動與重啟動過程。
- Failed:Pod 中所有容器已終止運行耘眨,至少有一個容器非正常結束昼榛,比如退出碼非零,被系統(tǒng)強制殺死等剔难。
- Succeeded:Pod 中的所有容器正常終止胆屿,并且不會再次啟動。
- Unknown:無法取得 pod 狀態(tài)偶宫,一般是網絡問題引起非迹。
pod 的重啟策略
- Always:總是重啟
- Never:從不重啟
- OnFailure:失敗時重啟
API
API 資源結構
- apiVersion:api 版本
- kind:資源類型
- metadata:元數據
- spec:Spec 是讓用戶寫入期望的狀態(tài),系統(tǒng)可以通過 Spec 讀出用戶的期望
- status:Status 是系統(tǒng)寫入觀察到的狀態(tài)纯趋,用戶可以從中讀出系統(tǒng)當前是什么狀態(tài)
API 擴展方法
- CRD:自定義 api
- aggregator:讓用戶利用全部的 Kubernetes API 實現(xiàn)自己的 apiserver憎兽,封裝服務層
RC, RS, Deployment
RC
推薦使用 RS + Deployment 來代替 RC
是比 pod 高一級的存在
RC 與 Pod 的關聯(lián)是通過 Label 來實現(xiàn)的(通過 selector)
Label 是鍵值對冷离,可用于篩選資源
RS
大部分與 RC 相同,除了 rolling update (RS 特有)
Deployment
比 RS 高一級的定義微服務應用的抽象層
Deployments 創(chuàng)建 RS
PV, PVC
PV 與 PVC 一一對應
管理員定義 PV, 用戶使用 PVC