k8s入門之Deployment(五)

景少發表於2022-04-20

Deployment控制器通常用來部署無狀態的應用,這樣可以在任意的節點上擴容或者刪除,而不用考慮資料的問題,它可以管理pod物件。

一、多副本

1.使用命令列方式建立Deployment

在dev名稱空間下建立3個副本的nginx pod

kubectl create deployment nginx --image=nginx --replicas=3 -n dev

監控建立進度

kubectl get deploy -n dev -w

可以看到副本可用數量從0變到3

2.檢視Deployment的描述

kubectl describe deploy nginx -n dev

可以看到NewReplicaSet的名稱為nginx-6799fc88d8

3.檢視Deployment管理的pod

kubectl get pod -n dev -owide --show-labels

可以看到Name列是ReplicaSet的名稱加上一串6位的隨機字串,每個pod都有自己獨立的IP。由於只有2臺worker節點,其中2個pod被排程到了同一臺節點worker02,另一個pod被排程到了worker01。

4.刪除Deployment

kubectl delete deploy nginx -n dev

刪除Deployment,會把其管理的pod一起刪除

5.使用yaml檔案建立Deployment

(1)新建dp-nginx.yaml檔案,並輸入以下內容

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    app: nginx
  name: nginx
  namespace: dev
spec:
  replicas: 3
  selector:
    # Deployment會匹配與這裡設定的相同標籤內容的pod
    matchLabels:
      app: nginx
  # pod的模板描述
  template:
    metadata:
      #定義pod的標籤
      labels:
        app: nginx
    spec:
      containers:
      - image: nginx
        name: nginx

(2)建立Deployment物件

kubectl apply -f dp-nginx.yaml

檢視建立的結果

二、擴縮容

1.通過命令列擴容

先通過命令自動監聽pod的變化

kubectl get pod -n dev -owide -w

再開啟一個新的bash會話,通過以下命令擴容(增加副本數量:由3個變成5個)

kubectl scale --replicas=5 deploy/nginx -n dev

在監聽bash視窗可以看到擴容過程

2.通過命令列縮容

先通過命令自動監聽pod的變化

kubectl get pod -n dev -owide -w

再開啟一個新的bash會話,通過命令縮容(減少副本數量:由5個變成2個)

kubectl scale --replicas=2 deploy/nginx -n dev

在監聽bash視窗可以看到縮容過程

3.通過yaml檔案擴縮容

kubectl edit deployment nginx -n dev

定位到replicase引數所在行,然後修改它的值

三、自愈&故障轉移

1.自愈

手動刪除某個pod,或者某個pod異常掛掉,k8s會自動建立一個新的pod。

先通過命令自動監聽pod的變化

kubectl get pod -n dev -owide -w

再開啟一個新的bash會話,手動刪除一個pod

kubectl scale --replicas=2 deploy/nginx -n dev

在監聽bash視窗可以看到建立過程

2.故障轉移

對worker02關機,k8s需要5分鐘(可配置)才能感知從而啟動自愈功能。

通過命令自動監聽pod的變化

kubectl get pod -n dev -owide -w

大概等了5分鐘左右的時間,可以看到worker01上啟動了2個新的pod。

這個時候如果重新啟動worker02,部署在它上面的2箇舊pod會立馬刪除。

四、滾動更新

1.更改映象版本

把nginx的映象版本改為1.20

kubectl edit deploy nginx -n dev
# image: nginx:1.20

檢視滾動更新狀態

kubectl rollout status deploy nginx -n dev

監聽pod的建立過程

kubectl get pod -n dev -owide -w

檢視新建立的pod描述,確實更新成了新的映象版本

2.回滾

(1)檢視更新歷史記錄

kubectl rollout history deploy nginx -n dev

(2)檢視某個指定版本的歷史記錄詳情

kubectl rollout history deploy nginx -n dev --revision=2

(3)回滾到上次的版本

kubectl rollout undo deploy nginx -n dev

回滾完成之後,檢視新pod的描述,發現nginx映象的版本是最新的

(4)回滾到指定的版本

kubectl rollout undo deploy nginx -n dev --to-revision=2

五、總結

類似 Deployment 這樣的一個控制器,實際上都是由上半部分的控制器定義(包括期望狀態),加上下半部分的被控制物件的模板組成的

相關文章