k8s基本架構

2022-07-07 23:42:24 字數 4061 閱讀 5001

k8s是kubernetes的縮寫,kubernetes是希臘語中領航員的意思。

每個api物件都有3大類屬性:元資料metadata、規範spec和狀態status。

元資料metadata是用來標識api物件的,每個物件都至少有3個元資料:namespace,name和uid;除此以外還有各種各樣的標籤labels用來標識和匹配不同的物件。

對於具有 spec 的物件,你必須在建立物件時設定其內容,描述你希望物件所具有的特徵: 期望狀態(desired state) 。

status 描述了物件的 當前狀態(current state),它是由 kubernetes 系統和元件 設定並更新的。

pod 在其生命週期中只會被排程一次。 一旦 pod 被排程(分派)到某個節點,pod 會一直在該節點執行,直到 pod 停止或者 被終止。

pod重啟策略,在pod中的容器可能會由於異常等原因導致其終止退出,kubernetes提供了重啟策略以重啟容器。重啟策略對同乙個pod的所有容器起作用,容器的重啟由node上的kubelet執行。pod支援三種重啟策略,在配置檔案中通過restartpolicy欄位設定重啟策略,這裡的重啟是指在pod的宿主node上進行本地重啟,而不是排程到其它node上。:

資源限制,kubernetes通過cgroups限制容器的cpu和記憶體等計算資源,包括requests(請求,排程器保證排程到資源充足的node上)和limits(上限)等:

apiversion: v1

kind: pod

metadata:

labels:

name: nginx

spec:

containers:

- image: nginx

name: nginx

resources:

requests:

cpu: "300m"

memory: "50mi"

limits:

cpu: "500m"

memory: "128mi"

健康檢查,在pod部署到kubernetes集群中以後,為了確保pod處於健康正常的執行狀態,kubernetes提供了兩種探針,用於檢測容器的狀態:

kubelet在容器上週期性的執行探針以檢測容器的健康狀態,kubelet通過呼叫被容器實現的處理器來實現檢測,在kubernetes中有三類處理器:

replicationcontroller已經過時了,新的replicaset作為替代,也不用直接建立replicaset,建立deployment會自動建立的。不過這裡還是學一學。

replicationcontroller的主要功能是保證pod的數量、健康,彈性收縮等。但是deployment除了有這些功能之外,還增加了回滾功能(當公升級 pod 映象或者相關引數的時候,如果有錯誤,可以回滾到上乙個穩定版本),版本記錄(每一次對 deployment 的操作都能儲存下來)。暫停和啟動(公升級的時候,能隨時暫停和啟動)。

apiversion: v1

kind: replicationcontroller

metadata:

name: nginx

spec:

replicas: 3

selector:

template:

metadata:

name: nginx

labels:

spec:

containers:

- name: nginx

image: nginx

ports:

- containerport: 80

其中spec.template是spec中必須填寫的,它就是乙個pod的配置。其中.spec.replicas表示這個pod需要維持幾份。如果沒有配置的話,它就是為1。比如上面那個例子,就保持3份nginx服務。

標籤選擇器在很多概念都是會使用到的,比如pod在哪個node上,replicationcontroller作用在哪個pod上,service作用在哪個pod上,等等。tag標註的系統化也是k8s應用集群必要的設計之一。

kubemetes 服務是一種為一 組功能相同的 pod 提供單一 不變的接入點的資源。 當服務存在時,它的 ip 位址和埠不會改變。 客戶端通過 ip 位址和埠號建立連線,這些連線會被路由到提供該服務的任意乙個 pod 上。 通過這種方式, 客戶端不需要 知道每個單獨的提供服務的pod的位址, 這樣這些pod就可以在集群中隨時被建立 或移除。

apiversion: v1

kind: service

metadata:

name: kubia

spec:

ports:

- port: 80

targetport: 8080

selector:

如果希望特定客戶端產生的所有請求每次都指向同 乙個 pod, 可以設定服務的 sessionaffinity 屬性為 c巨entip (而不是 none,none 是預設值), 如下面的**清單所示。

apiversion: v1

kind: service

spec:

sessionaffinity: clientip

kubernetes 僅僅支援兩種形式的會話親和性服務: none 和 client工p。你或 許驚訝竞然不支援基於 cookie 的會話親和性的選項,但是你要了解 kubernetes 服務 不是在 http 層面上工作。服務處理 tcp 和 udp 包,並不關心其中的載荷內容。 因為 cookie 是 http 協議中的一部分,服務並不知道它們,這就解釋了為什麼會話 親和性不能基千 cookie。

服務發現:

將服務暴露給外部客戶端:

kubernetes 的卷是 pod 的乙個組成部分, 因此像容器一樣在 pod 的規範中就 定義了。 它們不是獨立的 kubernetes 物件, 也不能單獨建立或刪除。 pod 中的所 有容器都可以使用卷, 但必須先將它掛載在每個需要訪問它的容器中。 在每個容器 中, 都可以在其檔案系統的任意位置掛載卷。

可用的卷型別:

emptydir:最簡單 的卷 型別是 emptydir 卷,所以作為 第乙個例子讓我們看看如何在 pod 中定義卷 。 顧名思義,卷從乙個 空 目錄開始,執行在 pod 內的應用程式可以寫入它 需要 的任何檔案 。因為卷的生存週期與 pod 的生存週期相 關聯 ,所以 當刪除 pod 時, 卷的內容就會丟失 。

hostpath:hostpath 卷指向節點檔案系統上的特定檔案或目錄(請參見圖 6.4)。 在同一 個節點上執行並在其 hostpath 卷中使用相同路徑的 pod 可以看到相同的檔案

deployment是一 種更高階資源,用於部署應用程式並以宣告的方式公升級應用, 而不是通過 replicationcontroller 或 replicaset 進行部署,它們都被認為是更底層的 概念。

當建立乙個deployment時, replicaset 資源也會隨之建立(最終會有更多的資源被建立)。 在第4章中, replicaset 是新一代的 replicationcontroller, 並推薦使用 它替代replicationcontroller來複製和管理pod。 在使用deployment時,實際的pod 是由 deployment 的 replicaset 建立和管理的, 而不是由 deployment 直接建立和管理的。

kind: deployment

metadata:

name: kubia

spec:

replicas: 3

template:

metadata:

name: kubia

labels:

spec:

containers:

- image: luksa/kubia:v1

name: nodejs

只需修改 deployment 資源 中定義的 pod 模板, kubemetes 會自動將實際的系統狀態收斂為資源中定義的狀態。 類似於將 replicationcontroller 或 replicaset 擴容或者縮容, 公升級需要做的就是在部署的 pod 模板中修改映象的 tag, kubemetes 會收斂系統, 匹配期望的狀態。

k8s架構描述

架構 kubectl k8s是命令列端,用來傳送客戶端的操作指令 api server 是k8s集群的前端介面,各種客戶端工具以及k8s的其他元件可以通過他管理k8s集群的各種資源。他提供了http https restful api,即k8s api scheduler 排程 負責決定將pod放在...

K8s生產架構

kubernetes的生產架構,如圖所示 k8s平台 日誌管理 使用elasticsearch filebeat 和 kibana技術棧 監控告警管理 使用cadvisor prometheus和grafana技術棧 微服務架構 使用service mesh服務網格中的istio方案 devops ...

k8s架構學習

master 節點 master 是 kubernetes cluster 的大腦,執行著如下 daemon 服務 kube apiserver kube scheduler kube controller manager etcd 和 pod 網路 例如 flannel api server ku...