ArgoCD で Kiali Operatr アプリケーションを削除できない場合の対処

ArgoCD に作成した KIali Operator アプリケーションが削除できなくなってしまった問題に対処しました。

再現

Kiali Operator アプリケーション作成

ArgoCD に Kiali Operator のアプリケーションを作成します。

f:id:nnstt1:20200918063242p:plain

f:id:nnstt1:20200918063302p:plain

f:id:nnstt1:20200918063325p:plain

f:id:nnstt1:20200919065533p:plain

作成できました。

アプリケーション削除

ArgoCD から先ほど作成した Kiali Operator アプリケーションを削除します。

下図のように Deleting のまま残ってしまいました(環境に依るかもしれません)。

f:id:nnstt1:20200917065104p:plain

対処

リソースの確認

Kiali Operator で作成されたリソースが残っていないか確認します。

$ kubectl get all -n kiali-operator
No resources found in kiali-operator namespace.

$ kubectl get all -n istio-system
NAME                                       READY   STATUS    RESTARTS   AGE
pod/istio-egressgateway-b9d46896-mb6np     1/1     Running   0          6d5h
pod/istio-ingressgateway-dc76747bf-vk9g5   1/1     Running   0          6d5h
pod/istiod-69c88fcb8-d25rl                 1/1     Running   0          6d5h

NAME                           TYPE           CLUSTER-IP      EXTERNAL-IP     PORT(S)                                                                      AGE
service/istio-egressgateway    ClusterIP      10.109.88.14    <none>          80/TCP,443/TCP,15443/TCP                                                     9d
service/istio-ingressgateway   LoadBalancer   10.105.166.93   192.168.2.245   15021:30988/TCP,80:31835/TCP,443:31962/TCP,31400:31141/TCP,15443:32537/TCP   9d
service/istiod                 ClusterIP      10.108.38.61    <none>          15010/TCP,15012/TCP,443/TCP,15014/TCP,853/TCP                                9d

NAME                                   READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/istio-egressgateway    1/1     1            1           9d
deployment.apps/istio-ingressgateway   1/1     1            1           9d
deployment.apps/istiod                 1/1     1            1           9d

NAME                                             DESIRED   CURRENT   READY   AGE
replicaset.apps/istio-egressgateway-b9d46896     1         1         1       9d
replicaset.apps/istio-ingressgateway-dc76747bf   1         1         1       9d
replicaset.apps/istiod-69c88fcb8                 1         1         1       9d

$ kubectl get crd
NAME                                          CREATED AT
...(snip)...
kialis.kiali.io                               2020-09-17T21:34:39Z
...(snip)...

Pods や Services は無くなっていますが、CRD (Custom Resource Definition) kialis.kiali.io が残ってしまっています。

$ kubectl describe crd kialis.kiali.io
Name:         kialis.kiali.io
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  apiextensions.k8s.io/v1
Kind:         CustomResourceDefinition
Metadata:
  Creation Timestamp:  2020-09-17T21:34:39Z
  Generation:          1
  Managed Fields:
    API Version:  apiextensions.k8s.io/v1beta1
    Fields Type:  FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .:
          f:kubectl.kubernetes.io/last-applied-configuration:
      f:spec:
        f:conversion:
          .:
          f:strategy:
        f:group:
        f:names:
          f:kind:
          f:listKind:
          f:plural:
          f:singular:
        f:preserveUnknownFields:
        f:scope:
        f:subresources:
          .:
          f:status:
        f:version:
        f:versions:
      f:status:
        f:storedVersions:
    Manager:      argocd-application-controller
    Operation:    Update
    Time:         2020-09-17T21:34:39Z
    API Version:  apiextensions.k8s.io/v1
    Fields Type:  FieldsV1
    fieldsV1:
      f:status:
        f:acceptedNames:
          f:kind:
          f:listKind:
          f:plural:
          f:singular:
        f:conditions:
    Manager:         kube-apiserver
    Operation:       Update
    Time:            2020-09-17T21:34:39Z
  Resource Version:  4465211
  Self Link:         /apis/apiextensions.k8s.io/v1/customresourcedefinitions/kialis.kiali.io
  UID:               a36f4355-483b-4a20-92cb-37a2f5a91902
Spec:
  Conversion:
    Strategy:  None
  Group:       kiali.io
  Names:
    Kind:                   Kiali
    List Kind:              KialiList
    Plural:                 kialis
    Singular:               kiali
  Preserve Unknown Fields:  true
  Scope:                    Namespaced
  Versions:
    Name:     v1alpha1
    Served:   true
    Storage:  true
    Subresources:
      Status:
Status:
  Accepted Names:
    Kind:       Kiali
    List Kind:  KialiList
    Plural:     kialis
    Singular:   kiali
  Conditions:
    Last Transition Time:  2020-09-17T21:34:39Z
    Message:               no conflicts found
    Reason:                NoConflicts
    Status:                True
    Type:                  NamesAccepted
    Last Transition Time:  2020-09-17T21:34:39Z
    Message:               the initial names have been accepted
    Reason:                InitialNamesAccepted
    Status:                True
    Type:                  Established
  Stored Versions:
    v1alpha1
Events:  <none>

CRD 削除

残ってしまった CRD kialis.kiali.io を削除します。

$ kubectl delete crd kialis.kiali.io
customresourcedefinition.apiextensions.k8s.io "kialis.kiali.io" deleted

返ってきません…。 ArgoCD も依然として Deleting です。

CRD の状態を見てみます。

$ kubectl describe crd kialis.kiali.io
Name:         kialis.kiali.io
Namespace:    
Labels:       <none>
Annotations:  <none>
API Version:  apiextensions.k8s.io/v1
Kind:         CustomResourceDefinition
Metadata:
  Creation Timestamp:  2020-09-17T21:34:39Z
  Deletion Timestamp:  2020-09-18T21:28:07Z
  Finalizers:
    customresourcecleanup.apiextensions.k8s.io
  Generation:  1

...(snip)...

  Conditions:
    Last Transition Time:  2020-09-17T21:34:39Z
    Message:               no conflicts found
    Reason:                NoConflicts
    Status:                True
    Type:                  NamesAccepted
    Last Transition Time:  2020-09-17T21:34:39Z
    Message:               the initial names have been accepted
    Reason:                InitialNamesAccepted
    Status:                True
    Type:                  Established
    Last Transition Time:  2020-09-18T21:28:07Z
    Message:               CustomResource deletion is in progress
    Reason:                InstanceDeletionInProgress
    Status:                True
    Type:                  Terminating
  Stored Versions:
    v1alpha1
Events:  <none>

Metadata に Finalizers customresourcecleanup.apiextensions.k8s.io が追加されています。 また、Conditions を見ると、削除処理は実行中のようです。

この状態で CRD が残り続けてしまったので、強制的に削除します。

$ kubectl patch crd kialis.kiali.io -p '{"metadata":{"finalizers":[]}}' --type=merge
customresourcedefinition.apiextensions.k8s.io/kialis.kiali.io patched

$ kubectl get crd kialis.kiali.io
Error from server (NotFound): customresourcedefinitions.apiextensions.k8s.io "kialis.kiali.io" not found

CRD を削除できたようです。

このタイミングで、ArgoCD に残り続けていた Kiali Operator アプリケーションも削除完了しました。

おわりに

無事に Kiali Operator アプリケーションを削除することができました。

しかし、なぜ CRD が残り続けてしまったかを把握できていません。

Kubernetes は奥が深いようなのでじっくり勉強していきます。

参考にしたリンク

Extend the Kubernetes API with CustomResourceDefinitions | Kubernetes

https://github.com/kubernetes/kubernetes/issues/60538