如何刪除 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 叢集中刪除服務。
首先,我們討論如何使用聲明性配置刪除服務。接下來,我們了解如何使用名稱刪除單一服務和多個服務。
最後,我們討論瞭如何使用欄位選擇器和標籤。