如何刪除 Kubernetes 服務
1. 概述
我們無法想像沒有網路的分散式系統,Kubernetes 也不例外。在 Kubernetes 中, Service
是主要的網路物件。它提供固定的 DNS 記錄以及固定的 IP 位址和連接埠號碼。
作為 Kubernetes 用戶,我們經常需要刪除不需要的Service
物件。這有助於我們整理集群。在本快速教學中,我們將討論刪除 Kubernetes 服務的各種方法。那麼,讓我們開始吧。
2. 設定範例
首先,讓我們建立一些不同類型的 Kubernetes Service
物件。
將所有相關物件保留在一個邏輯群組中是一種很好的做法。在 Kubernetes 中,我們使用Namespaces
來實現這一點。
命名空間允許我們在邏輯邊界內隔離資源。因此,讓我們建立一個名為service-demo
的新命名空間:
$ kubectl create ns service-demo
namespace/service-demo created
現在,讓我們建立一個聲明性設定並將其保存在service-demo.yaml
檔案中:
apiVersion: v1
kind: Service
metadata:
name: cluster-ip-01
namespace: service-demo
labels:
app: nginx
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: cluster-ip-02
namespace: service-demo
labels:
app: nginx
spec:
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: node-port-01
namespace: service-demo
labels:
app: java
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: node-port-02
namespace: service-demo
labels:
app: java
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: load-balancer-01
namespace: service-demo
labels:
app: mysql
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 8080
---
apiVersion: v1
kind: Service
metadata:
name: load-balancer-02
namespace: service-demo
labels:
app: mysql
spec:
type: LoadBalancer
ports:
- name: http
port: 80
targetPort: 8080
接下來,讓我們使用apply
指令建立服務:
$ kubectl apply -f service-demo.yaml
現在,所需的設定已準備就緒。在接下來的幾節中,我們將了解如何刪除這些Service
物件。
3. 使用服務名刪除
刪除 Kubernetes 物件最簡單的方法之一是使用其名稱。那麼,讓我們來看看一些使用名稱刪除單一服務和多個服務的實際範例。
3.1.刪除單一服務
我們可以使用kubectl
指令的delete
操作來刪除任何 Kubernetes 物件。
為了理解這一點,讓我們刪除名為cluster-ip-01
的服務:
$ kubectl delete service cluster-ip-01 -n service-demo
service "cluster-ip-01" deleted
此處,輸出訊息確認服務cluster-ip-01
已被刪除。
3.2.一次刪除多個服務
在前面的範例中,我們看到使用服務名稱刪除服務是多麼容易。但是,如果我們要刪除多個服務,此方法並不是最有效的。在這種情況下,我們可以在命令列中指定多個服務名稱。
因此,讓我們刪除名為node-port-01
和node-port-02
的服務:
$ kubectl delete service node-port-01 node-port-02 -n service-demo
service "node-port-01" deleted
service "node-port-02" deleted
3.3.一次刪除所有服務
到目前為止,我們已經討論瞭如何使用單一服務和多個服務的名稱來刪除它們。但是,如果我們想要刪除所有服務,這些方法就不合適了。如果要刪除的服務數量很多,很快就會變得非常耗時。在這種情況下,我們可以使用–all
選項來刪除所有服務。
讓我們從service-demo
命名空間中刪除所有服務:
$ kubectl delete service --all -n service-demo
在這裡,我們可以看到單一命令足以刪除特定命名空間中的所有服務。
需要注意的是,此操作具有破壞性,如果不小心執行,可能會導致停機。所以,我們在執行這個指令時必須非常小心。
4. 使用聲明式配置刪除
在設定範例時,我們使用聲明性配置來建立 Kubernetes 服務。同樣,我們也可以使用相同的聲明式配置來刪除服務。讓我們看看實際情況。
在上一節中,我們刪除了所有服務。所以,首先,讓我們重新創建它們:
$ kubectl apply -f service-demo.yaml
4.1.從標準輸入提供聲明性配置
在service-demo.yaml
檔案中,前 13 行表示cluster-ip-01
服務的設定。我們可以透過標準輸入流向-f
選項指定此聲明性配置:
$ head -13 service-demo.yaml | kubectl delete -f -
service "cluster-ip-01" deleted
在此範例中, head
指令顯示service-demo.yaml
檔案的前 13 行。然後,shell 將輸出透過管道傳輸到kubectl
命令。命令中的hyphen (-)
表示標準輸入流。
4.2.從文件提供聲明性配置
同樣,我們也可以使用純文字檔案來指定聲明性配置。
為了理解這一點,讓我們刪除service-demo.yaml
檔案中定義的所有服務:
$ kubectl delete -f service-demo.yaml --ignore-not-found=true -n service-demo
在這裡,我們使用–ignore-not-found=true
選項來抑制錯誤。當指令嘗試刪除不存在的cluster-ip-01
服務時,會產生該錯誤。
5. 使用字段選擇器刪除
在 Kubernetes 中,欄位選擇器允許我們根據某些欄位過濾物件。例如,我們可以使用metadata.name
或metadata.namespace
欄位來篩選Service
物件。
讓我們透過一個簡單的範例來理解這一點,但在此之前,讓我們重新創建所有服務:
$ kubectl apply -f service-demo.yaml
透過欄位選擇器,我們可以使用相等和不等運算子:
$ kubectl delete service --field-selector metadata.name==cluster-ip-02 -n service-demo
service "cluster-ip-02" deleted
在此範例中,我們使用metadata.name
欄位來匹配服務名稱。指令中的==
運算子表示相等條件。
6. 使用標籤查詢刪除
在上一節中,我們看到了字段選擇器的用法。但是,欄位選擇器的功能不如標籤豐富,因為支援的欄位因 Kubernetes 資源類型而異。除此之外,它們不支援基於集合的條件。為了克服這個限制,我們可以使用 Kubernetes 標籤。
標籤主要用於標記資源,它們以鍵值對的形式定義。例如,在設定範例時,我們新增了標籤,例如 – app: nginx
、 app: java
和app: mysql
。
讓我們使用–show-labels
選項來顯示標籤:
$ kubectl get service --show-labels -n service-demo
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE LABELS
cluster-ip-01 ClusterIP 10.96.137.225 <none> 80/TCP 28s app=nginx
load-balancer-01 LoadBalancer 10.96.19.90 <pending> 80:30655/TCP 28s app=mysql
load-balancer-02 LoadBalancer 10.96.228.184 <pending> 80:30061/TCP 28s app=mysql
node-port-01 NodePort 10.96.121.44 <none> 80:31406/TCP 28s app=java
node-port-02 NodePort 10.96.248.95 <none> 80:32472/TCP 28s app=java
此處,最後一列顯示與每個服務關聯的標籤。現在,讓我們看看如何使用這些標籤來刪除服務。
6.1.使用單一標籤
我們可以使用–selector
選項來指定標籤查詢。
為了理解這一點,我們刪除所有標籤鍵為app,
且值為java
的服務:
$ kubectl delete service --selector app=java -n service-demo
service "node-port-01" deleted
service "node-port-02" deleted
在此範例中, assignment operator (=)
表示基於相等的條件。類似地,我們可以使用not-equal-to operator (!=)
來指定基於不等式的條件。
6.2.使用多個標籤
在上一節中,我們使用了簡單的基於相等的條件。同樣,我們也可以使用帶有標籤的基於集合的條件來執行高級過濾。
因此,讓我們使用in
運算子刪除標籤鍵為app
且標籤值為nginx
或mysql
的所有服務:
$ kubectl delete service --selector 'app in(nginx,mysql)' -n service-demo
service "cluster-ip-01" deleted
service "load-balancer-01" deleted
service "load-balancer-02" deleted
7. 清理
刪除臨時建立的物件是一個好習慣。這有助於我們有效地利用集群資源。
我們已經刪除了所有Service
對象。現在,讓我們刪除在設定範例時建立的Namespace
物件:
$ kubectl delete ns service-demo
namespace "service-demo" deleted
八、結論
在本文中,我們討論如何從 Kubernetes 叢集中刪除服務。
首先,我們討論如何使用聲明性配置刪除服務。接下來,我們了解如何使用名稱刪除單一服務和多個服務。
最後,我們討論瞭如何使用欄位選擇器和標籤。