天天看點

Kubernetes 無狀态應用擴縮容

Kubernetes 無狀态應用擴縮容

鏡像下載下傳、域名解析、時間同步請點選

阿裡巴巴開源鏡像站

Kubernetes 對象

本段是參考

kubernetes官方手冊

的學習筆記,建議初步了解下,如已了解相關概念,可跳過本段,直接看下面的操作。

Kubernetes 對象 是持久化的實體。Kubernetes 使用這些實體去表示整個叢集的狀态。

描述了如下資訊:

  • 哪些容器化應用在運作(以及在哪個 Node 上)
  • 可以被應用使用的資源
  • 關于應用運作時表現的政策,比如重新開機政策、更新政策,以及容錯政策

一但對象被建立,k8s叢集就會開始持續工作以保證對象符合期望狀态。

對象規約(Spec)與狀态(Status)

每個 Kubernetes 對象包含兩個嵌套的對象字段,它們負責管理對象的配置:對象 spec 和 對象 status 。 spec 是必需的,它描述了對象的 期望狀态(Desired State) —— 希望對象所具有的特征。 status 描述了對象的 實際狀态(Actual State) ,它是由 Kubernetes 系統提供和更新的。在任何時刻,Kubernetes 控制面一直努力地管理着對象的實際狀态以與期望狀态相比對。

描述 Kubernetes 對象

一般使用yaml來描述一個k8s對象,yaml是專門用來寫配置的語言。

基本文法規則如下:

  • 大小寫敏感
  • 使用縮進表示層級關系
  • 縮進不允許使用tab,隻允許空格
  • 縮進的空格數不重要,隻要相同層級的元素左對齊即可
  • '#'表示注釋

使用yaml描述k8s對象,需要以下必需字段:

  • apiVersion - 建立該對象所使用的 Kubernetes API 的版本
  • kind - 想要建立的對象的類型
  • metadata - 幫助識别對象唯一性的資料,包括一個 name 字元串、UID 和可選的 namespace
  • spec - 描述了對象的 期望狀态(Desired State),k8s叢集會持續保證對象符合描述的狀态。

管理 Kubernetes 對象

管理k8s對象有三種方式

Kubernetes 無狀态應用擴縮容

指令式指令(Imperative commands)

就是我們上文中使用的方式,在指令行直接操作。

如:

kubectl create deployment nginx --image nginx           

與對象配置相比的優點:

  • 指令簡單,易學且易于記憶。
  • 指令僅需一步即可對叢集進行更改。

與對象配置相比的缺點:

  • 指令不與變更審查流程內建。
  • 指令不提供與更改關聯的稽核跟蹤。
  • 除了實時内容外,指令不提供記錄源。
  • 指令不提供用于建立新對象的模闆。

指令式對象配置(Imperative object configuration)

需要操作指令和配置檔案配合使用。

kubectl create -f nginx.yaml           

與指令式指令相比的優點:

  • 對象配置可以存儲在源控制系統中,比如 Git。
  • 對象配置可以與流程內建,例如在推送和審計之前檢查更新。
  • 對象配置提供了用于建立新對象的模闆。

與指令式指令相比的缺點:

  • 對象配置需要對對象架構有基本的了解。
  • 對象配置需要額外的步驟來編寫 YAML 檔案。

與聲明式對象配置相比的優點:

  • 指令式對象配置行為更加簡單易懂。
  • 從 Kubernetes 1.5 版本開始,指令式對象配置更加成熟。

與聲明式對象配置相比的缺點:

  • 指令式對象配置更适合檔案,而非目錄。
  • 對活動對象的更新必須反映在配置檔案中,否則會在下一次替換時丢失。

聲明式對象配置(Declarative object configuration)

使用聲明式對象配置,不需要在指令中顯示的指定操作,這樣可以将配置檔案放在目錄中,對目錄中的檔案進行不同的操作。

比如:

kubectl apply -f configs/           

與指令式對象配置相比的優點:

  • 對活動對象所做的更改即使未合并到配置檔案中,也會被保留下來。
  • 聲明性對象配置更好地支援對目錄進行操作并自動檢測每個檔案的操作類型(建立,修補,删除)。

與指令式對象配置相比的缺點:

  • 聲明式對象配置難于調試并且出現異常時結果難以了解。
  • 使用 diff 産生的部分更新會建立複雜的合并和更新檔操作。

實踐操作

建立Deployment

建立node-deployment.yaml檔案

apiVersion: apps/v1
kind: Deployment
metadata:
  name: node-deployment
  labels:
    app: node
spec:
  replicas: 3
  selector:
    matchLabels:
      app: node
  template:
    metadata:
      labels:
        app: node
    spec:
      containers:
      - name: node
        image: registry.cn-hangzhou.aliyuncs.com/larswang/hello-node:1.0
        ports:
        - containerPort: 80           

建立

kubectl apply -f node-deployment.yaml           

檢視deployments

kubectl get deployments           
Kubernetes 無狀态應用擴縮容

檢視pods

kubectl get pods --show-labels           
Kubernetes 無狀态應用擴縮容

縮放Deployment

擴容到十個副本

kubectl scale deployment.v1.apps/node-deployment --replicas=10           

擴充完成檢視deployments和pods情況

kubectl get deployments
kubectl get pods --show-labels           
Kubernetes 無狀态應用擴縮容

縮容到三個副本

kubectl scale deployment.v1.apps/node-deployment --replicas=3           

此時可以看到 其中7個pod處于Terminating狀态。一段時間後,再次檢視,隻剩下了3個正在running的pod。

Kubernetes 無狀态應用擴縮容

自動恢複

先檢視pods清單

kubectl get pods --show-labels           

選中其中一個pod并删除

kubectl delete pod node-deployment-57df45c5bf-d8xst           

等删除成功後,再次檢視pods清單

kubectl get pods --show-labels           
Kubernetes 無狀态應用擴縮容

會發現被删除的pod已經不存在了,但是Deployment又建立了一個新的pod。

這就是k8s會始終盡量保證叢集的運作狀态和配置描述的狀态保持一緻的特性。

擷取Deployment描述資訊

kubectl describe deployment node-deployment           
Kubernetes 無狀态應用擴縮容

可以看到Deployment的目前描述,及pod曆史變化情況。

NewReplicaSet:

  • 當第一次建立 Deployment 時,它建立了一個 ReplicaSet (node-deployment-57df45c5bf) 并建立了3個副本。

Events:

  • 先擴容到了10個pods
  • 縮容到了3個pods
  • 縮容到了1個pods
  • 擴容到了3個pods

檢視Deployment狀态

kubectl get deployment node-deployment -o yaml           

以yaml格式展示Deployment的配置情況及目前狀态

Kubernetes 無狀态應用擴縮容

總結

本文我們介紹了什麼是k8s對象,以及使用yaml配置,建立了一個Deployment。

通過scale對Deployment進行縮放,并示範了手動删除一個pod後,k8s根據描述保持運作态與描述一緻的特性。

在操作完一遍之後,回過頭再看概念,會有種茅塞頓開的感覺。

來源:

AloofJr
提供全面,高效和穩定的鏡像下載下傳服務。釘釘搜尋 ' 21746399 ‘ 加入鏡像站官方使用者交流群。”

繼續閱讀