Kubernetes:Replication Controller在删除后仍然存在

时间:2018-12-05 15:23:24

标签: amazon-web-services kubernetes kubectl

我管理一个由terraform管理的K8s集群:

Client Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:17:39Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"darwin/amd64"}
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-21T09:05:37Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}

我要删除堆栈;所以我删除了代码并申请了。由于超时,它引发了一个错误。我重试了,我成功了。

但是现在,我仍然有2个复制控制器(为空):

portal-api                                          0         0         0         2h
portal-app                                          0         0         0         2h

不再提供服务,不再提供horizo​​ntal_pod_scheduler;但仍然是我的复制控制器。

我试图删除它们:

$ kubectl delete rc portal-api                                                                                                      
error: timed out waiting for "portal-api" to be synced

与我要强制删除相同:

$ kubectl delete rc portal-api --cascade=false --force=true
$ 
$ kubectl get rc
[...]
portal-api                                          0         0         0         2h
portal-app                                          0         0         0         2h
[...]

我仍然可以看到它的配置(用deletionTimestamp填充):

$ kubectl edit rc portal-api

# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: ReplicationController
metadata:
  creationTimestamp: 2018-12-05T14:00:15Z
  deletionGracePeriodSeconds: 0
  deletionTimestamp: 2018-12-05T15:22:00Z
  finalizers:
  - orphan
  generation: 3
  labels:
    App: portal-api
  name: portal-api
  namespace: default
  resourceVersion: "32590661"
  selfLink: /api/v1/namespaces/default/replicationcontrollers/portal-api
  uid: 171f605e-f896-11e8-b761-02d4b8553a0e
spec:
  replicas: 0
  selector:
    App: portal-api
  template:
    metadata:
      creationTimestamp: null
      labels:
        App: portal-api
    spec:
      automountServiceAccountToken: false
      containers:
      - env:
        - name: AUTHORITY_MGR
          value: http://system-authority-manager-service
        image: gitlab.********************:4567/apps/portal/api:prd
        imagePullPolicy: Always
        name: portal-api
        ports:
        - containerPort: 3300
          protocol: TCP
        resources:
          limits:
            cpu: "1"
            memory: 512Mi
          requests:
            cpu: 500m
            memory: 256Mi
        terminationGracePeriodSeconds: 30
    status:
  replicas: 0

有人可以帮我吗?任何想法 ?

谢谢

2 个答案:

答案 0 :(得分:1)

使用kubectl edit rc portal-api从资源中删除finalizer部分:

finalizers:
  - orphan

答案 1 :(得分:1)

这与Garbage Collection有关,以及如何删除曾经拥有所有者但不再拥有的某些对象。

  

删除对象时,可以指定是否也自动删除对象的从属。自动删除依赖项称为级联删除级联删除有两种模式:背景前景

     

如果删除一个对象而不自动删除其依赖项,则这些依赖项被称为孤立的

您可以阅读有关Controlling how the garbage collector deletes dependents的文档,有关前景级联删除和背景级联删除的工作方式。

  

设置级联删除策略

     

要控制级联删除策略,请在删除对象时在propagationPolicy参数上设置deleteOptions字段。可能的值包括“孤立”,“前景”或“背景”。

     

在Kubernetes 1.9之前,许多控制器资源的默认垃圾回收策略是orphan。其中包括ReplicationController,ReplicaSet,StatefulSet,DaemonSet和Deployment。对于extensions/v1beta1apps/v1beta1apps/v1beta2组版本中的种类,除非另行指定,否则默认情况下将孤立依赖对象。在Kubernetes 1.9中,对于apps/v1组版本中的所有种类,默认情况下都会删除依赖对象

     

kubectl还支持级联删除。要使用kubectl自动删除依赖项,请将--cascade设置为true。对于孤立的家属,请将--cascade设置为false。 --cascade的默认值为true。

     

下面是一个使ReplicaSet的依赖对象孤立的示例:   kubectl delete replicaset my-repset --cascade=false