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"
}
}
消えない、、
— gkzz / Gakuji Tamaki (@gkzvoice) May 6, 2022
How do I troubleshoot namespaces in a terminated state in my Amazon EKS cluster?https://t.co/szzUC0IhhY
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
コマンドで修正した情報を反映させるkubectl replace
コマンドはImperative (命令型)
的な性格。なお、kubectl apply
はDeclarative (宣言型)
- cf. What is the difference between kubectl apply and kubectl replace - Stack Overflow
$ kubectl replace --raw "/api/v1/namespaces/argocd/finalize" -f ./tmp.json
$ kubectl get ns argocd
Error from server (NotFound): namespaces "argocd" not found
無事、削除できた!
5.参考
- 作成した Namespace を削除しようとするとTerminatingのまま削除できないという問題に対応している事例集
- Finalizers について
- 今回使った kubectl replace コマンドについて