删除Service后Endpoints为何被连带删除?--cascade=orphan参数无效求解
关于删除Service时同名Endpoints被连带删除的问题解答
原因分析
当你通过同一个YAML文件(用---分隔)同时创建Service和同名Endpoints时,Kubernetes会自动为这两个资源建立所有者引用(Owner Reference),将Service设为Endpoints的所有者。
--cascade=orphan参数仅对控制器管理的子资源(比如Deployment创建的Pod)生效,用于删除父资源时保留子资源,但这种直接通过同一YAML创建的所有者关联不在该参数的覆盖范围内。所以即使添加了这个参数,删除Service时,Kubernetes依然会根据所有者引用规则删除对应的Endpoints。
解决方法
方法一:分开创建Service和Endpoints
不要将Service和Endpoints定义在同一个YAML文件中,拆分为两个独立文件分别创建:
- 新建
service.yml,仅包含Service定义:
apiVersion: v1 kind: Service metadata: name: external-service spec: ports: - port: 80 name: p1 - port: 91 name: p2
- 新建
endpoints.yml,仅包含Endpoints定义:
apiVersion: v1 kind: Endpoints metadata: name: external-service subsets: - addresses: - ip: 10.244.0.110 - ip: 10.244.0.111 - ip: 10.244.0.112 ports: - port: 80 name: p1 - port: 91 name: p2
执行以下命令分别创建资源:
kubectl apply -f service.yml kubectl apply -f endpoints.yml
这种方式下两者不会建立所有者引用,后续删除Service时Endpoints会被保留。
方法二:手动移除Endpoints的所有者引用
如果已经用同一YAML创建了资源,先编辑Endpoints移除所有者关联:
kubectl edit endpoints external-service
在打开的编辑器中,找到metadata.ownerReferences字段,删除整个数组内容后保存退出。之后再执行删除命令:
kubectl delete svc external-service --cascade=orphan
此时Endpoints就不会被连带删除了。
内容的提问来源于stack exchange,提问作者learningtech
相关产品推荐
相关产品推荐

