1. 概述

在分布式系统中,网络是不可或缺的组成部分,Kubernetes 也不例外。在 Kubernetes 中,Service 是核心的网络资源对象之一,它提供了固定的 DNS 记录、IP 地址和端口,为服务发现和通信提供保障。

作为 Kubernetes 用户,我们经常需要删除不再使用的 Service,以保持集群的整洁和资源的合理利用。本文将介绍几种删除 Kubernetes Service 的常用方法,并通过示例帮助理解。


2. 准备测试环境

为了演示删除操作,我们先创建几个不同类型的 Service,并放在一个独立的命名空间中。

创建命名空间

$ kubectl create ns service-demo
namespace/service-demo created

创建 Service 配置文件

创建一个名为 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

应用配置

$ kubectl apply -f service-demo.yaml

现在我们已经创建了 6 个 Service,接下来将演示几种删除方式。


3. 根据 Service 名称删除

这是最直接的方式,适用于删除一个或多个指定名称的 Service。

删除单个 Service

$ kubectl delete service cluster-ip-01 -n service-demo
service "cluster-ip-01" deleted

删除多个 Service

$ kubectl delete service node-port-01 node-port-02 -n service-demo
service "node-port-01" deleted
service "node-port-02" deleted

删除命名空间下所有 Service

$ kubectl delete service --all -n service-demo

⚠️ 注意:此操作具有破坏性,可能造成服务中断,请务必谨慎使用。


4. 使用声明式配置删除

如果我们是通过 YAML 文件创建的 Service,也可以用相同的配置文件来删除它们。

从标准输入删除

例如删除 cluster-ip-01

$ head -13 service-demo.yaml | kubectl delete -f -
service "cluster-ip-01" deleted

从文件删除

$ kubectl delete -f service-demo.yaml --ignore-not-found=true -n service-demo

✅ 使用 --ignore-not-found=true 可以避免因某些 Service 不存在而报错。


5. 使用字段选择器删除

Kubernetes 支持通过字段选择器(Field Selector)来筛选资源,适合根据字段如 metadata.namemetadata.namespace 删除特定对象。

$ kubectl delete service --field-selector metadata.name==cluster-ip-02 -n service-demo
service "cluster-ip-02" deleted

⚠️ 注意:字段选择器不支持所有字段,也不支持集合操作(如 in、notin),灵活性不如标签选择器。


6. 使用标签选择器删除

标签(Label)是 Kubernetes 中用于组织资源的核心机制,支持更复杂的筛选条件。

查看标签信息

$ 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

根据单个标签删除

$ kubectl delete service --selector app=java -n service-demo
service "node-port-01" deleted
service "node-port-02" deleted

app=java 表示匹配标签 app 值为 java 的资源。

根据多个标签删除

使用 in 运算符可以匹配多个值:

$ 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 后,建议清理命名空间以释放资源:

$ kubectl delete ns service-demo
namespace "service-demo" deleted

8. 总结

本文介绍了在 Kubernetes 中删除 Service 的几种常用方法,包括:

方法 适用场景 特点
根据名称删除 删除一个或多个已知名称的 Service 简单直接
声明式配置删除 使用 YAML 文件删除 适合批量操作
字段选择器删除 按字段筛选删除 支持简单条件
标签选择器删除 按标签筛选删除 灵活强大,推荐使用

✅ 推荐使用标签选择器进行删除操作,因其具备更高的灵活性和可维护性。
⚠️ 删除操作具有破坏性,建议操作前确认目标对象,避免误删。


原始标题:How to Delete a Kubernetes Service