Kubernetes 學(xué)習(xí)筆記

什么是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 中的容器共享 namespacevolume
  • 一 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容