雲原生第5課:Kubernetes工作負載管理

語言: CN / TW / HK

本篇文章來自《華為云云原生王者之路訓練營》黃金系列課程第5課,由華為雲容器技術專家Jessia Ding主講,幫你瞭解工作負載的概念以及Kubernetes提供的內建工作負載的資訊;Deployment/ DaemonSet/ Job/ CronJob概念以及使用場景。

01

Kubernetes 工作負載(Workload)介紹

工作負載是在 Kubernetes 上執行的應用程式。 無論你的負載是單一元件還是由多個一同工作的元件構成,在 Kubernetes 中你 可以在一組 Pods 中執行它。 在 Kubernetes 中,Pod 代表的是叢集上處於執行狀態的一組 容器。 Pod 有確定的生命週期,如果該Pod所在的節點出現了致命的錯誤時,所有該節點的Pod都會失敗。 Kubernetes提供一些負載資源來替你管理一組Pod,讓使用者沒有必要管理 每個Pod。

Kubernetes提 供以下幾類工作負載:

1)無狀態工作負載:管理的Pod集合是相互等價的,需要的時候可以被替換。

  • Deployment

  • ReplicaSet

  • ReplicationController

Deployment/RS/RC的區別,RS/RC能保證指定數量的pod在叢集中執行, Deployment提供的升級,回滾,暫停 恢復等功能

2)有狀態工作負載:為每個 Pod 維護了一個唯一的ID, 能夠保證 Pod 的順序性和唯一性,每個Pod是不可替代的。可使用持久儲存來儲存服務產生的狀態。

  • StatefulSet:StatefulSet 為它們的每個 Pod 維護了一個唯一的ID,該序列號會在 StatefulSet 存在的時間內保持不變,哪怕 Pod 被重啟或者重新排程,也不會出現任何的改變。StatefulSet 引入了 PV 和 PVC 物件來持久儲存服務產生的狀態,Zookeeper、Kafka,etcd等。

3)守護程序工作負載:保證每個節點上執行著這樣一個守護程序

  • DaemonSet

4)批處理工作負載:一次性的任務

  • Job

  • CronJob

02

工作負載型別1-Deployment

Deployment 概述

Deployment是一組不具有唯一標識的多個Pod的集合:

  • 確保叢集中有期望數量的Pod執行

  • 提供多種升級策略以及一鍵回滾能力。

  • 提供暫停/恢復的能力

典型使用場景:Web Server等無狀態應用

Deployment 語法

Deployment 升級策略:

RollingUpdate:滾動升級策略中可以配置以下兩個引數

  • maxUnavailable 表示在更新過程中能夠進入不可用狀態的 Pod 的最大值;

  • maxSurge 表示能夠額外建立的 Pod 個數

滾動更新的過程中是啟動一個新的ReplicaSet,建立一部分新Pod,並縮減歷史的ReplicaSet的數量,一直迴圈往復,以達到期望狀態,步長由以上兩個引數控制。

Recreate: 先將老的ReplicaSet期望例項數改成0,等所有Pod終止以後,再建立新的ReplicaSet

RevisonHistoryLimit:指定保留的歷史ReplicaSet數量。

Pause:當Deployment暫停後,Deployment發生了改動,也不會被Controller同步,觸發更新。

apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
spec:
strategy:
rollingUpdate:
maxSurge: 0
maxUnavailable: 1
type: RollingUpdate
selector:
matchLabels:
app: nginx
replicas: 2 # tells deployment to run 2 pods matching the template
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80

Deployment 常用操作

建立Deployement

# kubectl create deploy nginx-test --image nginx --replicas=3
# kubectl create –f nginx.yaml

查詢Deployement

# kubectl get deploy
NAME READY UP-TO-DATE AVAILABLE AGE
nginx 1/1 1 1 17d

READY:對應status.readyReplicas/spec.replicas

UP-TO-DATE:對應status.updatedReplicas, 表示根據新模板建立的pod數量

AVAILABLE:對應status.availableReplicas, 表示在minReadySeconds Pod的Container沒有重啟的Running Pod數量。

更新Deployement

# kubectl edit deploy/nginx


# kubectl set image deploy/nginx nginx=nginx:1.9.1
# kubectl apply -f nginx.yaml

監視Deployment滾動更新情況

# kubectl rollout status deploy/nginx

查詢升級歷史

# kubectl rollout history deploy/nginx

回滾

# kubectl rollout undo deployment/nginx  --to-revision=2 #不指定的話預設回滾到上一個版本

暫停/恢復

# kubectl rollout pause deployment/nginx
# kubectl rollout resume deploy/nginx

Deployment 使用小結

  • 選擇所需的升級策略,合理配置升級引數,例如maxUnavailable以及maxSurge

  • 合理設定歷史版本數量,系統預設情況下會保留10個歷史版本。

  • 回滾時,只有Deployment 模板部分會被回滾,手動/自動擴縮Deployment數量是不會被回滾的。

  • 暫停過程中,模板更新不會觸發Deployment滾動更新。

03

工作負載型別2-Job/CronJob 

Job/CronJob 概述

Job 主要處理一些短暫的一次性任務:

  • 保證指定數量Pod成功執行結束

  • 支援併發執行

  • 支援錯誤自動重試

  • 支援暫停/恢復Job

典型使用場景:

  • 計算以及訓練任務, 如批量計算,AI訓練任務等

CronJob 主要處理週期性或者重複性的任務:

  • 基於Crontab格式的時間排程

  • 可以暫停/恢復CronJob

典型的使用場景:

  • 週期性的資料分析服務

  • 週期性的資源回收服務

Job/CronJob 語法

Job關鍵欄位:

  • Parallelism: 在同一時間執行的最大的Pod的數量

  • Completions: 指定Job成功需要執行成功的Pod的數量

  • BackoffLimit: 重試次數,當超過該重試次數時,該Job標記為Failed

  • CompletionMode: 1.21引入,如果設定為Indexed,建立的Pod annotation會帶上batch.kubernetes.io/job-completion-index,index值為0~spec.completions-1,並且僅當每個index的pod都有一個成功的時候,這時Job才會被認為是成功的。

    controller會給pod中注入JOB_COMPLETION_INDEX的環境變數

  • Suspend: 1.21引入,等於true時,使用者暫停了Job,controller會刪除所有正在執行的Pod。

apiVersion: batch/v1
kind: Job
metadata:
name: pi
spec:
template:
spec:
containers:
- name: pi
image: perl
command: ["perl", "-Mbignum=bpi", "-wle", "print bpi(2000)"]
restartPolicy: Never
backoffLimit: 4
completions: 1
parallelism: 1

CronJob關鍵欄位:

  • Schedule: 設定Job的週期策略

  • ConcurrencyPolicy:  指定 CronJob 建立的任務執行時發生重疊如何處理, Allow是允許併發執行任務, Forbid是不允許併發執行,Replace是會用新任務替換正在執行的任務。

  • startingDeadlineSeconds: 表示統計錯過排程次數開始的時間,預設從上一次排程時間開始統計。

  • successfulJobsHistoryLimit,failedJobsHistoryLimit: 可以指定保留的成功和失敗的任務個數。

  • Suspend: 是否暫停

apiVersion: batch/v1
kind: CronJob
metadata:
name: hello
spec:
schedule: "*/1 * * * *“
successfulJobsHistoryLimit: 3
failedJobsHistoryLimit: 1
concurrencyPolicy: Allow
jobTemplate:
spec:
template:
spec:
containers:
- name: hello
image: busybox
imagePullPolicy: IfNotPresent
command:
- /bin/sh
- -c
- date; echo Hello from the Kubernetes cluster
restartPolicy: OnFailure

Job/CronJob 常用操作

建立Job

# kubectl create job  pi --from=cronjob/a-cronjob # 從cronjob獲取模板建立Job
# kubectl create –f job.yaml

查詢Job

# kubectl get job
NAME COMPLETIONS DURATION AGE
pi 1/1 43s 123m

COMPLETIONS:顯示已經完成的Pod數量,顯示的欄位為.status.succeeded

DURATION:Job實際也執行時長,已完成Job使用status.completionTime – status.startTime

建立CronJob

# kubectl create cronjob hello --image=busybox --schedule="*/1 * * * *"
# kubectl create –f cronjob.yaml

查詢CronJob

# kubectl get cronjob
NAME SCHEDULE SUSPEND ACTIVE LAST SCHEDULE AGE
hello */1 * * * * False 1 57s 73s

SUSPEND :顯示已經該Cronjob是否暫停

ACTIVE :顯示的是正在執行的Job的數量

LAST SCHEDULE:顯示的是上一次觸發任務執行的時間

Job/CronJob 使用小結

  • 合理設定Job 的併發度,和所需的完成數量

  • 合理設定失敗重試次數,當前系統預設值為6

  • Job 中的Pod Restart Policy 只能為Never 或者 OnFailure

  • 合理設定歷史Job保留時間

  • 合理設定CronJob的週期策略,以及併發策略

  • CronJob 當在一個時間窗內(上一次排程的時間點到現在)所錯過的排程次數超過100次以後,那麼就不會再啟動這個任務了。

04

工作負載型別3-DaemonSet

DaemonSet 概述

DaemonSet(守護程序集)功能:

  • 確保每一個節點或者期望的節點上執行一個Pod

  • 新增節點時自動部署一個Pod

  • 移除節點時自動刪除Pod

典型使用場景:

  • 日誌監控採集程序,如fluentd, icagent,

  • 節點運維程序,等Node Problem Detector, OS-Operator-Agent

  • Kubernetes 必要執行元件,如Everest Driver, Calico等

  • Device Plugin:

    GPU Device Plugin,執行在GPU節點上

DaemonSet 語法

DaemonSet 升級策略:

  • RollingUpdate:更新了DaemonSet的配置時,會自動刪除老的Pod,刪除完成後,建立新的Pods,併發滾動更新的節點數可以通過maxUnavailable控制.

  • OnDelete:更新了DaemonSet的配置,不會自動刪除並重建Pod; 通過刪除Pod,觸發Pod的更新。

DaemonSet Template中RestartPolicy必須為Always

RevisionHistoryLimit:指定保留的歷史revision數量。

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd-elasticsearch
namespace: kube-system
labels:
k8s-app: fluentd-logging
spec:
revisionHistoryLimit: 10
updateStrategy:
rollingUpdate:
maxUnavailable: 10
type: RollingUpdate
selector:
matchLabels:
name: fluentd-elasticsearch
template:
metadata:
labels:
name: fluentd-elasticsearch
spec:
containers:
- name: fluentd-elasticsearch
image: quay.io/fluentd_elasticsearch/fluentd:v2.5.2

DaemonSet 常用操作

建立DaemonSet

# kubectl create –f daemonset.yaml

查詢DaemonSet 

# kubectl get daemonset –nkube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
everest-csi-driver 1 1 1 1 133d

DESIRED:對應status.desiredNumberScheduled,表示叢集中需要部署ds pod的節點數量

CURRENT:對應status.currentNumberScheduled, 表示叢集中已經有排程ds pod的節點數量

READY:對應status.NumberReady, 表示叢集中已經有Running ds pod的節點數量

UP-TO-DATE:對應status.updatedNumberScheduled, 表示叢集中已經啟動最新的ds版本pod的節點數量

AVAILABLE:對應status.numberAvailable, 表示叢集中有running ds pod,並且在minReadySeconds容器沒有重啟的節點數量

更新DaemonSet 

# kubectl edit ds/fluentd-elasticsearch -n kube-system
# kubectl set image ds/fluentd-elasticsearch fluentd-elasticsearch=quay.io/fluentd_elasticsearch/fluentd:v2.6.0 -n kube-system
# kubectl apply -f https://k8s.io/examples/controllers/fluentd-daemonset-update.yaml

監視DaemonSet滾動更新情況

# kubectl rollout status ds/fluentd-elasticsearch

查詢更新歷史

# kubectl rollout history ds/fluentd-elasticsearch

回滾

# kubectl rollout undo ds/fluentd-elasticsearch  --to-revision=2 #不指定的話預設回滾到上一個版本

DaemonSet使用小結

  • 合理設定DaemonSet升級策略

  • 可以通過設定節點親和性或者節點選擇器來選擇部分節點部署。

  • 合理設定DaemonSet的RevisionHistoryLimit,預設值為10

05

本課實驗

本課實驗: 使用deployment部署天氣預報應用的frontend服務

請觀看 課程影片 28分10秒-33分:

https://education.huaweicloud.com/courses/course-v1:HuaweiX+CBUCNXI034+Self-paced/about

以上為本節課分享的內容,大家有問題歡迎掃碼加入 雲原生技術交流群 討論。

掃描二維碼 | 加入雲原生技術交流群

相關閱讀

戳閱讀原文,觀看課程影片!