web-dev-qa-db-ja.com

名前空間が終了として「スタック」しました。削除するにはどうすればよいですか?

この永遠の「終了」ステータスを示す「スタック」ネームスペースを削除しました。

10
ximbal

次のようなリソースをすでに強制削除しようとしていると仮定します: ポッドは終了ステータスでスタックしました 、そしてあなたの気の向くままで名前空間を回復しようとしています...

名前空間を強制的に削除することができます(おそらく、宙ぶらりんのリソースを残します)。

(
NAMESPACE=your-rogue-namespace
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
)
  • これは、コメント here に基づく回答 here の改良版です。

  • jqユーティリティを使用して、ファイナライザーセクションの要素をプログラムで削除します。代わりに手動で行うことができます。

  • kubectl proxyは、デフォルトで127.0.0.1:8001にリスナーを作成します。クラスタマスターのホスト名/ IPがわかっている場合は、代わりにそれを使用できる場合があります。

  • おもしろいことに、このアプローチはkubectl editを使用しても同じように機能し、同じ変更を加えても効果がないようです。

13
nobar

私たちにとっては、metrics-serverクラッシュでした。

したがって、これがあなたのケースに関連するかどうかを確認するには、次の実行を行います:kubectl api-resources

あなたが取得する場合

error: unable to retrieve the complete list of server APIs: metrics.k8s.io/v1beta1: the server is currently unable to handle the request

その後、おそらく同じ問題

クレジットは@javierprovechoに送られます here

これは、ネームスペースコントローラーが削除できないネームスペースにまだ存在するリソースが原因です。

このコマンド(kubectl 1.11+を使用)は、名前空間に残っているリソースを表示します。

kubectl api-resources --verbs=list --namespaced -o name \
  | xargs -n 1 kubectl get --show-kind --ignore-not-found -n <namespace>

それらを見つけて解決して削除すると、名前空間がクリーンアップされます

8
Jordan Liggitt

nobar で既に素晴らしい答えを完成させます。 Rancherを使用してクラスタをデプロイした場合、警告があります。

Rancherのデプロイは、すべてのAPIコールを変更し、/k8s/clusters/c-XXXXX/をURLの先頭に追加します。

ランチャー上のクラスターのID(c-XXXXX)は、URLにあるため、Rancher UIから簡単に取得できます。

Get cluster id

したがって、そのクラスターID c-xxxxを取得したら、nobarが言うように、そのランチャービットを含むapi呼び出しを変更するだけです。

(
NAMESPACE=your-rogue-namespace
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/k8s/clusters/c-XXXXX/api/v1/namespaces/$NAMESPACE/finalize
)
2
saulR

terminating」名前空間を削除する唯一の方法は、「finalizers」セクション内のエントリを削除することです。 --forceを削除して--grace-period=0にしようとしましたが、どれも機能しませんでしたが、この方法は機能しました:

コマンドラインでネームスペースからの情報を表示します:

$ kubectl get namespace your-rogue-namespace -o yaml

これにより、yaml出力が得られます。次のような行を探してください。

deletionTimestamp: 2018-09-17T13:00:10Z
  finalizers:
  - Whatever content it might be here...
  labels:

次に、名前空間の構成を編集し、そのファイナライザーコンテナー内のアイテムを削除します。

$ kubectl edit namespace your-rogue-namespace

これによりエディターが開き(私の場合はVI)、削除したい行に移動して削除し、Dキーを2回押して行全体を削除しました。

保存して、エディタを終了し、魔法のように。不正な名前空間はなくなるはずです。

そしてそれを確認するには:

$ kubectl get namespace your-rogue-namespace -o yaml

その後に孤立したリソースが残る可能性があることに注意してください。

1
ximbal