無需手動修改檔案即可編輯 Kubernetes 部署
1. 概述
如今,Kubernetes 是最受歡迎的容器編排工具。其受歡迎的主要原因之一是它提供了一種有效的方法來管理大規模容器化應用程式的部署。
Kubernetes 有各種內建對象,使我們能夠可靠地運行容器化應用程式。此類用例最常用的物件是Pod
、 Deployment
、 StatefulSet
、 CronJob
等。
在本教程中,我們將討論允許我們在不修改聲明性設定檔的情況下更新Deployment
物件的容器映像的各種方法。
2. 設定範例
在本節中,我們將建立一個NGINX Deployment
物件作為範例。
Kubernetes 命名空間讓我們可以隔離叢集內的資源。因此,首先,我們建立一個新的命名空間來部署nginx
pod:
$ kubectl create ns deployment-demo
namespace/deployment-demo created
接下來,我們將以下聲明性配置保存在deployment-demo.yaml
檔案中。我們將用它來建立一個使用[nginx](https://hub.docker.com/_/nginx)
鏡像的1.22
標籤的 pod:
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
namespace: deployment-demo
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- image: nginx:1.22
name: nginx
ports:
- containerPort: 80
name: nginx
需要注意的是, Deployment
和Container
的名稱是nginx
。
現在,讓我們使用apply
指令來建立nginx
pod:
$ kubectl apply -f deployment-demo.yaml
deployment.apps/nginx created
最後,讓我們驗證 pod 是否已在deployment-demo
命名空間中建立並且處於運行狀態:
$ kubectl get pods -n deployment-demo
NAME READY STATUS RESTARTS AGE
nginx-7c8cbb65f7-jwjqg 1/1 Running 0 118s
現在,所需的設定已準備就緒。那麼,讓我們看看如何更新這個Deployment
物件的容器鏡像。
3. 使用set
操作
我們可以使用kubectl
指令的set
操作來更新nginx
部署的鏡像。
為了理解這一點,讓我們修改Deployment
物件以使用nginx
鏡像的1.23
標籤:
$ kubectl set image deployment/nginx nginx=nginx:1.23 -n deployment-demo
deployment.apps/nginx image updated
在此範例中, nginx
代表容器名稱,而nginx:1.23
代表容器鏡像及其 tag 。
現在,讓我們驗證 pod 是否處於健康狀態並且它正在使用nginx
鏡像的1.23
標籤:
$ kubectl get pods -n deployment-demo
NAME READY STATUS RESTARTS AGE
nginx-578b68d5d6-dtt72 1/1 Running 0 23s
$ kubectl get deploy -o wide -n deployment-demo
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 2d20h nginx nginx:1.23 app=nginx
在這裡,我們使用寬輸出格式來顯示部署的其他詳細資訊。在上面的輸出中,倒數第二列顯示了容器使用的影像。
4.使用patch
操作
除此之外,我們也可以透過kubectl
指令使用patch
操作來更新Deployment
物件的鏡像。
我們可以從命令列或透過補丁檔案指定補丁配置。補丁檔案有點類似於聲明式配置,但它只包含部分配置。
例如,在聲明性配置中,容器詳細資訊顯示在spec.template.spec.containers
部分下。因此,讓我們使用此部分建立一個 YAML 檔案並將其儲存為patch-demo.yaml
檔案:
spec:
template:
spec:
containers:
- image: nginx:1.24
name: nginx
在此配置中,我們使用 1.24 標籤的nginx
映像。
接下來,讓我們使用 – -patch-file
選項來更新Deployment
物件:
$ kubectl patch deployment/nginx --patch-file patch-demo.yaml -n deployment-demo
deployment.apps/nginx patched
最後,我們來驗證 pod 的狀態和容器使用的鏡像:
$ kubectl get pods -n deployment-demo
NAME READY STATUS RESTARTS AGE
nginx-56df444f8c-gbxc8 1/1 Running 0 22s
$ kubectl get deploy -o wide -n deployment-demo
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 2d20h nginx nginx:1.24 app=nginx
在這裡,我們可以觀察到容器正在使用nginx
鏡像的1.24
標籤。
5. 使用edit
操作
在前面的範例中,我們討論如何使用修補程式檔案來更新Deployment
物件。最佳實踐是使用設定檔來更新 Kubernetes 物件。主要原因之一是我們始終可以對這些文件進行版本控制以追蹤變更。
然而,有時,我們想要進行一些一次性的改變來嘗試一些東西。在這種情況下,我們可以使用kubectl
指令進行edit
操作:
$ kubectl edit deployment nginx -n deployment-demo
此命令在預設編輯器中開啟nginx
部署的 YAML 設定。之後,我們可以進行所需的更改,儲存文件,然後退出編輯器。在我們的例子中,我們將修改spec.template.spec.containers
部分以使用nginx
映像的1.25
標籤。
現在,讓我們在儲存檔案後退出編輯器並驗證容器是否正在使用指定的映像:
$ kubectl get pods -n deployment-demo
NAME READY STATUS RESTARTS AGE
nginx-74d46ddcd8-qxrlc 1/1 Running 0 26s
$ kubectl get deploy -o wide -n deployment-demo
NAME READY UP-TO-DATE AVAILABLE AGE CONTAINERS IMAGES SELECTOR
nginx 1/1 1 1 2d21h nginx nginx:1.25 app=nginx
6. 清理
始終建議刪除臨時建立的物件。這有助於我們擺脫不需要的物件並更好地利用硬體資源。
因此,讓我們執行delete
操作來刪除我們在設定範例時建立的Deployment
和Namespace
物件:
$ kubectl delete deploy nginx -n deployment-demo
deployment.apps "nginx" deleted
$ kubectl delete namespace deployment-demo
namespace "deployment-demo" deleted
七、結論
在本文中,我們討論瞭如何在不使用原始聲明性設定檔的情況下動態編輯 Kubernetes Deployment
物件。
首先,我們討論如何使用set
操作內聯指定容器鏡像。
接下來,我們了解如何使用補丁檔案執行相同的操作。
最後,我們討論了edit
操作的用法,它提供了一次修改多個欄位的最快、最簡單的方法。