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.name
或 metadata.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 文件删除 | 适合批量操作 |
字段选择器删除 | 按字段筛选删除 | 支持简单条件 |
标签选择器删除 | 按标签筛选删除 | 灵活强大,推荐使用 |
✅ 推荐使用标签选择器进行删除操作,因其具备更高的灵活性和可维护性。
⚠️ 删除操作具有破坏性,建议操作前确认目标对象,避免误删。