1.この記事を書こうと思った背景

Amazon EKS 上で作成した Namespace を kubetcl delete namespace <namespace> と削除しようとしても削除できないことがあった。(ここで削除したい Namespace は argocd)

$ kubectl get ns argocd
NAME     STATUS        AGE
argocd   Terminating   50m

$ kubectl get namespace argocd -o json 
{
    "apiVersion": "v1",
    "kind": "Namespace",
    "metadata": {
        "creationTimestamp": "2022-05-06T15:36:43Z",
        "deletionTimestamp": "2022-05-06T16:15:02Z",
        "labels": {
            "kubernetes.io/metadata.name": "argocd"
        },
        "name": "argocd",
        "resourceVersion": "16545",
        "uid": "7e29177f-2c2c-4583-b027-49946160bf2b"
    },
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
    "status": {
        "conditions": [
            {
                "lastTransitionTime": "2022-05-06T16:15:09Z",
                "message": "All resources successfully discovered",
                "reason": "ResourcesDiscovered",
                "status": "False",
                "type": "NamespaceDeletionDiscoveryFailure"
            },
            {
                "lastTransitionTime": "2022-05-06T16:15:09Z",
                "message": "All legacy kube types successfully parsed",
                "reason": "ParsedGroupVersions",
                "status": "False",
                "type": "NamespaceDeletionGroupVersionParsingFailure"
            },
            {
                "lastTransitionTime": "2022-05-06T16:15:09Z",
                "message": "All content successfully deleted, may be waiting on finalization",
                "reason": "ContentDeleted",
                "status": "False",
                "type": "NamespaceDeletionContentFailure"
            },
            {
                "lastTransitionTime": "2022-05-06T16:15:09Z",
                "message": "Some resources are remaining: applications.argoproj.io has 1 resource instances",
                "reason": "SomeResourcesRemain",
                "status": "True",
                "type": "NamespaceContentRemaining"
            },
            {
                "lastTransitionTime": "2022-05-06T16:15:09Z",
                "message": "Some content in the namespace has finalizers remaining: resources-finalizer.argocd.argoproj.io in 1 resource instances",
                "reason": "SomeFinalizersRemain",
                "status": "True",
                "type": "NamespaceFinalizersRemaining"
            }
        ],
        "phase": "Terminating"
    }
}

2.原因の推測

直接的な原因としては、Kubernetes の公式ドキュメントに書かれている、finalizers can block the deletion of dependent object という点だろう。

In some situations, finalizers can block the deletion of dependent objects, which can cause the targeted owner object to remain for longer than expected without being fully deleted. In these situations, you should check finalizers and owner references on the target owner and dependent objects to troubleshoot the cause.

状況によっては、ファイナライザーが依存オブジェクトの削除をブロックすることがあります。これにより、ターゲットの所有者オブジェクトが完全に削除されずに予想よりも長く残る可能性があります。 このような状況では、原因のトラブルシューティングを行うために、ターゲットの所有者と依存オブジェクトのファイナライザーと所有者の参照を確認する必要があります。

出所:Finalizers | Kubernetes (邦訳版はGoogle翻訳より)

では、どうして finalizers がリソースの削除を妨げるようになっているのか?という根本的な原因までは解明できなかった。おそらく、リソースの削除中に作成しようとしたからなどだろうと予想している。

ここでは書かないこと

  • finalizers をどうしてこの機能を使う状況になっていたのか?
  • finalizers がなにをしてくれるのか?という点については、以下の記事が参考になった。

3.環境情報

$ kubectl version --short=true
Client Version: v1.23.0
Server Version: v1.22.6-eks-14c7a48

4.やったこと

  • Namespace(argocd) の情報を適当なファイルに吐き出し、spec.finalizers の value をカラにする
$ kubectl get desribe namespace argocd -o json > tmp.json
$ vim ./tmp.json
  • 修正前(抜粋)
    "spec": {
        "finalizers": [
            "kubernetes"
        ]
    },
  • 修正後(抜粋。spec.finalizers の value をカラにした。)
    "spec": {
        "finalizers": []
    },
$ kubectl replace --raw "/api/v1/namespaces/argocd/finalize" -f ./tmp.json
$ kubectl get ns argocd
Error from server (NotFound): namespaces "argocd" not found

無事、削除できた!

5.参考