Ich verwende v1.8.4 und habe das Problem, dass der gelöschte Namespace fĂŒr immer im Status "Beenden" bleibt. Ich habe bereits "kubectl delete namespace XXXX".
/ sig api-maschinen
@ shean-guangchang Hast du eine Möglichkeit, dies zu reproduzieren?
Und verwenden Sie aus Neugier irgendwelche CRDs? Dieses Problem hatten wir zuvor mit TPRs.
/ Art Bug
Ich habe anscheinend dieses Problem bei einer Turmbereitstellung:
â tmp git:(master) â kubectl delete namespace rook
Error from server (Conflict): Operation cannot be fulfilled on namespaces "rook": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
â tmp git:(master) â
Ich denke, es hat etwas mit ihrer CRD zu tun. Ich sehe dies in den API-Serverprotokollen:
E0314 07:28:18.284942 1 crd_finalizer.go:275] clusters.rook.io failed with: timed out waiting for the condition
E0314 07:28:18.287629 1 crd_finalizer.go:275] clusters.rook.io failed with: Operation cannot be fulfilled on customresourcedefinitions.apiextensions.k8s.io "clusters.rook.io": the object has been modified; please apply your changes to the latest version and try again
Ich habe Rook jetzt in einem anderen Namespace bereitgestellt, kann jedoch die Cluster-CRD nicht erstellen:
â tmp git:(master) â cat rook/cluster.yaml
apiVersion: rook.io/v1alpha1
kind: Cluster
metadata:
name: rook
namespace: rook-cluster
spec:
dataDirHostPath: /var/lib/rook-cluster-store
â tmp git:(master) â kubectl create -f rook/
Error from server (MethodNotAllowed): error when creating "rook/cluster.yaml": the server does not allow this method on the requested resource (post clusters.rook.io)
Scheint, als ob die CRD nie aufgerÀumt wurde:
â tmp git:(master) â kubectl get customresourcedefinitions clusters.rook.io -o yaml
apiVersion: apiextensions.k8s.io/v1beta1
kind: CustomResourceDefinition
metadata:
creationTimestamp: 2018-02-28T06:27:45Z
deletionGracePeriodSeconds: 0
deletionTimestamp: 2018-03-14T07:36:10Z
finalizers:
- customresourcecleanup.apiextensions.k8s.io
generation: 1
name: clusters.rook.io
resourceVersion: "9581429"
selfLink: /apis/apiextensions.k8s.io/v1beta1/customresourcedefinitions/clusters.rook.io
uid: 7cd16376-1c50-11e8-b33e-aeba0276a0ce
spec:
group: rook.io
names:
kind: Cluster
listKind: ClusterList
plural: clusters
singular: cluster
scope: Namespaced
version: v1alpha1
status:
acceptedNames:
kind: Cluster
listKind: ClusterList
plural: clusters
singular: cluster
conditions:
- lastTransitionTime: 2018-02-28T06:27:45Z
message: no conflicts found
reason: NoConflicts
status: "True"
type: NamesAccepted
- lastTransitionTime: 2018-02-28T06:27:45Z
message: the initial names have been accepted
reason: InitialNamesAccepted
status: "True"
type: Established
- lastTransitionTime: 2018-03-14T07:18:18Z
message: CustomResource deletion is in progress
reason: InstanceDeletionInProgress
status: "True"
type: Terminating
â tmp git:(master) â
Ich habe einen Spalt-Namespace in einem Àhnlichen Zustand:
â tmp git:(master) â kubectl delete namespace fission
Error from server (Conflict): Operation cannot be fulfilled on namespaces "fission": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
â tmp git:(master) â kubectl get pods -n fission
NAME READY STATUS RESTARTS AGE
storagesvc-7c5f67d6bd-72jcf 0/1 Terminating 0 8d
â tmp git:(master) â kubectl delete pod/storagesvc-7c5f67d6bd-72jcf --force --grace-period=0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (NotFound): pods "storagesvc-7c5f67d6bd-72jcf" not found
â tmp git:(master) â kubectl describe pod -n fission storagesvc-7c5f67d6bd-72jcf
Name: storagesvc-7c5f67d6bd-72jcf
Namespace: fission
Node: 10.13.37.5/10.13.37.5
Start Time: Tue, 06 Mar 2018 07:03:06 +0000
Labels: pod-template-hash=3719238268
svc=storagesvc
Annotations: <none>
Status: Terminating (expires Wed, 14 Mar 2018 06:41:32 +0000)
Termination Grace Period: 30s
IP: 10.244.2.240
Controlled By: ReplicaSet/storagesvc-7c5f67d6bd
Containers:
storagesvc:
Container ID: docker://3a1350f6e4871b1ced5c0e890e37087fc72ed2bc8410d60f9e9c26d06a40c457
Image: fission/fission-bundle:0.4.1
Image ID: docker-pullable://fission/fission-bundle<strong i="6">@sha256</strong>:235cbcf2a98627cac9b0d0aae6e4ea4aac7b6e6a59d3d77aaaf812eacf9ef253
Port: <none>
Command:
/fission-bundle
Args:
--storageServicePort
8000
--filePath
/fission
State: Terminated
Exit Code: 0
Started: Mon, 01 Jan 0001 00:00:00 +0000
Finished: Mon, 01 Jan 0001 00:00:00 +0000
Ready: False
Restart Count: 0
Environment: <none>
Mounts:
/fission from fission-storage (rw)
/var/run/secrets/kubernetes.io/serviceaccount from fission-svc-token-zmsxx (ro)
Conditions:
Type Status
Initialized True
Ready False
PodScheduled True
Volumes:
fission-storage:
Type: PersistentVolumeClaim (a reference to a PersistentVolumeClaim in the same namespace)
ClaimName: fission-storage-pvc
ReadOnly: false
fission-svc-token-zmsxx:
Type: Secret (a volume populated by a Secret)
SecretName: fission-svc-token-zmsxx
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events: <none>
â tmp git:(master) â
Fission verwendet auch CRDs, sie scheinen jedoch bereinigt zu sein.
@ Shean-Guangchang - Ich hatte das gleiche Problem. Ich habe alles unter den Namespaces manuell gelöscht, alles aus "helm" gelöscht und gelöscht und die Masterknoten einzeln neu gestartet, und das Problem wurde behoben.
Ich stelle mir vor, dass das, was mir begegnet ist, etwas mit der Zusammenarbeit von "Arche", "Pinne" und Kuberenets zu tun hat (ich habe mit dem Helm gebootet und mit der Arche gesichert), so dass dies möglicherweise kein Kuberenets-Problem ist Andererseits war es so gut wie unmöglich, Fehler zu beheben, da es keine relevanten Protokolle gibt.
Wenn es sich um den Turm handelt, sehen Sie sich diesen an: https://github.com/rook/rook/issues/1488#issuecomment -365058080
Ich denke, das macht Sinn, aber es scheint fehlerhaft, dass es möglich ist, einen Namespace in einen nicht löschbaren Zustand zu versetzen.
Ich habe eine Ă€hnliche Umgebung (Ark & Helm) mit @barakAtSoluto und habe das gleiche Problem. Das Löschen und Neustarten der Master hat es jedoch nicht fĂŒr mich behoben. Immer noch beim Beenden stecken.
Ich hatte das auch, als ich versuchte, das Problem neu zu erstellen. Ich musste schlieĂlich einen neuen Cluster erstellen ....
AusschlieĂen - StandardmĂ€Ăig werden kube-system / public und alle archenbezogenen Namespaces gesichert und wiederhergestellt, um dies zu verhindern ...
Ich sehe dies auch auf einem Cluster, der von 1.8.4 auf 1.9.6 aktualisiert wurde. Ich weiĂ nicht einmal, welche Protokolle ich ansehen soll
Das gleiche Problem am 1.10.1 :(
Gleiches Problem am 1.9.6
Bearbeiten: Der Namespace konnte nicht gelöscht werden, da einige Pods hÀngen. Ich habe alle mit --grace-period = 0 --force gelöscht und nach ein paar Minuten wurde auch der Namespace gelöscht.
Hallo,
Ich habe das immer und immer wieder und es ist die meiste Zeit ein Problem mit Finalisierern.
Wenn ein Namespace nicht mehr funktioniert, versuchen Sie, kubectl get namespace XXX -o yaml
und prĂŒfen Sie, ob ein Finalizer vorhanden ist. Wenn ja, bearbeiten Sie den Namespace und entfernen Sie den Finalizer (indem Sie ein leeres Array ĂŒbergeben). AnschlieĂend wird der Namespace gelöscht
@xetys ist es sicher? In meinem Fall gibt es nur einen Finalizer namens "kubernetes".
Das ist seltsam, ich habe noch nie einen solchen Finalizer gesehen. Ich kann nur aufgrund meiner Erfahrung sprechen. Ich habe das mehrere Male in einem Produktionscluster gemacht und es lebt noch
Gleiches Problem am 1.10.5. Ich habe alle RatschlÀge in dieser Ausgabe ohne Ergebnis ausprobiert. Ich konnte die Pods loswerden, aber der Namespace hÀngt immer noch.
Eigentlich wurden auch die ns nach einer Weile gelöscht.
Es wÀre gut zu verstehen, was dieses Verhalten verursacht. Der einzige Finalizer, den ich hatte, sind Kubernetes. Ich habe auch dynamische Webhooks. Können diese in Beziehung gesetzt werden?
@xetys Nun, endlich habe ich deinen Trick fĂŒr die Replikate in diesem Namespace verwendet. Sie hatten einen benutzerdefinierten Finalizer, der wahrscheinlich nicht mehr existierte, sodass ich sie nicht löschen konnte. Als ich die Verweise auf diesen Finalizer entfernte, verschwanden sie und auch der Namespace. Vielen Dank! :) :)
Gleiches Problem bei einem EKS 1.10.3-Cluster:
Server Version: version.Info{Major:"1", Minor:"10", GitVersion:"v1.10.3", GitCommit:"2bba0127d85d5a46ab4b778548be28623b32d0b0", GitTreeState:"clean", BuildDate:"2018-05-28T20:13:43Z", GoVersion:"go1.9.3", Compiler:"gc", Platform:"linux/amd64"}
Das gleiche Problem bei einem Bare-Metal-Cluster:
Client Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.0", GitCommit:"91e7b4fd31fcd3d5f436da26c980becec37ceefe", GitTreeState:"clean", BuildDate:"2018-06-27T20:17:28Z", GoVersion:"go1.10.2", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"11", GitVersion:"v1.11.1", GitCommit:"b1b29978270dc22fecc592ac55d903350454310a", GitTreeState:"clean", BuildDate:"2018-07-17T18:43:26Z", GoVersion:"go1.10.3", Compiler:"gc", Platform:"linux/amd64"}
Mein Namespace sieht so aus:
apiVersion: v1
kind: Namespace
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"creneaux-app","namespace":""}}
name: creneaux-app
spec:
finalizers:
- kubernetes
Es ist tatsÀchlich der zweite Namespace, bei dem ich dieses Problem hatte.
Versuchen Sie dies, um die aktuelle Liste aller Dinge in Ihrem Namespace zu erhalten: https://github.com/kubernetes/kubectl/issues/151#issuecomment -402003022
FĂŒhren Sie dann fĂŒr jedes Objekt kubectl delete
oder kubectl edit
, um die Finalizer zu entfernen.
Das Entfernen des Initialisierers hat den Trick fĂŒr mich getan ...
Wenn ich kubectl edit namespace annoying-namespace-to-delete
mache und die Finalizer entferne, werden sie erneut hinzugefĂŒgt, wenn ich mit einem kubectl get -o yaml
ĂŒberprĂŒfe.
Wenn ich versuche, was Sie erhalte ich keine Ausgabe (das Entfernen von --ignore-not-found
bestÀtigt, dass im Namespace keinerlei Ressourcen gefunden wurden).
@ManifoldFR , ich hatte das gleiche Problem wie Sie und es gelang mir, es durch einen API-Aufruf mit der JSON-Datei zum
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
Bearbeiten Sie dann tmp.json und entfernen Sie "kubernetes"
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/annoying-namespace-to-delete/finalize
und es sollte Ihren Namespace löschen,
@slassh Es hat funktioniert! HĂ€tte ĂŒber einen API-Aufruf nachdenken sollen: Vielen Dank! Wir werden dein Lob fĂŒr immer singen
Das Problem ist in Version 1.11.1 vorhanden. Ich hatte einen festgefahrenen Rancher / Helm-Einsatz von Dokuwiki. Ich musste zuerst das Löschen der Pods erzwingen, wie von @siXor vorgeschlagen, und dann den RatschlÀgen von @slassh folgen. Alles gut jetzt.
@slassh wie sehe ich die kubernetes-cluster-ip? Ich benutze einen der Knoten IP bereitgestellt, die den Kubernetes Cluster ersetzen, und es berichtet 404.
hi @jiuchongxiao , mit kubernetes-cluster-ip meinte ich einen deiner Node Master IP.
Entschuldigung, wenn es verwirrend ist!
Wenn Sie zuerst 'kubectl proxy' starten, können Sie die Locke auf http://127.0.0.1 : 8001 / api / v1 / namespaces / nerviger-Namespace zum Löschen / Finalisieren richten. Ich konnte die Authentifizierung erst dann zum Laufen bringen, wenn ich es so gemacht hatte.
gute tipps @ 2stacks. Sie mĂŒssen nur https
durch http
ersetzen.
Ich sehe dieses Problem immer noch in 1.11.2.
Um mehr Kontext fĂŒr die Reproduktion zu geben, habe ich dies nur bei CRDs gesehen. Durch das Löschen des CRD-Objekts geriet ich in einen seltsamen Zustand, in dem die Objekte, deren EigentĂŒmer es war, nicht gelöscht wurden. Ich habe es nicht bemerkt und daher eine Löschung fĂŒr den Namespace ausgegeben. Dann habe ich alle Objekte im Namespace mit kubectl delete all --all -n my-namespace
gelöscht. Zu diesem Zeitpunkt blieb die Löschung des Namespace hÀngen. Ich hoffe das hilft irgendwie.
Beim Betrachten von Protokollen habe ich gerade herausgefunden, dass dieses spezielle Problem damit zusammenhÀngt, dass der Controller-Manager ungesund ist. In meinem Fall war es höchstwahrscheinlich kein Fehler. Als der Controller-Manager wieder hochfuhr, wurde alles korrekt aufgerÀumt.
@slassh Perfekte Lösung! vielen Dank!!!!
Ich sehe dieses Problem auch mit 1.10.x. Ich finde, dass @slasshs Kommentar eine Terminating
?
Wir haben festgestellt, dass der Grund fĂŒr das Löschen von Namespaces in unserem Fall stecken bleibt (@palmerabollo).
Wenn ein Namespace einen Finalizer kubernetes
, bedeutet dies, dass es sich um ein internes Problem mit dem API-Server handelt.
FĂŒhren Sie kubectl api-resources
. Wenn Folgendes zurĂŒckgegeben wird, bedeutet dies, dass die benutzerdefinierte API nicht erreichbar ist.
error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request
FĂŒhren Sie kubectl get apiservices v1beta1.metrics.k8s.io -o yaml
, um die Statusbedingungen zu ĂŒberprĂŒfen.
status:
conditions:
- lastTransitionTime: 2018-10-15T08:14:15Z
message: endpoints for service/metrics-server in "kube-system" have no addresses
reason: MissingEndpoints
status: "False"
type: Available
Der obige Fehler sollte durch einen Crashloopbackoff verursacht werden, der den Metrics-Server beeinflusst. Ăhnlich verhĂ€lt es sich mit anderen in Kubernetes registrierten benutzerdefinierten APIs.
ĂberprĂŒfen Sie den Zustand Ihrer Dienste in kube-system
um Cluster-LaufzeitvorgÀnge wie das Löschen von Namespaces wiederherzustellen.
Ich bin mit diesem Problem auf v1.11.3 konfrontiert. Bei den Finalisierern sind nur Kubernetes fĂŒr problematische Namespace vorhanden.
spec:
finalizers:
- kubernetes
@slassh Vielen Dank, Ihre Lösung funktioniert gut!
Ich habe das gleiche Problem in meinem Cluster mit Arche, Pinne und Kubed. Ich vermute, dass die Probleme möglicherweise die API von kubed sind, die einen Fehler ausgibt, obwohl ich nicht sicher bin, warum sich dies auf das Löschen eines anderen Namespace auswirkt.
@javierprovecho Ich habe nur mit dem Metrics Server
status:
conditions:
- lastTransitionTime: 2018-08-24T08:59:36Z
message: service/metrics-server in "kube-system" is not present
reason: ServiceNotFound
status: "False"
type: Available
Wissen Sie, wie Sie sich von diesem Zustand erholen können?
Bearbeiten: Ich fand heraus ... Ich musste alles löschen, auch im Zusammenhang mit Metriken / HPA, und dann die gesamte Steuerebene neu starten (ich musste alle meine Replikate davon entfernen, bevor ich sie wieder hochfuhr). Dazu gehörte das Löschen des apiservice
v1beta1.metrics.k8s.io
selbst.
@ 2rs2ts
$ kubectl delete apiservice v1beta1.metrics.k8s.io
Durch Entfernen des nicht funktionierenden API-Dienstes metrics
der Controller-Manager die veralteten Namespaces löschen.
Ein Neustart der Steuerebene ist nicht erforderlich.
@antoineco nein, es war notwendig; Ich habe den Apiservice gelöscht und eine Weile gewartet, aber der Namespace wurde nicht gelöscht, bis ich die Steuerebene neu gestartet habe.
Nehmen Sie zuerst einen kleinen Kaffee und entspannen Sie sich. Gehen Sie jetzt zu Ihren k8s-Masterknoten
Verwenden Sie 'kubectl cluster-info dump', um Clusterprobleme weiter zu debuggen und zu diagnostizieren.
Speichern Sie die ID, um sie spÀter zu löschen :)
lege es in die Datei
curl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize
und es ist weg đ
Hey, der Finalizer kubernetes
ist aus einem bestimmten Grund da. FĂŒr uns war es ein falsch konfigurierter Metrik-API-Dienstname. Vielleicht ist fĂŒr Sie etwas anderes, das Sie anhand Ihrer Protokolle in der Steuerebene entdecken können. Ohne BestĂ€tigung eines Fehlers kann das Entfernen des Finalizers unerwĂŒnschte Folgen haben, z. B. das Belassen von Inhalten, die zum Löschen nicht mehr zugĂ€nglich sind.
da diese Ausgabe noch offen ist:
In meinem Minikube-Cluster, der mit "none" ausgefĂŒhrt wird, geschah dies, nachdem der Host aus dem Ruhezustand aufgewacht war.
meine Annahme:
In meinem Fall löste der Ruhezustand dieselben Probleme aus, ein aktivierter Swap wĂŒrde ausreichen.
was die Annahme ergibt:
Der Swap ist möglicherweise in den betroffenen Clustern aktiviert.
aber das ist nur eine Vermutung. Das Wichtigste fĂŒr mich und jeden, der mit meinem lokalen Setup in diesem Fehler landet : Der
Nehmen Sie zuerst einen kleinen Kaffee und entspannen Sie sich. Gehen Sie jetzt zu Ihren k8s-Masterknoten
- kubectl cluster-info
Der Kubernetes-Master wird unter https: // localhost : 6443 ausgefĂŒhrt
KubeDNS wird unter https: // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns: dns / proxy ausgefĂŒhrtVerwenden Sie 'kubectl cluster-info dump', um Clusterprobleme weiter zu debuggen und zu diagnostizieren.
- FĂŒhren Sie nun den Kube-Proxy aus
kubectl Proxy &
Beginn des Dienstes am 127.0.0.1:8001Speichern Sie die ID, um sie spÀter zu löschen :)
- Finden Sie Ihren Namensraum, der entschieden hat, nicht gelöscht zu werden :) FĂŒr uns wird es ein Viehsystem sein
kubectl get ns
Viehsystem Abschluss 1dlege es in die Datei
- kubectl get Namespace Viehsystem -o json> tmp.json
- Bearbeiten Sie die Datei und entfernen Sie die Finalizer
},
"spec": {
"Finalizer": [
"kubernetes"
]]
},
Nach der Bearbeitung sollte es so aussehen đ
},
"spec": {
"Finalizer": [
]]
},
wir fast da đcurl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize
und es ist weg đ
GroĂartig!!
Funktioniert
Ich stoĂe regelmĂ€Ăig auf dieses Problem, wenn wir unsere gcloud-Instanzen Ă€ndern (z. B. Knoten aktualisieren). Dies ersetzt den alten Knoten von gcloud instances list
durch einen neuen, lÀsst jedoch die Pods im k8s-Namespace hÀngen:
Reason: NodeLost
Message: Node <old node> which was running pod <pod> is unresponsive
Dadurch bleiben die HĂŒlsen in einem unbekannten Zustand:
$ kubectl get po
NAME READY STATUS RESTARTS AGE
<pod> 2/2 Unknown 0 39d
Aus diesem Grund wird der Namespace niemals beendet. Ich bin mir nicht sicher, ob dies bedeutet, dass wir unsere Finalizer Àndern sollten oder ob es einen tatsÀchlichen Fehler im Zusammenhang mit dem Beenden gibt, der Pods in einem UNKNOWN
-Zustand behandeln sollte (oder ob es eine Möglichkeit geben sollte, das Beenden eines Namespace fĂŒr FĂ€lle wie diesen zu erzwingen ).
Ich stoĂe regelmĂ€Ăig auf dieses Problem, wenn wir unsere gcloud-Instanzen Ă€ndern (z. B. Knoten aktualisieren). Dies ersetzt den alten Knoten von
gcloud instances list
durch einen neuen, lÀsst jedoch die Pods im k8s-Namespace hÀngen:Reason: NodeLost Message: Node <old node> which was running pod <pod> is unresponsive
Dadurch bleiben die HĂŒlsen in einem unbekannten Zustand:
$ kubectl get po NAME READY STATUS RESTARTS AGE <pod> 2/2 Unknown 0 39d
Aus diesem Grund wird der Namespace niemals beendet. Ich bin mir nicht sicher, ob dies bedeutet, dass wir unsere Finalizer Àndern sollten oder ob es einen tatsÀchlichen Fehler im Zusammenhang mit dem Beenden gibt, der Pods in einem
UNKNOWN
-Zustand behandeln sollte (oder ob es eine Möglichkeit geben sollte, das Beenden eines Namespace fĂŒr FĂ€lle wie diesen zu erzwingen ).
cool, es ist nicht das gleiche Problem
Sie mĂŒssen die Knoten in den Wartungsmodus versetzen. Nachdem sie sich im Wartungsmodus befinden, werden alle Pods evakuiert und können dann gelöscht / aktualisiert werden
schau es dir an ïŒ https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/ ,
Bearbeiten Sie die Ressource und löschen Sie metadata.finalizers ïŒ und löschen Sie nicht nĂŒtzliche crd ïŒ Sie können sie erzwingen
Aber was macht der kubernetes
Finalizer genau? Besteht das Risiko, dass Ressourcen mit diesem Hack nicht korrekt bereinigt werden?
FĂŒr den Turm, der feststeckte, half dies https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md
curl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json https: // kubernetes-cluster-ip / api / v1 / namespaces / nerviger-namespace zum löschen / finalisieren
Fehler vom Server (NotFound): Namespaces "nerviger Namespace zum Löschen" nicht gefunden
Nehmen Sie zuerst einen kleinen Kaffee und entspannen Sie sich. Gehen Sie jetzt zu Ihren k8s-Masterknoten
- kubectl cluster-info
Der Kubernetes-Master wird unter https: // localhost : 6443 ausgefĂŒhrt
KubeDNS wird unter https: // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns: dns / proxy ausgefĂŒhrtVerwenden Sie 'kubectl cluster-info dump', um Clusterprobleme weiter zu debuggen und zu diagnostizieren.
- FĂŒhren Sie nun den Kube-Proxy aus
kubectl Proxy &
Beginn des Dienstes am 127.0.0.1:8001Speichern Sie die ID, um sie spÀter zu löschen :)
- Finden Sie Ihren Namensraum, der entschieden hat, nicht gelöscht zu werden :) FĂŒr uns wird es ein Viehsystem sein
kubectl get ns
Viehsystem Abschluss 1dlege es in die Datei
- kubectl get Namespace Viehsystem -o json> tmp.json
- Bearbeiten Sie die Datei und entfernen Sie die Finalizer
},
"spec": {
"Finalizer": [
"kubernetes"
]]
},
Nach der Bearbeitung sollte es so aussehen đ
},
"spec": {
"Finalizer": [
]]
},
wir fast da đcurl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize
und es ist weg đ
UngĂŒltiger Wert: "Validierung der bearbeiteten Datei fehlgeschlagen": ValidationError (Namespace.spec): UngĂŒltiger Typ fĂŒr io.k8s.api.core.v1.NamespaceSpec: "string", erwartete "map"
Wenn in Terminating viele Namespaces stecken bleiben, können Sie dies automatisieren:
kubectl get ns | grep Terminating | awk '{print $1}' | gxargs -n1 -- bash -c 'kubectl get ns "$0" -o json | jq "del(.spec.finalizers[0])" > "$0.json"; curl -k -H "Content-Type: application/json" -X PUT --data-binary @"$0.json" "http://127.0.0.1:8001/api/v1/namespaces/$0/finalize" '
Stellen Sie sicher, dass alle Namespaces, fĂŒr die der Finalizer entfernt werden soll, tatsĂ€chlich Terminating
.
Sie benötigen kubectl proxy
running und jq
damit das oben genannte funktioniert.
In unserem Fall ist der Metrik-API-Dienst nicht verfĂŒgbar und ich kann dieses Fehlerprotokoll anhand der ausfĂŒhrlichen Protokollierung sehen
kubectl delete ns <namespace-name> -v=7
.......
I0115 11:03:25.548299 12445 round_trippers.go:383] GET https://<api-server-url>/apis/metrics.k8s.io/v1beta1?timeout=32s
I0115 11:03:25.548317 12445 round_trippers.go:390] Request Headers:
I0115 11:03:25.548323 12445 round_trippers.go:393] Accept: application/json, */*
I0115 11:03:25.548329 12445 round_trippers.go:393] User-Agent: kubectl/v1.11.3 (darwin/amd64) kubernetes/a452946
I0115 11:03:25.580116 12445 round_trippers.go:408] Response Status: 503 Service Unavailable in 31 milliseconds
Nach dem Fixieren des Metrik-Apiservices sind die Beendigung abgeschlossen.
Ich bin mir nicht sicher, warum das Löschen vom Metrik-Apiservice abhÀngt. Ich bin auch daran interessiert zu wissen, wie es funktioniert, wenn der Metrik-Apiservice nicht im Cluster installiert ist
Ich bin mir nicht sicher, warum das Löschen vom Metrik-Service abhÀngt.
@manojbadam Da Metriken auf dem API-Server registriert sind, muss beim AusfĂŒhren eines Namespace-Löschvorgangs die externe API nach (Namespace-) Ressourcen abgefragt werden, die gelöscht werden sollen (falls vorhanden), die diesem Namespace zugeordnet sind. Wenn der Erweiterungsserver nicht verfĂŒgbar ist, kann Kubernetes nicht garantieren, dass alle Objekte entfernt wurden, und es gibt keinen dauerhaften Mechanismus (im Speicher oder auf der Festplatte), der spĂ€ter abgeglichen werden kann, da das Stammobjekt entfernt worden wĂ€re. Dies geschieht bei jedem registrierten API-Erweiterungsdienst.
Da ich stĂ€ndig darauf stieĂ, automatisierte ich dies mit einem kleinen Shell-Skript:
https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
Es ruft das Projekt ab, repariert den JSON, startet und stoppt "kubectl proxy",âŠ
Vielen Dank an alle, die mich in die richtige Richtung weisen!
Da ich stĂ€ndig darauf stieĂ, automatisierte ich dies mit einem kleinen Shell-Skript:
https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
Es ruft das Projekt ab, repariert den JSON, startet und stoppt "kubectl proxy",âŠ
Vielen Dank an alle, die mich in die richtige Richtung weisen!
mein Held! <3
Ich bin auch auf dieses Problem gestoĂen. Ich bin in der Google Kubernetes Engine und verwende Terraform, um Kubernetes-Cluster hochzufahren und Namespaces und Pods innerhalb des Clusters zu erstellen. Das Problem begann eine Weile, nachdem ein terraform destroy
.
In meinem Fall stellt sich heraus, dass dies ein Problem mit der Reihenfolge ist, in der Terraform die Zerstörung ausfĂŒhrt. Terraform löscht zuerst den Knotenpool und dann die Namespaces und Pods. Aufgrund des Löschens des (einzigen) Knotenpools brach der Kubernetes-Cluster jedoch zusammen, und dies fĂŒhrte dazu, dass das Löschen des Namespaces beim "Beenden" fĂŒr immer hĂ€ngen blieb.
@FooBarWidget das gleiche Problem fĂŒr mich :(
Da ich stĂ€ndig darauf stieĂ, automatisierte ich dies mit einem kleinen Shell-Skript:
https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
Es ruft das Projekt ab, repariert den JSON, startet und stoppt "kubectl proxy",âŠ
Vielen Dank an alle, die mich in die richtige Richtung weisen!
[root@k8s-master ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://172.*****:6443/api/v1/namespaces/rook-ceph/finalize
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "namespaces "rook-ceph" is forbidden: User "system:anonymous" cannot update namespaces/finalize in the namespace "rook-ceph"",
"reason": "Forbidden",
"details": {
"name": "rook-ceph",
"kind": "namespaces"
},
"code": 403
Ich habe einen RĂŒckkehrcode 403, was soll ich tun :(
Da ich stĂ€ndig darauf stieĂ, automatisierte ich dies mit einem kleinen Shell-Skript:
https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
Es ruft das Projekt ab, repariert den JSON, startet und stoppt "kubectl proxy",âŠ
Vielen Dank an alle, die mich in die richtige Richtung weisen![root@k8s-master ~]# curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://172.*****:6443/api/v1/namespaces/rook-ceph/finalize { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "namespaces "rook-ceph" is forbidden: User "system:anonymous" cannot update namespaces/finalize in the namespace "rook-ceph"", "reason": "Forbidden", "details": { "name": "rook-ceph", "kind": "namespaces" }, "code": 403
Ich habe einen RĂŒckkehrcode 403, was soll ich tun :(
Thx Gott, der abschlieĂende Namespace ist endlich weg. Die folgende Methode macht einen Trick fĂŒr mich.
NAMESPACE=rook-ceph
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
Ich habe das gleiche Problem, aber ich sehe keinen Metrik-Service.
Ich spiele mit K8s von Digitalocean und Gitlab Auto Devops herum. Ich gehe davon aus, dass es sich um einen Digitalocean-Blob-Speicher handelt, aber ich weiĂ nicht, wie ich ihn analysieren oder beheben soll.
@mingxingshi tx. Hat einen Namespace bearbeitet, der den Trick nicht gemacht hat. Ihr Skript hat es geschafft.
Wow, endlich losgeworden. Danke fĂŒr die Befehle @mingxingshi !
Die Lösung fĂŒr mich war:
kubectl delete apiservice v1beta1.metrics.k8s.io
Ich dachte nur, ich sollte meine Erfahrung hier lassen:
Ich habe terraform apply
mit der folgenden Ressource gemacht:
resource "helm_release" "servicer" {
name = "servicer-api"
// n.b.: this is a local chart just for this terraform project
chart = "charts/servicer-api"
namespace = "servicer"
...
}
Aber ich bin ein Helm-Neuling und hatte eine Vorlage, die eine Vorlage enthielt, die einen Namespace namens servicer
. Dies fĂŒhrte dazu, dass Terraform und k8s in diesen schlechten Zustand gerieten, in dem Terraform fehlschlagen wĂŒrde. Dann lieĂen k8s den Namespace servicer
dauerhaft im Zustand Terminating
. Wenn Sie das tun, was
Dieses Problem trat fĂŒr mich nicht mehr auf, als ich die Vorlage entfernte, die den Namespace erstellt hatte, und es dem Ruder ĂŒberlieĂ, sie zu erstellen.
Das Problem ist fĂŒr mich völlig wiederholbar. Klonen Sie zuerst den Prometheus-Operator . Dann:
cd prometheus-operator/contrib/kube-prometheus
kubectl create -f manifests/ --validate=false
... wait ...
kubectl delete namespace monitoring
HĂ€ngt. Wenn ich jedoch kubectl delete -f manifests/
, ist die Bereinigung erfolgreich.
Ja, hatte den gleichen Hang mit Prometheus-Operator. MĂŒssen kubectl delete -f manifests/
zu lösen.
Ich denke, es gibt einige Finalisierer in Prometheus-CRDs, die sich schlecht benehmen. In diesem speziellen Szenario ist es kaum ein Fehler von Kubernetes. Kubernetes sollten es jedoch einfacher machen, den Schuldigen zu finden, da die LĂ€nge dieses Threads zeigt, dass es viele Ursachen geben kann und es in jedem Szenario nicht einfach ist, dem auf den Grund zu gehen.
Ich bin ein Kubernetes Noob, daher kann ich hier nicht viele Informationen anbieten, aber ich habe auch 2 Namespaces, die im Beendigungsstatus stecken. Mein Kubernetes-Setup verwendet IBM Cloud Private 3.1.2 Community Edition
kubectl version
Client Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.4+icp", GitCommit:"3f5277fa129f05fea532de48284b8b01e3d1ab4e", GitTreeState:"clean", BuildDate:"2019-01-17T13:41:02Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"12", GitVersion:"v1.12.4+icp", GitCommit:"3f5277fa129f05fea532de48284b8b01e3d1ab4e", GitTreeState:"clean", BuildDate:"2019-01-17T13:41:02Z", GoVersion:"go1.10.4", Compiler:"gc", Platform:"linux/amd64"}
kubectl cluster-info
Kubernetes master is running at https://ip
catalog-ui is running at https://ip/api/v1/namespaces/kube-system/services/catalog-ui:catalog-ui/proxy
Heapster is running at https://ip/api/v1/namespaces/kube-system/services/heapster/proxy
image-manager is running at https://ip/api/v1/namespaces/kube-system/services/image-manager:image-manager/proxy
CoreDNS is running at https://ip/api/v1/namespaces/kube-system/services/kube-dns:dns/proxy
metrics-server is running at https://ip/api/v1/namespaces/kube-system/services/https:metrics-server:/proxy
platform-ui is running at https://ip/api/v1/namespaces/kube-system/services/platform-ui:platform-ui/proxy
kubectl get nodes
NAME STATUS ROLES AGE VERSION
ip1 Ready,SchedulingDisabled etcd,management,master,proxy 23h v1.12.4+icp
ip2 Ready worker 23h v1.12.4+icp
ip3 Ready worker 23h v1.12.4+icp
Ich habe zwei Namespaces im Endzustand
kubectl get ns
NAME STATUS AGE
my-apps Terminating 21h
cert-manager Active 23h
default Active 23h
istio-system Active 23h
kube-public Active 23h
kube-system Active 23h
platform Active 22h
psp-example Terminating 18h
services Active 22h
Wenn ich die Finalisierer wie in diesem Kommentar beschrieben ĂŒberprĂŒfe, sehe ich nur kubernetes
.
kubectl get ns my-apps -o yaml
apiVersion: v1
kind: Namespace
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"my-apps"}}
creationTimestamp: 2019-04-10T18:23:55Z
deletionTimestamp: 2019-04-11T15:24:24Z
name: my-apps
resourceVersion: "134914"
selfLink: /api/v1/namespaces/my-apps
uid: ccb0398d-5bbd-11e9-a62f-005056ad5350
spec:
finalizers:
- kubernetes
status:
phase: Terminating
UnabhÀngig davon habe ich versucht, kubernetes
aus den Finalisierern zu entfernen, und es hat nicht funktioniert. Ich habe auch versucht, den in diesem Kommentar beschriebenen json / api-Ansatz
Ich habe auch versucht, das Löschen zu erzwingen, und das funktioniert auch nicht
kubectl delete namespace my-apps --force --grace-period 0
warning: Immediate deletion does not wait for confirmation that the running resource has been terminated. The resource may continue to run on the cluster indefinitely.
Error from server (Conflict): Operation cannot be fulfilled on namespaces "my-apps": The system is ensuring all content is removed from this namespace. Upon completion, this namespace will automatically be purged by the system.
In meinem Fall ist der Namespace rook-ceph, kubectl -n rook-ceph patch cephclusters.ceph.rook.io rook-ceph -p '{"metadata":{"finalizers": []}}' --type=merge
funktioniert fĂŒr mich. In anderen FĂ€llen sollte es auch funktionieren.
Von: https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md
@ManifoldFR , ich hatte das gleiche Problem wie Sie und es gelang mir, es durch einen API-Aufruf mit der JSON-Datei zum
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
Bearbeiten Sie dann tmp.json und entfernen Sie"kubernetes"
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/annoying-namespace-to-delete/finalize
und es sollte Ihren Namespace löschen,
Ich habe ein Problem bei der Verwendung Ihres Ansatzes. Was kann ich fĂŒr die Fehlerbehebung im nĂ€chsten Schritt tun?
~ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://39.96.4.11:6443/api/v1/namespaces/istio-system/finalize
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {
},
"status": "Failure",
"message": "namespaces \"istio-system\" is forbidden: User \"system:anonymous\" cannot update resource \"namespaces/finalize\" in API group \"\" in the namespace \"istio-system\"",
"reason": "Forbidden",
"details": {
"name": "istio-system",
"kind": "namespaces"
},
"code": 403
@ManifoldFR , ich hatte das gleiche Problem wie Sie und es gelang mir, es durch einen API-Aufruf mit der JSON-Datei zum
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
Bearbeiten Sie dann tmp.json und entfernen Sie"kubernetes"
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/annoying-namespace-to-delete/finalize
und es sollte Ihren Namespace löschen,Ich habe ein Problem bei der Verwendung Ihres Ansatzes. Was kann ich fĂŒr die Fehlerbehebung im nĂ€chsten Schritt tun?
~ curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://39.96.4.11:6443/api/v1/namespaces/istio-system/finalize { "kind": "Status", "apiVersion": "v1", "metadata": { }, "status": "Failure", "message": "namespaces \"istio-system\" is forbidden: User \"system:anonymous\" cannot update resource \"namespaces/finalize\" in API group \"\" in the namespace \"istio-system\"", "reason": "Forbidden", "details": { "name": "istio-system", "kind": "namespaces" }, "code": 403
Mein Problem kann mit diesem Skript gelöst werden: https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
.
yup https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns macht den Trick
set -eo pipefail
die() { echo "$*" 1>&2 ; exit 1; }
need() {
which "$1" &>/dev/null || die "Binary '$1' is missing but required"
}
# checking pre-reqs
need "jq"
need "curl"
need "kubectl"
PROJECT="$1"
shift
test -n "$PROJECT" || die "Missing arguments: kill-ns <namespace>"
kubectl proxy &>/dev/null &
PROXY_PID=$!
killproxy () {
kill $PROXY_PID
}
trap killproxy EXIT
sleep 1 # give the proxy a second
kubectl get namespace "$PROJECT" -o json | jq 'del(.spec.finalizers[] | select("kubernetes"))' | curl -s -k -H "Content-Type: application/json" -X PUT -o /dev/null --data-binary @- http://localhost:8001/api/v1/namespaces/$PROJECT/finalize && echo "Killed namespace: $PROJECT"
Es scheint, dass Namespaces tatsÀchlich nicht gelöscht werden.
In meinem Fall zeigt kubectl get ns
nicht den gelöschten Namespace an, sondern kubectl get all -n <namespace>
zeigt alle Ressourcen sicher und zuverlÀssig an.
Ich habe die Knoten ĂŒberprĂŒft und Docker-Container wurden noch ausgefĂŒhrt ...
@glouis , weil Sie die Finalizer mit der oben beschriebenen Methode umgangen haben, sodass Kubernetes keine Zeit hatte, alle wichtigen Löschaufgaben auszufĂŒhren.
Es ist wirklich traurig zu sehen, dass so viele Menschen blind fĂŒr diese Methode eintreten, ohne ihre Konsequenzen zu verstehen. Es ist extrem hĂ€sslich und kann möglicherweise Tonnen von Resten im Cluster hinterlassen. @javierprovecho bereits erwĂ€hnte es oben und @liggitt auch erwĂ€hnte es in einer anderen GitHub Frage.
Sie sollten den defekten API-Service v1beta1.metrics.k8s.io
besser löschen, wenn Sie ihn nicht benötigen.
Siehe auch # 73405
Ich zweite @antoineco Nachricht. Ich habe dies in einer unserer Sandbox-Umgebungen getestet, weil wir stĂ€ndig feststeckende Namespaces hatten. Nach ungefĂ€hr einem Monat froren alle Docker-DĂ€monen ohne Grund. Es stellte sich heraus, dass wir groĂe Speicherlecks verursacht haben, weil wir Ressourcen zurĂŒckgelassen haben.
Nach vielem Ausprobieren und Lesen dieser Kommentare stellte sich heraus, dass es sich um eine benutzerdefinierte Ressourcendefinition fĂŒr den Coreos-Grafana-Stack fĂŒr die Namespaces handelte. Das Auflisten der CRDs zeigte spezifische Ressourcen fĂŒr diesen Namespace. Ich hatte groĂes GlĂŒck, dass der Name der CRD den Namespace enthielt, der feststeckte.
Es stellte sich auch heraus, dass ein festsitzender Namespace weitere zu löschende Namespaces stoppt. Selbst wenn Sie einen Namespace A haben, in dem keine CRDs hĂ€ngen bleiben, und es einen Namespace B mit einer steckengebliebenen CRD gibt, bleiben alle Ressourcen in A erhalten, bis B weg ist. Ich denke, ich muss die oben beschriebene Korrektur fĂŒr Namespace A durchgefĂŒhrt haben und jedes Mal eine Menge Ressourcen ĂŒbrig gelassen haben.
Die Sache, die mich immer noch umbringt, ist, dass ich fĂŒr mein ganzes Leben kein Protokoll finden kann, in dem erwĂ€hnt wird, dass eine Namespace-Bereinigung beim Löschen einer CRD fehlschlĂ€gt oder sogar, was sie gerade tut. Ich musste eine Stunde damit verbringen, herauszufinden, auf welcher CRD es klebte. Wenn jemand eine Idee hat, wie er mehr Informationen erhalten kann, muss ich nicht viel Zeit damit verbringen, die feststeckende Ressource herauszufinden, die fantastisch wĂ€re.
@jecafarelli guter Hinweis fĂŒr Produktionscluster. Aber unglĂŒcklich fĂŒr mich, ich konnte es einfach nicht anders töten. Ich wusste auch, dass ich spĂ€ter den gesamten Cluster neu erstellen werde.
Ich habe versucht, das Problem zu analysieren, aber nichts in diesem Thread hat mir geholfen, es auf andere Weise zu lösen.
Diese offizielle Lösung hat mir geholfen: https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating
Dies ist nicht dasselbe wie kubectl edit namespace rook-ceph
. Ich konnte dieses Problem nicht lösen, bis ich PUT
mit gelöschten _ "Finalizern" _ anforderte
ok also bin ich mit coreos wieder darauf gestoĂen und habe ein bisschen tiefer gegraben. Dies liegt definitiv an einer clusterweiten Ressourcendefinition mit Namespace, und auĂerdem kann sie möglicherweise nicht gelöscht werden, da keine Informationen zu Coreos abgefragt werden können. Ich habe Fehler in den Apiserver-Protokollen gefunden, die Fehler beim Abrufen von Informationen zu einer API-Gruppe zeigten. Ich habe das oben genannte Problem verwendet, um ein schnelles Skript zu erstellen, in dem die Ressourcen aufgelistet sind, bei denen die ns fĂŒr mich hĂ€ngen geblieben sind.
Ich werde dies wahrscheinlich in Zukunft nur verwenden, wenn ich erneut darauf stoĂe und weitere Ressourcen mit Namespace hinzufĂŒge, auf die ich stoĂe.
for ns in `kubectl get ns --field-selector status.phase=Terminating -o name | cut -d/ -f2`;
do
echo "apiservice under namespace $ns"
kubectl get apiservice -o json |jq --arg ns "$ns" '.items[] |select(.spec.service.namespace != null) | select(.spec.service.namespace == $ns) | .metadata.name ' --raw-output
echo "api resources under namespace $ns"
for resource in `kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -o name -n $ns`;
do
echo $resource
done;
done
Vielen Dank @jecafarelli , du hast mir geholfen, mein Problem richtig zu lösen
Ich hatte Cert-Manager in einem OpenShift-Cluster im Cert-Manager-Namespace installiert und als ich versuchte, diesen Namespace zu löschen, blieb er im Beendigungsstatus hĂ€ngen. Das AusfĂŒhren von oc delete apiservices v1beta1.admission.certmanager.k8s.io
scheint das Problem gelöst zu haben, der Namespace ist weg.
Vielen Dank @jecafarelli , du hast mir geholfen, mein Problem richtig zu lösen
Ich hatte Cert-Manager in einem OpenShift-Cluster im Cert-Manager-Namespace installiert und als ich versuchte, diesen Namespace zu löschen, blieb er im Beendigungsstatus hĂ€ngen. Das AusfĂŒhren von
oc delete apiservices v1beta1.admission.certmanager.k8s.io
scheint das Problem gelöst zu haben, der Namespace ist weg.
Das gleiche gilt fĂŒr kubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml
Ich mische mich nur ein, um zu sagen, dass ich diesen Fehler auch bei Version 1.13.6
mit GKE festgestellt habe. Dies geschah, nachdem ich das Istio-Addon von GKE deaktiviert hatte, um es manuell zu installieren und die volle Kontrolle zu behalten.
Dies ist der lĂ€ngste Themen-Thread, fĂŒr dessen Durchlesen ich mir jemals die Zeit genommen habe, und ich bin ĂŒberwĂ€ltigt, dass es keine wirklichen Konsens- oder Reproduktionsschritte gibt, um die Wurzel dieses Problems zu finden. Es scheint, dass es auf so viele verschiedene Arten ausgelöst werden kann :(
Die oben mehrfach erwÀhnte und unter https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating dokumentierte JSON- und Curl / Proxy-Methode hat mich gerettet.
Der Rat unter https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating ist aktiv schĂ€dlich und kann dazu fĂŒhren, dass verwaiste Ressourcen nicht bereinigt werden und wieder auftauchen, wenn ein Namespace mit identischem Namen spĂ€ter neu erstellt wird .
Es wird derzeit daran gearbeitet, die spezifische Ursache fĂŒr das Löschen zu ermitteln. Das grundlegende Problem besteht jedoch darin, dass es API-Typen gibt, deren Bereinigung nicht ĂŒberprĂŒft werden kann. Daher wird das Löschen des Namespace blockiert, bis sie ĂŒberprĂŒft werden.
Wir haben dies auch mit Knative erreicht, das diesen namespace apiservice installiert.
---
apiVersion: apiregistration.k8s.io/v1beta1
kind: APIService
metadata:
labels:
autoscaling.knative.dev/metric-provider: custom-metrics
serving.knative.dev/release: v0.7.1
name: v1beta1.custom.metrics.k8s.io
spec:
group: custom.metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: autoscaler
namespace: knative-serving
version: v1beta1
versionPriority: 100
---
Nach dem Löschen wurden sowohl das knative Serving ns als auch eine Reihe anderer festsitzender Namespaces aufgerĂ€umt. Vielen Dank an @jecafarelli fĂŒr das obige Bash-Skript.
Hier ist eine schreckliche Powershell-Version.
$api = kubectl get apiservice -o json | convertfrom-json
#list out the namespaced api items can ignore kube-system
$api.items | % { $_.spec.service.namespace }
#repalce knative-serving with whatever namespace you found
$api.items | ? { $_.spec.service.namespace -eq 'knative-serving' } | ConvertTo-Json
#replace v1beta1.custom.metrics.k8s.io with whatever you found.
k delete apiservice v1beta1.custom.metrics.k8s.io
Ich hatte heute das gleiche Problem und dieses Skript funktionierte fĂŒr mich.
@ kubernetes / sig-api-machine-misc
Dieser Fehler besteht seit> einem Jahr und ist immer noch ein Problem ... Was ist Ihr Plan, um eingehende Probleme wie dieses zu beheben?
Dies könnte helfen, zumindest zu verstehen, was los ist: https://github.com/kubernetes/kubernetes/pull/80962
Ich treffe das gleiche Problem
k get ns cdnamz-k8s-builder-system -o yaml
apiVersion: v1
kind: Namespace
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"labels":{"control-plane":"controller-manager"},"name":"cdnamz-k8s-builder-system"}}
creationTimestamp: "2019-08-05T18:38:21Z"
deletionTimestamp: "2019-08-05T20:37:37Z"
labels:
control-plane: controller-manager
name: cdnamz-k8s-builder-system
resourceVersion: "5980028"
selfLink: /api/v1/namespaces/cdnamz-k8s-builder-system
uid: 3xxxxxxx
spec:
finalizers:
- kubernetes
status:
phase: Terminating
k get ns
NAME STATUS AGE
cdnamz-k8s-builder-system Terminating 4h20m
Der Namespace-Controller sollte Bedingungen an den Namespace-Status melden, und Clients sollten dies melden. Benötigt einen KEP, sollte aber ziemlich einfach sein, wenn jemand ihn nehmen und validieren kann.
@timothysc Es gibt (oder gab) eine PR im Flug (irgendwo), die genau das tut, was @smarterclayton sagt.
Ich bin mir ziemlich sicher, dass es auch ein anderes Github-Problem gibt?
Ja, die PR ist hier: https://github.com/kubernetes/kubernetes/pull/73405
Das Problem, das ich fĂŒr kanonisch halte, ist hier: https://github.com/kubernetes/kubernetes/issues/70916
Hier ist eine Ressource, die mir geholfen hat: https://www.ibm.com/support/knowledgecenter/de/SSBS6K_3.1.1/troubleshoot/ns_terminating.html
Es Àhnelt der von @slassh vorgeschlagenen kubectl proxy
, um einen lokalen Proxy zu erstellen und die Ziel-IP des Befehls curl
vorhersehbar zu machen.
- -
Bearbeiten: Wie unter dieser Antwort mehrmals angegeben, ist diese Lösung ein schmutziger Hack und hinterlÀsst möglicherweise einige abhÀngige Ressourcen im Cluster. Die Verwendung erfolgt auf eigenes Risiko und möglicherweise nur als schneller Ausweg in einem Entwicklungscluster (nicht in einem Produktionscluster).
Das direkte Entfernen des Finalizers wie im obigen Dokument beschrieben kann Konsequenzen haben. Die Ressourcen, deren Löschung ausstand, werden auch nach der Freigabe des Namespace im Cluster definiert. Dies ist der Zweck des Finalizers. Um sicherzustellen, dass alle abhÀngigen Elemente entfernt werden, bevor das Löschen des ns ermöglicht wird.
Problemumgehung in Àhnlichen Fragen gefunden:
NAMESPACE=<namespace-name>
kubectl proxy &
kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json
curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
Problemumgehung in Àhnlichen Fragen gefunden:
NAMESPACE=<namespace-name> kubectl proxy & kubectl get namespace $NAMESPACE -o json |jq '.spec = {"finalizers":[]}' >temp.json curl -k -H "Content-Type: application/json" -X PUT --data-binary @temp.json 127.0.0.1:8001/api/v1/namespaces/$NAMESPACE/finalize
Vielen Dank!
Es funktioniert gut.
Ich erstelle eine einfache App mit dieser Problemumgehung: https://github.com/jenoOvchi/k8sdelns
Ich benutze es zum schnellen Löschen und hoffe, dass es fĂŒr jemanden hilfreich ist.
Kubernetes 1.12.2-Namespaces befinden sich im Status "Beenden". Manchmal können die Finalizer gelöscht werden, indem das yaml von ns geÀndert wird. Es kann nicht von API gelöscht werden. Kann es gelöscht werden? Was ist die Situation? Haben wir es speziell verfolgt (Voraussetzung: Es gibt keine Ressourcen in diesem ns), hoffe ich kann Hinweise bekommen, danke!
Bitte entfernen Sie den Finalizer nicht, er ist aus einem bestimmten Grund vorhanden. Versuchen Sie stattdessen herauszufinden, welche Ressourcen im NS noch gelöscht werden mĂŒssen, indem:
kubectl get apiservice|grep False
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(ein groĂes Lob an Jordan fĂŒr diese)Die Lösung fĂŒr dieses Problem besteht nicht darin, den Bereinigungsmechanismus kurzzuschlieĂen, sondern herauszufinden, was den Erfolg der Bereinigung verhindert.
Bitte entfernen Sie den Finalizer nicht, er ist aus einem bestimmten Grund vorhanden. Versuchen Sie stattdessen herauszufinden, welche Ressourcen im NS noch gelöscht werden mĂŒssen, indem:
- ĂberprĂŒfen, ob ein Apiservice nicht verfĂŒgbar ist und daher seine Ressourcen nicht bereitstellt:
kubectl get apiservice|grep False
- Finden aller Ressourcen, die noch vorhanden sind, ĂŒber
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(ein groĂes Lob an Jordan fĂŒr diese)Die Lösung fĂŒr dieses Problem besteht nicht darin, den Bereinigungsmechanismus kurzzuschlieĂen, sondern herauszufinden, was den Erfolg der Bereinigung verhindert.
Wie richtig du bist.
In meinem Fall wurde der Pod von Operator Framework apiservice gelöscht und der Beendigungsprozess blockiert.
Nicht verwendeten Apiservice entfernen (kubectl delete apiservice
Hallo zusammen, das Einfrieren des Codes erfolgt in nur wenigen Tagen (Donnerstag, Ende des Tages, PST). Daher mĂŒssen wir sicherstellen, dass dieses Problem fĂŒr Version 1.16 behoben oder auf Version 1.17 verschoben wird. Können Sie den Status kommentieren?
Wird dies in eine aktuelle GKE-Version zurĂŒckportiert? Ich habe einen Cluster mit einer Handvoll Namespaces, die noch "terminieren".
@squarelover auch danach? https://github.com/kubernetes/kubernetes/issues/60807#issuecomment -524772920
@josiahbjorgaard Ich habe gerade die PR genehmigt, was alles ist, was wir fĂŒr 1.16 tun werden.
https://github.com/kubernetes/kubernetes/pull/73405 ist die oben genannte PR
Es ist zusammengefĂŒhrt. Ich denke, wir können vielleicht noch mehr tun, aber bitte nehmen Sie zukĂŒnftige Kommentare zu # 70916.
Bitte entfernen Sie den Finalizer nicht, er ist aus einem bestimmten Grund vorhanden. Versuchen Sie stattdessen herauszufinden, welche Ressourcen im NS noch gelöscht werden mĂŒssen, indem:
- ĂberprĂŒfen, ob ein Apiservice nicht verfĂŒgbar ist und daher seine Ressourcen nicht bereitstellt:
kubectl get apiservice|grep False
- Finden aller Ressourcen, die noch vorhanden sind, ĂŒber
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(ein groĂes Lob an Jordan fĂŒr diese)Die Lösung fĂŒr dieses Problem besteht nicht darin, den Bereinigungsmechanismus kurzzuschlieĂen, sondern herauszufinden, was den Erfolg der Bereinigung verhindert.
In vielen FĂ€llen ist möglicherweise Metric-Server installiert. Wenn die Pods, die Sie in einem bestimmten Namespace bereitstellen, nach der Erfassung von Metriken suchen. Es hĂ€ngt mit dem Metric-Server zusammen. Selbst nachdem Sie alle Ressourcen in diesem Namespace gelöscht haben, ist der Metricserver irgendwie mit diesem Namespace verknĂŒpft. Dadurch wird verhindert, dass Sie den Namespace löschen.
In diesem Beitrag können Sie den Grund ermitteln, warum Sie den Namespace nicht löschen können. Also der Ritusweg.
Versuchen Sie dies, um die aktuelle Liste aller Dinge in Ihrem Namespace zu erhalten: kubernetes / kubectl # 151 (Kommentar)
FĂŒhren Sie dann fĂŒr jedes Objekt
kubectl delete
oderkubectl edit
, um die Finalizer zu entfernen.
Diese Lösung ist nĂŒtzlich fĂŒr mich, danke.
Hallo Leute,
Ich habe ein Skript erstellt, um das Löschen von Namespaces im Abschlussstatus zu vereinfachen: https://github.com/thyarles/knsk.
Vielen Dank.
Wir haben das gleiche Problem festgestellt: Beim Löschen eines Namespace bleibt dieser im Status "Beenden" hÀngen. Ich habe die obigen Schritte befolgt, um 'kubernetes' im Finalizer in der yaml-Datei zu entfernen. Es klappt.
Wir wissen jedoch nicht, warum wir zusĂ€tzliche Schritte ausfĂŒhren mĂŒssen. Es sollte kubectl löschen ns foonamespace und es sollte löschen. Kann mir jemand einen Grund geben? Vielen Dank!
Hallo @ xzhang007 ,
Wenn Sie herausfinden, warum das Löschen des Namespace im Status "Beenden" stecken bleibt, lassen Sie es mich bitte wissen. Ich habe eine Weile versucht, eine gute Antwort zu finden, aber nichts. Dann habe ich ein Skript erstellt, um mir das Leben zu erleichtern, bis ich die Ursache entdeckt und behoben habe.
Vielen Dank.
@thyales es scheint, dass ich bis jetzt keine Antwort gefunden habe.
In unserem Fall haben wir festgestellt, dass wir einer der Webhhoks und Finalizer waren
Verwenden war, nach einer Kapsel zu greifen, die in den Namespaces lebte, die es gab
gelöscht.
Sobald der Pod gelöscht wurde, steckte die Beendigung fest.
>
@ xzhang007 hast du dir die Antwort @alvaroaleman angesehen ? FĂŒr uns war das genug, um herauszufinden, was die Ursache war.
Bitte entfernen Sie den Finalizer nicht, er ist aus einem bestimmten Grund vorhanden. Versuchen Sie stattdessen herauszufinden, welche Ressourcen im NS noch gelöscht werden mĂŒssen, indem:
- ĂberprĂŒfen, ob ein Apiservice nicht verfĂŒgbar ist und daher seine Ressourcen nicht bereitstellt:
kubectl get apiservice|grep False
- Finden aller Ressourcen, die noch vorhanden sind, ĂŒber
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(ein groĂes Lob an Jordan fĂŒr diese)Die Lösung fĂŒr dieses Problem besteht nicht darin, den Bereinigungsmechanismus kurzzuschlieĂen, sondern herauszufinden, was den Erfolg der Bereinigung verhindert.
Als dieses Problem geschlossen wurde, wurde auf ein neues Ticket verwiesen, um zu erlĂ€utern, wie klargestellt werden kann, warum der Namespace in Terminating stecken bleibt. Ich schlage vor, dass Sie das GesprĂ€ch dort anstelle dieses geschlossenen Themas fĂŒhren.
Es ist zusammengefĂŒhrt. Ich denke, wir können vielleicht noch mehr tun, aber bitte nehmen Sie zukĂŒnftige Kommentare zu # 70916.
@ Jeff-Knurek Das sollte der richtige Weg sein. Vielen Dank.
In unserem Fall war es ein verpfuschtes Upgrade von cert-manager
das den Finalizer kaputt machte. https://github.com/jetstack/cert-manager/issues/1582
$ kube get apiservice
NAME SERVICE AVAILABLE AGE
v1. Local True 43d
v1.apps Local True 43d
v1.authentication.k8s.io Local True 43d
v1.authorization.k8s.io Local True 43d
v1.autoscaling Local True 43d
v1.batch Local True 43d
v1.coordination.k8s.io Local True 43d
v1.networking.k8s.io Local True 43d
v1.rbac.authorization.k8s.io Local True 43d
v1.scheduling.k8s.io Local True 43d
v1.storage.k8s.io Local True 43d
v1alpha1.certmanager.k8s.io Local True 3d22h
v1alpha1.crd.k8s.amazonaws.com Local True 43d
v1beta1.admission.certmanager.k8s.io cert-manager/cointainers-cointainers-cert-manager-webhook False (MissingEndpoints) 60m
v1beta1.admissionregistration.k8s.io Local True 43d
v1beta1.apiextensions.k8s.io Local True 43d
v1beta1.apps Local True 43d
v1beta1.authentication.k8s.io Local True 43d
v1beta1.authorization.k8s.io Local True 43d
v1beta1.batch Local True 43d
v1beta1.certificates.k8s.io Local True 43d
v1beta1.coordination.k8s.io Local True 43d
v1beta1.events.k8s.io Local True 43d
v1beta1.extensions Local True 43d
v1beta1.networking.k8s.io Local True 43d
v1beta1.node.k8s.io Local True 43d
v1beta1.policy Local True 43d
v1beta1.rbac.authorization.k8s.io Local True 43d
v1beta1.scheduling.k8s.io Local True 43d
v1beta1.storage.k8s.io Local True 43d
v1beta1.webhook.cert-manager.io cert-manager/cointainers-cointainers-cert-manager-webhook False (MissingEndpoints) 3d22h
v1beta2.apps Local True 43d
v2beta1.autoscaling Local True 43d
v2beta2.autoscaling Local True 43d
Hallo.
Mein Fall-Namespace bleibt beim Beenden hÀngen, wenn https://github.com/rancher/rancher/issues/21546#issuecomment -553635629
Vielleicht hilft es.
https://medium.com/@newtondev/how -to-fix-kubernetes-namespace-deleting-stecken-im-terminierungsstatus-5ed75792647e
Das hat fĂŒr mich wie ein Champion funktioniert
Ich hatte auch das gleiche Problem, jetzt funktioniert es gut fĂŒr mich. Bitte beziehen Sie sich auf das folgende Dokument und lösen Sie Ihr Problem
@zerkms gut, manchmal ist es ein legitimer Rat, nicht
Beachten Sie, dass der Artikel nur anwendbar ist, wenn das Problem durch die auf der Seite "Bekannte Probleme", die oben im Artikel verlinkt ist, aufgefĂŒhrten Anwendungsschritte nicht behoben wurde. Dies ist im Grunde der Rat, den der von Ihnen verknĂŒpfte Kommentar wiederholt.
@zerkms gut, manchmal ist es ein legitimer Rat, nicht
Ich habe noch nie gesehen, dass dies fĂŒr einen spec.finalizer in einem Namespace zutrifft. Jede Instanz, die ich gesehen habe, war mit dem Namespace-Bereinigungscontroller verbunden und wurde entweder durch ein bestĂ€ndiges Objekt im Namespace verursacht (in dem dieser Hinweis enthalten wĂ€re) oder durch eine nicht reagierende aggregierte API (die das Entfernen des Namespace spec.finalizer ĂŒberspringen wĂŒrde warten, auch alle persistierten Ressourcen von dieser API stranden)
Der Artikel warnt nicht davor, dass das Umgehen der Namespace-Finalisierung dazu fĂŒhren kann, dass namespace-Ressourcen im Speicher verbleiben, und wird nicht empfohlen.
Ich habe noch nie gesehen, dass dies fĂŒr einen spec.finalizer in einem Namespace zutrifft
Ja, das ist richtig, da dieser Finalizer von den Kubernetes selbst implementiert wird, aber es könnte andere Finalizer fĂŒr Objekte in diesem Namespace geben, die von Objekten in diesem Namespace implementiert werden könnten. Ein Beispiel, auf das ich kĂŒrzlich gestoĂen bin, war https://appscode.com/products/stash/
.
Es setzt Finalisierer auf einige seiner CRDs, die von der Stash-Operator-Bereitstellung gewartet werden sollen. Da der Stash-Operator bereits gelöscht wurde, kann nichts die Finalizer-Markierung von diesen CRDs entfernen, und das Löschen des Namespace bleibt hÀngen. In diesem Fall ist es nur sinnvoll, diese Finalizer auszubessern (nicht im Namespace selbst, sondern in diesen Objekten).
Hoffe es macht Sinn.
In diesem Fall ist es nur sinnvoll, diese Finalizer auszubessern (nicht im Namespace selbst, sondern in diesen Objekten).
Richtig. Ich wĂŒrde dem in einem Bereinigungsszenario "Alle Ressourcen löschen" nicht widersprechen, aber das ist nicht das, was der verlinkte Artikel durchlĂ€uft ... es beschreibt, wie ein spec.finalizer aus dem Namespace entfernt wird.
Nehmen Sie zuerst einen kleinen Kaffee und entspannen Sie sich. Gehen Sie jetzt zu Ihren k8s-Masterknoten
kubectl cluster-info
Der Kubernetes-Master wird unter https: // localhost : 6443 ausgefĂŒhrt
KubeDNS wird unter https: // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns: dns / proxy ausgefĂŒhrt
Verwenden Sie 'kubectl cluster-info dump', um Clusterprobleme weiter zu debuggen und zu diagnostizieren.
FĂŒhren Sie nun den Kube-Proxy aus
kubectl Proxy &
Beginn des Dienstes am 127.0.0.1:8001
Speichern Sie die ID, um sie spÀter zu löschen :)
lege es in die Datei
Bearbeiten Sie die Datei und entfernen Sie die Finalizer
},
"spec": {
"Finalizer": [
"kubernetes"
]]
},
Nach der Bearbeitung sollte es so aussehen đ
},
"spec": {
"Finalizer": [
]]
},
wir fast da đ
curl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize
und es ist weg đ
Bitte entfernen Sie den Finalizer nicht, er ist aus einem bestimmten Grund vorhanden. Versuchen Sie stattdessen herauszufinden, welche Ressourcen im NS noch gelöscht werden mĂŒssen, indem:
- ĂberprĂŒfen, ob ein Apiservice nicht verfĂŒgbar ist und daher seine Ressourcen nicht bereitstellt:
kubectl get apiservice|grep False
- Finden aller Ressourcen, die noch vorhanden sind, ĂŒber
kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete
(ein groĂes Lob an Jordan fĂŒr diese)Die Lösung fĂŒr dieses Problem besteht nicht darin, den Bereinigungsmechanismus kurzzuschlieĂen, sondern herauszufinden, was den Erfolg der Bereinigung verhindert.
Hallo Leute! Ich folge den Tipps von @alvaroaleman und habe ein Skript erstellt, das das saubere Löschen ĂŒberprĂŒft und
Was macht das Skript https://github.com/thyarles/knsk :
Ich hoffe es hilft.
@ thyarles Vielen Dank. Ich habe Ihren Weg benutzt, um das Problem zu lösen.
$ kubectl veranlasst apiservices, zu ĂŒberprĂŒfen, welcher Dienst nicht verfĂŒgbar ist, die verfĂŒgbaren zu löschen, ist durch $ kubectl delete apiservice [Dienstname] falsch, und danach gibt es keine Probleme beim Löschen eines Namensraums.
FĂŒr unser Team gibt es 3 nicht verfĂŒgbare Apiservices: v1beta1.admission.certmanager.k8s.io, v1beta1.metrics.k8s.io und v1beta1.webhook.certmanager.k8s.io.
Beachten Sie, dass Ihr Cluster etwas kaputt ist, wenn der Metrik-Apiserver nicht ausgefĂŒhrt wird. Nur das Entfernen des APIService behebt die eigentliche Ursache nicht.
@lavalamp Die Metriken sind ein nicht verfĂŒgbarer Apiservice.
Ja, was bedeutet, dass der Metrik-Apiserver nicht ausgefĂŒhrt wird, was bedeutet, dass HPA in Ihrem Cluster nicht funktioniert, und wahrscheinlich auch in anderen Dingen.
Ja. HPA funktioniert jetzt nicht. Ich sollte keine Metriken löschen und einen Weg finden, dies zu beheben.
@ thyarles Vielen Dank. Ich habe Ihren Weg benutzt, um das Problem zu lösen.
$ kubectl veranlasst apiservices, zu ĂŒberprĂŒfen, welcher Dienst nicht verfĂŒgbar ist, die verfĂŒgbaren zu löschen, ist durch $ kubectl delete apiservice [Dienstname] falsch, und danach gibt es keine Probleme beim Löschen eines Namensraums.
FĂŒr unser Team gibt es 3 nicht verfĂŒgbare Apiservices: v1beta1.admission.certmanager.k8s.io, v1beta1.metrics.k8s.io und v1beta1.webhook.certmanager.k8s.io.
@ xzhang007 freut sich zu hören! Jetzt mĂŒssen Sie ĂŒberprĂŒfen, warum Ihre v1beta1.metrics.k8s.io defekt ist. ĂberprĂŒfen Sie, wie es möchte:
`` `
$ kubectl -n kube-system alles bekommen | grep Metriken
pod /metrics-server-64f74f8d47-r5vcq 2/2 Running 9 119d
Service / Metrics-Server ClusterIP xx.xx.xx.xx
Implementation.apps / Metrics-Server 1/1 1 1 201d
replicaset.apps /metrics-server-55c7f68d94 0 0 0 165d
replicaset.apps /metrics-server-5c696bb6d7 0 0 0 201d
replicaset.apps /metrics-server-5cdb8bb4fb 0 0 0 201d
replicaset.apps /metrics-server-64f74f8d47 1 1 1 119d
replicaset.apps /metrics-server-686789bb4b 0 0 0 145d```
$ kubectl -n kube-system alles bekommen | grep Metriken
pod /metrics-server-5dcfd4dd9f-m2v9k 1/1 LĂ€uft 0 2d20h
Service / Metrics-Server ClusterIP xx.xx.xx.xx
Implementation.apps / Metrics-Server 1/1 1 1 27d
replicaset.apps /metrics-server-5dcfd4dd9f 1 1 1 27d
replicaset.apps /metrics-server-7fcf9cc98b 0 0 0 27d
Ja. HPA funktioniert jetzt nicht. Ich sollte keine Metriken löschen und einen Weg finden, dies zu beheben.
@ xzhang007 in der Tat funktioniert es nicht, bevor Sie das Problem bemerkt haben ... Sie haben es gerade bemerkt, weil es Ihre gelöschten Namespaces in den stecken gebliebenen Modus versetzt hat. Verwenden Sie einfach einen Helmpaket-Manager, um Ihren Metrik-Server erneut bereitzustellen, oder rufen Sie einfach den folgenden Befehl auf, um das Problem zu beheben ( ĂŒberprĂŒfen Sie die Bereitstellungsdatei, bevor Sie sie anwenden ):
$ curl https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/metrics-server/metrics-server-deployment.yaml | kubectl apply -f -
@slassh Lösung funktionierte fĂŒr mich auf Kubernetes 1.15
Löschen Sie den APIService v1beta1.metrics.k8s.io
kubectl get ns ns-to-delete -o yaml
...
status:
conditions:
- lastTransitionTime: "2020-01-08T05:36:52Z"
message: 'Discovery failed for some groups, 1 failing: unable to retrieve the
complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently
unable to handle the request'
...
kubectl get APIService
...
v1beta1.metrics.k8s.io kube-system/metrics-server False (ServiceNotFound)
kubectl delete v1beta1.metrics.k8s.io APIService
Der Zertifikatsmanager war möglicherweise nicht verfĂŒgbar, da er falsch eingerichtet wurde. Verwenden Sie beispielsweise eine falsche Syntax im Ingress Controller. FĂŒr unser System war es das
"certmanager.k8s.io/cluster-issuer": "letsencrypt-prod"
und es wurde geÀndert zu
"cert-manager.io/cluster-issuer": "letsencrypt-prod"
zur VerfĂŒgung stellen.
Wie bereits in dieser Ausgabe erwĂ€hnt, gibt es eine andere Möglichkeit, einen Namespace mithilfe einer API zu beenden, die nicht von kubectl verfĂŒgbar gemacht wurde, indem eine moderne Version von kubectl verwendet wird, fĂŒr die kubectl replace --raw
verfĂŒgbar ist (nicht sicher, von welcher Version). Auf diese Weise mĂŒssen Sie keinen kubectl proxy
-Prozess erzeugen und eine AbhÀngigkeit von curl
vermeiden (die in einer Umgebung wie Busybox nicht verfĂŒgbar ist). In der Hoffnung, dass dies jemand anderem hilft, habe ich dies hier gelassen:
kubectl get namespace "stucked-namespace" -o json \
| tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
| kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
Wurde festgestellt, ob dies ein behebbares Problem ist? Scheint hier eine Menge hackiger Lösungen zu sein, aber nichts, was das zugrunde liegende Problem angeht, dass keiner von uns seine Namespaces löschen kann ...
Ich habe dies auf EKS v1.14 Cluster
Wurde festgestellt, ob dies ein behebbares Problem ist? Scheint hier eine Menge hackiger Lösungen zu sein, aber nichts, was das zugrunde liegende Problem angeht, dass keiner von uns seine Namespaces löschen kann
Das grundlegende Problem besteht darin, dass eine aggregierte API-Gruppe in Ihrem Cluster nicht verfĂŒgbar ist. Es ist beabsichtigt, dass der Namespace-Bereinigungscontroller blockiert, bis alle APIs verfĂŒgbar sind, damit ĂŒberprĂŒft werden kann, ob alle Ressourcen aller API-Gruppen fĂŒr diesen Namespace bereinigt wurden.
fĂŒr ppl, die versuchen, die API zu locken:
# Check all possible clusters, as your .KUBECONFIG may have multiple contexts:
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
# Select name of cluster you want to interact with from above output:
export CLUSTER_NAME="some_server_name"
# Point to the API server referring the cluster name
APISERVER=$(kubectl config view -o jsonpath="{.clusters[?(@.name==\"$CLUSTER_NAME\")].cluster.server}")
# Gets the token value
TOKEN=$(kubectl get secrets -o jsonpath="{.items[?(@.metadata.annotations['kubernetes\.io/service-account\.name']=='default')].data.token}"|base64 --decode)
# Explore the API with TOKEN
curl -X GET $APISERVER/api --header "Authorization: Bearer $TOKEN" --insecure
https://kubernetes.io/docs/tasks/administer-cluster/access-cluster-api/#without -kubectl-proxy
Hier ist ein Skript, um dies automatisch zu tun. Benötigt jq
:
#!/bin/bash
if [ -z "${1}" ] ; then
echo -e "\nUsage: ${0} <name_of_the_namespace_to_remove_the_finalizer_from>\n"
echo "Valid cluster names, based on your kube config:"
kubectl config view -o jsonpath='{"Cluster name\tServer\n"}{range .clusters[*]}{.name}{"\t"}{.cluster.server}{"\n"}{end}'
exit 1
fi
kubectl proxy --port=8901 &
PID=$!
sleep 1
echo -n 'Current context : '
kubectl config current-context
read -p "Are you sure you want to remove the finalizer from namespace ${1}? Press Ctrl+C to abort."
kubectl get namespace "${1}" -o json \
| jq '.spec.finalizers = [ ]' \
| curl -k \
-H "Content-Type: application/json" \
-X PUT --data-binary @- "http://localhost:8901/api/v1/namespaces/${1}/finalize"
kill -15 $PID
Jeder: Skripte zur Automatisierung der Entfernung des Finalizers schaden mehr als sie nĂŒtzen . Sie können Zeitbomben in den aggregierten Apiservern hinterlassen, die nicht verfĂŒgbar sind. Wenn jemand den Namespace neu erstellt, werden plötzlich wieder einige alte Objekte angezeigt.
Die wirkliche Lösung ist:
$ kubectl get api-services
# something in the list is unavailable. Figure out what it is and fix it.
# ... the namespace lifecycle controller will finish deleting the namespace.
Jeder: Skripte zur Automatisierung der Entfernung des Finalizers schaden mehr als sie nĂŒtzen . Sie können Zeitbomben in den aggregierten Apiservern hinterlassen, die nicht verfĂŒgbar sind. Wenn jemand den Namespace neu erstellt, werden plötzlich wieder einige alte Objekte angezeigt.
Die wirkliche Lösung ist:
$ kubectl get api-services # something in the list is unavailable. Figure out what it is and fix it. # ... the namespace lifecycle controller will finish deleting the namespace.
https://github.com/thyarles/knsk
Dieses Skript fĂŒhrt alle ĂberprĂŒfungen durch und versucht, eine saubere Löschung durchzufĂŒhren, einschlieĂlich der Suche nach verwaisten Ressourcen. Wenn der Benutzer ein Risiko eingehen möchte, bietet das Skript die Option --force, um eine nicht empfohlene Löschmethode auszufĂŒhren.
Tippfehler, sollte apiservices sein
Dieser Befehl zeigt nicht verfĂŒgbare APIs an:
kubectl get apiservices --template='{{range $api := .items}}{{range $api.status.conditions}}{{if eq .type "Available"}}{{$api.metadata.name}} {{.status}}{{"\n"}}{{end}}{{end}}{{end}}' | grep -i false
Dieser Artikel wird Ihnen sicherlich nĂŒtzlich sein:
https://access.redhat.com/solutions/5038511
TatsÀchlich besteht ein Konflikt in den Apiservices, sie könnten den Gesundheitszustand der Apis in OpenShift validieren:
oc get apiservices -o = custom-columns = " name: .metadata.name , status: .status.conditions [0] .status"
Die fehlgeschlagene API muss sie neu starten, den Pod oder die Bereitstellung, die zu dieser API gehört, neu starten und anschlieĂend versuchen, den Namespace zu löschen.
$ oc namspace löschen
und fertig, GeschÀft behoben !!
Ziemlich respektlos, wenn Sie Ihre eigene Sprache an einem Ort verwenden, an dem alle zustimmen, Englisch zu sprechen. đ
Wo sind sich alle einig, Englisch zu sprechen?
Am Do, 30. April 2020 um 17:58 schrieb theAkito [email protected] :
Ziemlich respektlos, deine eigene Sprache an einem Ort zu verwenden, an dem jeder ist
stimmt zu, Englisch zu sprechen. đ- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-622137770 ,
oder abbestellen
https://github.com/notifications/unsubscribe-auth/ALGMKB6K4OU4X3XOYMALOBLRPHYCDANCNFSM4ETUOEPA
.>
Chris, Leitender Architekt @ brace.ai
- -
Vertraulichkeitshinweis: Diese E-Mail ist ausschlieĂlich zur Verwendung durch die E-Mail bestimmt
beabsichtigte EmpfĂ€nger und können vertrauliche, geschĂŒtzte oder
privilegierte Informationen. Wenn Sie nicht der beabsichtigte EmpfÀnger sind, sind Sie es
darĂŒber informiert, dass jede Verwendung, ĂberprĂŒfung, Verbreitung, VervielfĂ€ltigung oder ergriffene MaĂnahme auf der Grundlage dieser MaĂnahmen erfolgt
auf dieser Nachricht oder ihren AnhÀngen, falls vorhanden, ist verboten. Wenn Sie nicht sind
Den beabsichtigten EmpfÀnger kontaktieren Sie bitte den Absender per Antwort-E-Mail und
Zerstören oder löschen Sie alle Kopien der Originalnachricht und aller AnhÀnge.
bereit, entschuldigen Sie, es war fĂŒr meine Geschwindigkeit, es wurde behoben
Wir haben eine mehrsprachige Benutzerbasis, es ist schon schlimm genug, dass keines unserer Tools internationalisiert ist. Wir können hier auf Github zumindest nett sein, bitte.
@teoincontatto
Wie bereits in dieser Ausgabe erwĂ€hnt, gibt es eine andere Möglichkeit, einen Namespace mithilfe einer API zu beenden, die nicht von kubectl verfĂŒgbar gemacht wurde, indem eine moderne Version von kubectl verwendet wird, fĂŒr die
kubectl replace --raw
verfĂŒgbar ist (nicht sicher, von welcher Version). Auf diese Weise mĂŒssen Sie keinenkubectl proxy
-Prozess erzeugen und eine AbhÀngigkeit voncurl
vermeiden (die in einer Umgebung wie Busybox nicht verfĂŒgbar ist). In der Hoffnung, dass dies jemand anderem hilft, habe ich dies hier gelassen:kubectl get namespace "stucked-namespace" -o json \ | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \ | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
Das hat perfekt funktioniert!
Wir haben eine mehrsprachige Benutzerbasis, es ist schon schlimm genug, dass keines unserer Tools internationalisiert ist. Wir können hier auf Github zumindest nett sein, bitte.
Wir haben eine mehrsprachige Benutzerbasis, es ist schon schlimm genug, dass keines unserer Tools internationalisiert ist. Wir können hier auf Github zumindest nett sein, bitte.
Ich versuche immer noch zu verstehen. Vergib mir. Möglicherweise habe ich versehentlich die Daumen nach unten geklickt.
Ja, Werkzeuge wurden nicht perfekt ausgefĂŒhrt.
Diejenigen, die ohne ErklĂ€rung einen Daumen nach unten drĂŒcken, ergeben keinen Sinn.
Fast die ganze Zeit, in der ich dieses Problem erlebe, liegt es an den CRDs. Löschen Sie CRDs, wenn sie nur in diesem Namespace verwendet werden. AnschlieĂend können Sie Finalizer und Namespace löschen.
Wie bereits in dieser Ausgabe erwĂ€hnt, gibt es eine andere Möglichkeit, einen Namespace mithilfe einer API zu beenden, die nicht von kubectl verfĂŒgbar gemacht wurde, indem eine moderne Version von kubectl verwendet wird, fĂŒr die
kubectl replace --raw
verfĂŒgbar ist (nicht sicher, von welcher Version). Auf diese Weise mĂŒssen Sie keinenkubectl proxy
-Prozess erzeugen und eine AbhÀngigkeit voncurl
vermeiden (die in einer Umgebung wie Busybox nicht verfĂŒgbar ist). In der Hoffnung, dass dies jemand anderem hilft, habe ich dies hier gelassen:kubectl get namespace "stucked-namespace" -o json \ | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \ | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -
@teoincontatto Danke! Das hat endlich geklappt!
Manchmal funktioniert es nicht sehr gut, nur das Ressourcenmanifest online zu bearbeiten (ich meine, entfernen Sie das eingereichte finalizers
und speichern Sie es).
Also habe ich einen neuen Weg von anderen bekommen.
kubectl get namespace linkerd -o json > linkerd.json
# Where:/api/v1/namespaces/<your_namespace_here>/finalize
kubectl replace --raw "/api/v1/namespaces/linkerd/finalize" -f ./linkerd.json
Nachdem Sie diesen Befehl ausgefĂŒhrt haben, sollte der Namespace jetzt nicht mehr in Ihrer Namespace-Liste enthalten sein. Und das funktioniert bei mir.
Nicht nur namespace
sondern auch die anderen Ressourcen.
Ich habe das Problem behoben, indem ich die Finalizer-Zeilen mit: kubectl edit annoying-ns
Hmm ... ich habe dieses Problem gerade :)
Heute habe ich ein Update meines eks-Clusters von 1.15 auf 1.16 durchgefĂŒhrt.
Bisher sieht alles gut aus.
Aber meine Entwicklung ns "configcluster" war eine Art "beschÀdigt".
Also entscheide ich mich, es aufzurÀumen.
k lösche ns configcluster
....
jetzt hÀngt dies (3h +): /
$ kubectl get namespace configcluster -o yaml
apiVersion: v1
kind: Namespace
metadata:
annotations:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion":"v1","kind":"Namespace","metadata":{"annotations":{},"name":"configcluster"}}
creationTimestamp: "2020-06-19T06:40:15Z"
deletionTimestamp: "2020-06-19T09:19:16Z"
name: configcluster
resourceVersion: "22598109"
selfLink: /api/v1/namespaces/configcluster
uid: e50f0b53-b21e-4e6e-8946-c0a0803f031b
spec:
finalizers:
- kubernetes
status:
conditions:
- lastTransitionTime: "2020-06-19T09:19:21Z"
message: 'Discovery failed for some groups, 1 failing: unable to retrieve the
complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently
unable to handle the request'
reason: DiscoveryFailed
status: "True"
type: NamespaceDeletionDiscoveryFailure
- lastTransitionTime: "2020-06-19T09:19:22Z"
message: All legacy kube types successfully parsed
reason: ParsedGroupVersions
status: "False"
type: NamespaceDeletionGroupVersionParsingFailure
- lastTransitionTime: "2020-06-19T09:19:22Z"
message: All content successfully deleted
reason: ContentDeleted
status: "False"
type: NamespaceDeletionContentFailure
phase: Terminating
Wie können wir diesem Dorn im Auge mehr ausgesetzt sein?
Am Fr, 19. Juni 2020 um 04:46 Uhr Andreas Höhmann [email protected]
schrieb:
Hmm ... ich habe dieses Problem gerade :)
Heute habe ich ein Update meines eks-Clusters von 1.15 auf 1.16 durchgefĂŒhrt.
Bisher sieht alles gut aus.
Aber meine Entwicklung ns "configcluster" war eine Art "beschÀdigt".
Also entscheide ich mich, es aufzurÀumen.k lösche ns configcluster
....
jetzt hÀngt dies (3h +): /$ kubectl get Namespace configcluster -o yaml
apiVersion: v1
Art: Namespace
Metadaten:
Anmerkungen:
kubectl.kubernetes.io/last-applied-configuration: |
{"apiVersion": "v1", "kind": "Namespace", "metadata": {"annotations": {}, "name": "configcluster"}}
CreationTimestamp: "2020-06-19T06: 40: 15Z"
deletionTimestamp: "2020-06-19T09: 19: 16Z"
Name: Konfigurationscluster
resourceVersion: "22598109"
selfLink: / api / v1 / namespaces / configcluster
UID: e50f0b53-b21e-4e6e-8946-c0a0803f031b
spec:
Finalisierer:
- kubernetes
Status:
Bedingungen:- lastTransitionTime: "2020-06-19T09: 19: 21Z"
Meldung: 'Ermittlung fĂŒr einige Gruppen fehlgeschlagen, 1 fehlgeschlagen: Die kann nicht abgerufen werden
VollstÀndige Liste der Server-APIs :metrics.k8s.io/v1beta1: Der Server befindet sich derzeit
kann die Anfrage nicht bearbeiten '
Grund: DiscoveryFailed
Status: "True"
Typ: NamespaceDeletionDiscoveryFailure- lastTransitionTime: "2020-06-19T09: 19: 22Z"
Nachricht: Alle Àlteren Kube-Typen wurden erfolgreich analysiert
Grund: ParsedGroupVersions
Status: "Falsch"
Typ: NamespaceDeletionGroupVersionParsingFailure- lastTransitionTime: "2020-06-19T09: 19: 22Z"
Nachricht: Alle Inhalte erfolgreich gelöscht
Grund: ContentDeleted
Status: "Falsch"
Typ: NamespaceDeletionContentFailure
Phase: Beenden- -
Sie erhalten dies, weil Sie kommentiert haben.
Antworte direkt auf diese E-Mail und sieh sie dir auf GitHub an
https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-646543073 ,
oder abbestellen
https://github.com/notifications/unsubscribe-auth/AFLKRCLHIZ77X2Z3F5GAOCTRXMXVTANCNFSM4ETUOEPA
.
@bobhenkel Nun, dieses Problem ist geschlossen. Dies bedeutet also effektiv, dass es kein Problem gibt (was umsetzbare Elemente betrifft). Wenn Sie praktische Hilfe bei der BewÀltigung einer Àhnlichen Situation benötigen, lesen Sie bitte den obigen Thread. Dort gibt es einige gute (und auch einige schlechte) RatschlÀge.
In meinem Fall musste ich meinen Ingress Load Balancer manuell von der GCP Network Service-Konsole löschen. Ich hatte das Load Balancer-Frontend manuell direkt in der Konsole erstellt. Nachdem ich den Load Balancer gelöscht hatte, wurde der Namespace automatisch gelöscht.
Ich vermute, dass Kubernetes nicht löschen wollte, da sich der Status des Load Balancers vom Status im Manifest unterschied.
Ich werde versuchen, die Erstellung des Ingress-Frontends mithilfe von Anmerkungen zu automatisieren, um festzustellen, ob ich dieses Problem beheben kann.
Manchmal funktioniert es nicht sehr gut, nur das Ressourcenmanifest online zu bearbeiten (ich meine, entfernen Sie das eingereichte
finalizers
und speichern Sie es).
Also habe ich einen neuen Weg von anderen bekommen.kubectl get namespace linkerd -o json > linkerd.json # Where:/api/v1/namespaces/<your_namespace_here>/finalize kubectl replace --raw "/api/v1/namespaces/linkerd/finalize" -f ./linkerd.json
Nachdem Sie diesen Befehl ausgefĂŒhrt haben, sollte der Namespace jetzt nicht mehr in Ihrer Namespace-Liste enthalten sein. Und das funktioniert bei mir.
Nicht nur
namespace
sondern auch die anderen Ressourcen.
Du bist ein Star, es hat funktioniert
Manchmal funktioniert es nicht sehr gut, nur das Ressourcenmanifest online zu bearbeiten (ich meine, entfernen Sie das eingereichte
finalizers
und speichern Sie es).
Also habe ich einen neuen Weg von anderen bekommen.kubectl get namespace linkerd -o json > linkerd.json # Where:/api/v1/namespaces/<your_namespace_here>/finalize kubectl replace --raw "/api/v1/namespaces/linkerd/finalize" -f ./linkerd.json
Nachdem Sie diesen Befehl ausgefĂŒhrt haben, sollte der Namespace jetzt nicht mehr in Ihrer Namespace-Liste enthalten sein. Und das funktioniert bei mir.
Nicht nur
namespace
sondern auch die anderen Ressourcen.
Ich habe viele Lösungen ausprobiert, aber dies ist die, die fĂŒr mich funktioniert hat. Vielen Dank!
curl -k -H "Inhaltstyp: application / json" -X PUT --data-binary @ tmp.json https: // kubernetes-cluster-ip / api / v1 / namespaces / nerviger-namespace zum löschen / finalisieren
Dies sollte wirklich die "akzeptierte" Antwort sein - es hat die Wurzel dieses Problems vollstÀndig gelöst!
Nehmen Sie aus dem obigen Link:
Dies ist insbesondere in einer Produktionsumgebung nicht der richtige Weg.
Heute bin ich auf das gleiche Problem gekommen. Wenn Sie den Finalizer entfernen, erhalten Sie Reste in verschiedenen ZustÀnden. Sie sollten tatsÀchlich herausfinden, was den Löschvorgang verhindert.
Siehe https://github.com/kubernetes/kubernetes/issues/60807#issuecomment -524772920
(AuĂerdem meldet 'kubetctl get all' leider nicht alle Dinge. Sie mĂŒssen Ă€hnliche Befehle wie im Link verwenden.)
Mein Fall - Löschen des Namespace 'cert-manager'. In der Ausgabe von 'kubectl get apiservice -o yaml' habe ich APIService 'v1beta1.admission.certmanager.k8s.io' mit status = False gefunden. Dieser Apiservice war Teil des Cert-Managers, den ich gerade gelöscht habe. In 10 Sekunden, nachdem ich 'kisectl apiservice v1beta1.admission.certmanager.k8s.io' gelöscht habe, verschwand der Namespace.
Hoffentlich hilft das.
Nachdem dies gesagt wurde, habe ich einen kleinen Microservice geschrieben, der jede Stunde als CronJob ausgefĂŒhrt wird und automatisch terminierende Namespaces löscht.
Sie finden es hier: https://github.com/oze4/service.remove-terminating-namespaces
Ich habe einen kleinen Microservice geschrieben, der jede Stunde als CronJob ausgefĂŒhrt wird und automatisch terminierende Namespaces löscht.
Sie finden es hier: https://github.com/oze4/service.remove-terminating-namespaces
Noch ein Oneliner:
for ns in $(kubectl get ns --field-selector status.phase=Terminating -o jsonpath='{.items[*].metadata.name}'); do kubectl get ns $ns -ojson | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f -; done
Das Löschen festsitzender Namespaces ist jedoch keine gute Lösung. Der richtige Weg ist herauszufinden, warum es feststeckt. Ein sehr hĂ€ufiger Grund ist, dass es nicht verfĂŒgbare API-Dienste gibt, die verhindern, dass Cluster Namespaces finalisieren.
Zum Beispiel habe ich Knative hier nicht richtig gelöscht:
$ kubectl get apiservice|grep False
NAME SERVICE AVAILABLE AGE
v1beta1.custom.metrics.k8s.io knative-serving/autoscaler False (ServiceNotFound) 278d
Das Löschen löste das Problem
k delete apiservice v1beta1.custom.metrics.k8s.io
apiservice.apiregistration.k8s.io "v1beta1.custom.metrics.k8s.io" deleted
$ k create ns test2
namespace/test2 created
$ k delete ns test2
namespace "test2" deleted
$ kgns test2
Error from server (NotFound): namespaces "test2" not found
Ich habe einen kleinen Microservice geschrieben, der jede Stunde als CronJob ausgefĂŒhrt wird und automatisch terminierende Namespaces löscht.
Sie finden es hier: https://github.com/oze4/service.remove-terminating-namespaces
Gut gemacht.
Ich hatte ein Ă€hnliches Problem mit 1.18 in einem Labor-K8s-Cluster und fĂŒgte eine Notiz hinzu, um vielleicht anderen zu helfen. Ich habe mit der Metrik-API und insbesondere mit benutzerdefinierten Metriken gearbeitet. Nachdem diese k8s-Objekte gelöscht wurden, um sie neu zu erstellen, kam es beim Löschen des Namespace zu dem Fehler, dass der Metrik-API-Endpunkt nicht gefunden wurde. Wenn Sie das wieder in einen anderen Namespace einfĂŒgen, wird alles sofort geklĂ€rt.
Dies war im Namespace unter status.conditions.message:
Discovery failed for some groups, 4 failing: unable to retrieve the
complete list of server APIs: custom.metrics.k8s.io/v1beta1: the server is currently
unable to handle the request, custom.metrics.k8s.io/v1beta2: the server is currently
unable to handle the request, external.metrics.k8s.io/v1beta1: the server is
currently unable to handle the request, metrics.k8s.io/v1beta1: the server is
Noch ein Oneliner:
for ns in $(kubectl get ns --field-selector status.phase=Terminating -o jsonpath='{.items[*].metadata.name}'); do kubectl get ns $ns -ojson | jq '.spec.finalizers = []' | kubectl replace --raw "/api/v1/namespaces/$ns/finalize" -f -; done
Das Löschen festsitzender Namespaces ist jedoch keine gute Lösung. Der richtige Weg ist herauszufinden, warum es feststeckt. Ein sehr hĂ€ufiger Grund ist, dass es nicht verfĂŒgbare API-Dienste gibt, die verhindern, dass Cluster Namespaces finalisieren.
Zum Beispiel habe ich Knative hier nicht richtig gelöscht:$ kubectl get apiservice|grep False NAME SERVICE AVAILABLE AGE v1beta1.custom.metrics.k8s.io knative-serving/autoscaler False (ServiceNotFound) 278d
Das Löschen löste das Problem
k delete apiservice v1beta1.custom.metrics.k8s.io apiservice.apiregistration.k8s.io "v1beta1.custom.metrics.k8s.io" deleted
$ k create ns test2 namespace/test2 created $ k delete ns test2 namespace "test2" deleted $ kgns test2 Error from server (NotFound): namespaces "test2" not found
Auf jeden Fall der sauberste Liner! Es ist wichtig zu beachten, dass keine dieser "Lösungen" das Grundproblem tatsÀchlich löst.
Das ist die Botschaft, die sich verbreiten sollte: LĂ€cheln: nicht "noch ein Einzeiler".
Endlich der sauberste Liner! Es ist wichtig zu beachten, dass keine dieser "Lösungen" das Grundproblem tatsÀchlich löst.
Diese Lösung löst eine der allen Möglichkeiten. Um nach allen möglichen Ursachen zu suchen und diese zu beheben, verwende ich dieses Skript: https://github.com/thyarles/knsk
@ Thyarles sehr schön!
Bitte verwenden Sie nicht modify finalize
, um den Namespace zu löschen. Das wird einen Fehler verursachen
Bitte finden Sie die Ursache fĂŒr die Beendigung des Namespace heraus. Derzeit bekannte Anweisungen zur Fehlerbehebung
Ich stoĂe auf das gleiche Problem:
# sudo kubectl get ns
NAME STATUS AGE
cattle-global-data Terminating 8d
cattle-global-nt Terminating 8d
cattle-system Terminating 8d
cert-manager Active 8d
default Active 10d
ingress-nginx Terminating 9d
kube-node-lease Active 10d
kube-public Active 10d
kube-system Active 10d
kubernetes-dashboard Terminating 4d6h
local Active 8d
p-2sfgk Active 8d
p-5kdx9 Active 8d
# sudo kubectl get all -n kubernetes-dashboard
No resources found in kubernetes-dashboard namespace.
# sudo kubectl get namespace kubernetes-dashboard -o json
{
"apiVersion": "v1",
"kind": "Namespace",
"metadata": {
"annotations": {
"cattle.io/status": "{\"Conditions\":[{\"Type\":\"ResourceQuotaInit\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2020-09-29T01:15:46Z\"},{\"Type\":\"InitialRolesPopulated\",\"Status\":\"True\",\"Message\":\"\",\"LastUpdateTime\":\"2020-09-29T01:15:46Z\"}]}",
"kubectl.kubernetes.io/last-applied-configuration": "{\"apiVersion\":\"v1\",\"kind\":\"Namespace\",\"metadata\":{\"annotations\":{},\"name\":\"kubernetes-dashboard\"}}\n",
"lifecycle.cattle.io/create.namespace-auth": "true"
},
"creationTimestamp": "2020-09-29T01:15:45Z",
"deletionGracePeriodSeconds": 0,
"deletionTimestamp": "2020-10-02T07:59:52Z",
"finalizers": [
"controller.cattle.io/namespace-auth"
],
"managedFields": [
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:annotations": {
"f:cattle.io/status": {},
"f:lifecycle.cattle.io/create.namespace-auth": {}
},
"f:finalizers": {
".": {},
"v:\"controller.cattle.io/namespace-auth\"": {}
}
}
},
"manager": "Go-http-client",
"operation": "Update",
"time": "2020-09-29T01:15:45Z"
},
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:metadata": {
"f:annotations": {
".": {},
"f:kubectl.kubernetes.io/last-applied-configuration": {}
}
}
},
"manager": "kubectl-client-side-apply",
"operation": "Update",
"time": "2020-09-29T01:15:45Z"
},
{
"apiVersion": "v1",
"fieldsType": "FieldsV1",
"fieldsV1": {
"f:status": {
"f:phase": {}
}
},
"manager": "kube-controller-manager",
"operation": "Update",
"time": "2020-10-02T08:13:49Z"
}
],
"name": "kubernetes-dashboard",
"resourceVersion": "3662184",
"selfLink": "/api/v1/namespaces/kubernetes-dashboard",
"uid": "f1944b81-038b-48c2-869d-5cae30864eaa"
},
"spec": {},
"status": {
"conditions": [
{
"lastTransitionTime": "2020-10-02T08:13:49Z",
"message": "All resources successfully discovered",
"reason": "ResourcesDiscovered",
"status": "False",
"type": "NamespaceDeletionDiscoveryFailure"
},
{
"lastTransitionTime": "2020-10-02T08:11:49Z",
"message": "All legacy kube types successfully parsed",
"reason": "ParsedGroupVersions",
"status": "False",
"type": "NamespaceDeletionGroupVersionParsingFailure"
},
{
"lastTransitionTime": "2020-10-02T08:11:49Z",
"message": "All content successfully deleted, may be waiting on finalization",
"reason": "ContentDeleted",
"status": "False",
"type": "NamespaceDeletionContentFailure"
},
{
"lastTransitionTime": "2020-10-02T08:11:49Z",
"message": "All content successfully removed",
"reason": "ContentRemoved",
"status": "False",
"type": "NamespaceContentRemaining"
},
{
"lastTransitionTime": "2020-10-02T08:11:49Z",
"message": "All content-preserving finalizers finished",
"reason": "ContentHasNoFinalizers",
"status": "False",
"type": "NamespaceFinalizersRemaining"
}
],
"phase": "Terminating"
}
# sudo kubectl version
Client Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T13:41:02Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Server Version: version.Info{Major:"1", Minor:"19", GitVersion:"v1.19.2", GitCommit:"f5743093fd1c663cb0cbc89748f730662345d44d", GitTreeState:"clean", BuildDate:"2020-09-16T13:32:58Z", GoVersion:"go1.15", Compiler:"gc", Platform:"linux/amd64"}
Sie können etcdctl
, um nicht gelöschte Ressourcen zu finden
ETCDCTL_API=3 etcdctl --cacert=/etc/kubernetes/pki/etcd/ca.crt \
--cert=/etc/kubernetes/pki/etcd/peer.crt \
--key=/etc/kubernetes/pki/etcd/peer.key \
get /registry --prefix | grep <namespace>
Kopieren Sie es einfach und fĂŒgen Sie es in Ihr Terminal ein
for NS in $(kubectl get ns 2>/dev/null | grep Terminating | cut -f1 -d ' '); do
kubectl get ns $NS -o json > /tmp/$NS.json
sed -i '' "s/\"kubernetes\"//g" /tmp/$NS.json
kubectl replace --raw "/api/v1/namespaces/$NS/finalize" -f /tmp/$NS.json
done
/tmp/$NS.json
Dies funktionierte fĂŒr mich und ich lief, nachdem ich ĂŒberprĂŒft hatte, dass keine k8s-Objekte in der ns baumelten. Vielen Dank!
Ich habe dies verwendet, um einen Namespace zu entfernen, der bei Terminated hÀngen bleibt
Beispiel:
kubectl get namespace openebs -o json | jq -j '.spec.finalizers=null' > tmp.json
kubectl replace --raw "/api/v1/namespaces/openebs/finalize" -f ./tmp.json
FĂŒr alle Googler, die bei Terminating on Rancher auf festsitzende Namespaces gestoĂen sind (z. B. Viehsystem), hat der folgende modifizierte Befehl (Grebois 'Original) fĂŒr mich funktioniert:
for NS in $(kubectl get ns 2>/dev/null | grep Terminating | cut -f1 -d ' '); do
kubectl get ns $NS -o json > /tmp/$NS.json
sed -i "s/\"controller.cattle.io\/namespace-auth\"//g" /tmp/$NS.json
kubectl replace --raw "/api/v1/namespaces/$NS/finalize" -f /tmp/$NS.json
done
Leute, nur zu Ihrer Information , wenn das Video fĂŒr diesen
Ich habe eine 10-minĂŒtige ErklĂ€rung aufgenommen und sie bei dieser SIG Deep Dive-Sitzung vorgestellt .
Hier ist ein korrekter Kommentar mit 65 positiven Stimmen
Dieser mehrfach erwĂ€hnte Beitrag ist ein Beispiel dafĂŒr, wie man Dinge richtig macht. Finden und beheben Sie den defekten API-Service.
Alle Einzeiler, die nur die Finalizer im Namespace entfernen, beheben die Grundursache und lassen Ihren Cluster auf subtile Weise kaputt, was Sie spĂ€ter beiĂen wird. Also mach das bitte nicht. Die Behebung der Grundursache ist normalerweise sowieso einfacher. Es scheint, dass die Leute gerne Variationen zu diesem Thema posten, obwohl es bereits zahlreiche richtige Antworten im Thread gibt. Deshalb werde ich das Problem jetzt sperren, um sicherzustellen, dass dieser Kommentar ganz unten bleibt.
Hilfreichster Kommentar
@ManifoldFR , ich hatte das gleiche Problem wie Sie und es gelang mir, es durch einen API-Aufruf mit der JSON-Datei zum
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
Bearbeiten Sie dann tmp.json und entfernen Sie
"kubernetes"
curl -k -H "Content-Type: application/json" -X PUT --data-binary @tmp.json https://kubernetes-cluster-ip/api/v1/namespaces/annoying-namespace-to-delete/finalize
und es sollte Ihren Namespace löschen,