Kubernetes: "์ข…๋ฃŒ ์ค‘"์ƒํƒœ์—์„œ ๋ฉˆ์ถ˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ

์— ๋งŒ๋“  2018๋…„ 03์›” 05์ผ  ยท  180์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: kubernetes/kubernetes

v1.8.4๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์‚ญ์ œ ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ "์ข…๋ฃŒ ์ค‘"์ƒํƒœ๋กœ ์˜์›ํžˆ ์œ ์ง€๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ "kubectl delete namespace XXXX"๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

kinbug prioritimportant-soon siapi-machinery

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@ManifoldFR , ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  json ํŒŒ์ผ๋กœ API ํ˜ธ์ถœ์„ ๋งŒ๋“ค์–ด ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
๊ทธ๋Ÿฐ ๋‹ค์Œ tmp.json์„ ํŽธ์ง‘ํ•˜๊ณ  "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

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  180 ๋Œ“๊ธ€

/ sig api-machinery

@ shean-guangchang ์ด๊ฒƒ์„ ์žฌํ˜„ ํ•  ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๊ถ๊ธˆํ•ด์„œ CRD๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด์ „์— TPR์—์„œ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค.

/ ์ข…๋ฅ˜์˜ ๋ฒ„๊ทธ

๋ฃจํฌ ๋ฐฐํฌ์—์„œ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โžœ  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) โœ— 

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋“ค์˜ CRD์™€ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. API ์„œ๋ฒ„ ๋กœ๊ทธ์—์„œ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ง€๊ธˆ ๋‹ค๋ฅธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ฃจํฌ๋ฅผ ๋ฐฐํฌํ–ˆ์ง€๋งŒ ํด๋Ÿฌ์Šคํ„ฐ CRD๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

โžœ  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)

CRD๊ฐ€ ์ •๋ฆฌ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

โžœ  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) โœ— 

๋น„์Šทํ•œ ์ƒํƒœ์˜ ํ•ต๋ถ„์—ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

โžœ  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) โœ— 

ํ•ต๋ถ„์—ด์€ ๋˜ํ•œ CRD๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ์ •ํ™” ๋œ ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค.

@ shean-guangchang-์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์•„๋ž˜์˜ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•˜๊ณ  "helm"์—์„œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์‚ญ์ œ ๋ฐ ์ œ๊ฑฐํ•˜๊ณ  ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งŒ๋‚œ ๊ฒƒ์€ "๋ฐฉ์ฃผ", "๊ฒฝ์šด๊ธฐ"๋ฐ Kuberenets๊ฐ€ ๋ชจ๋‘ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค (๋‚˜๋Š” ํˆฌ๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ€ํŠธ ์ŠคํŠธ๋žฉํ•˜๊ณ  ๋ฐฉ์ฃผ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—…). ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์ชฝ์—์„œ๋Š” Kuberenets ๋ฌธ์ œ๊ฐ€ ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์†, ๊ด€๋ จ ๋กœ๊ทธ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ ํ•ด๊ฒฐ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฃจํฌ ์ธ ๊ฒฝ์šฐ https://github.com/rook/rook/issues/1488#issuecomment -365058080์„ ์‚ดํŽด๋ณด์„ธ์š”.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํƒœ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๋Š” ๊ฒƒ์€ ๋ฒ„๊ทธ๊ฐ€์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

@barakAtSoluto ์™€ ๋น„์Šทํ•œ ํ™˜๊ฒฝ (Ark & Helm)์ด ์žˆ์œผ๋ฉฐ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์Šคํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ๋‹ค์‹œ ์‹œ์ž‘ํ•ด๋„ ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ์ข…๋ฃŒ ์ค‘์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์˜€์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ์ƒˆ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋งŒ๋“ค์–ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค ....
์ œ์™ธ-๊ธฐ๋ณธ, kube-system / public ๋ฐ ๋ชจ๋“  ark ๊ด€๋ จ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ฐฑ์—… ๋ฐ ๋ณต์›์—์„œ ๋ฐœ์ƒํ•˜์ง€ ์•Š๋„๋ก ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.

1.8.4์—์„œ 1.9.6์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ ๋œ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋„์ด ๋ฌธ์ œ๋ฅผ๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ๋กœ๊ทธ๋ฅผ๋ณด์•„์•ผํ• ์ง€์กฐ์ฐจ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

1.10.1์— ๋Œ€ํ•œ ๋™์ผํ•œ ๋ฌธ์ œ :(

1.9.6์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ

ํŽธ์ง‘ : ์ผ๋ถ€ ํฌ๋“œ๊ฐ€ ์ค‘๋‹จ๋˜์–ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. --grace-period = 0 --force๋กœ ๋ชจ๋‘ ์‚ญ์ œํ–ˆ๊ณ  ๋ช‡ ๋ถ„ ํ›„์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋„ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์•ผ,

๋‚˜๋Š” ์ด๊ฒƒ์„ ๋ฐ˜๋ณตํ•ด์„œ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ข…๋ฃŒ ์ž์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ kubectl get namespace XXX -o yaml ์‹œ๋„ํ•˜๊ณ  ์ข…๋ฃŒ์ž๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๊ทธ๋ ‡๋‹ค๋ฉด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐ (๋นˆ ๋ฐฐ์—ด ์ „๋‹ฌ)ํ•˜๋ฉด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ญ์ œ๋ฉ๋‹ˆ๋‹ค.

@xetys ๋Š” ์•ˆ์ „ํ•ฉ๋‹ˆ๊นŒ? ์ œ ๊ฒฝ์šฐ์—๋Š” "kubernetes"๋ผ๋Š” ์ด๋ฆ„์˜ ์ข…๋ฃŒ์ž๊ฐ€ ํ•˜๋‚˜๋ฟ์ž…๋‹ˆ๋‹ค.

์ด์ƒํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์ข…๋ฃŒ์ž๋ฅผ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‚ด ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์‚ด์•„ ์žˆ์Šต๋‹ˆ๋‹ค.

1.10.5์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋ชจ๋“  ์กฐ์–ธ์„ ๊ฒฐ๊ณผ์—†์ด ์‹œ๋„ํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋“œ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ์—ˆ์ง€๋งŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” ์—ฌ์ „ํžˆ ๋งค๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ns๋„ ์ž ์‹œ ํ›„ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด ๋™์ž‘์˜ ์›์ธ์„ ์ดํ•ดํ•˜๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ€์ง„ ์œ ์ผํ•œ ์ข…๋ฃŒ์ž๋Š” kubernetes์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋™์  ์›นํ›…์ด ์žˆ๋Š”๋ฐ ๊ด€๋ จ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@xetys ๊ธ€์Ž„, ๋งˆ์นจ๋‚ด ๋‚˜๋Š” ๊ทธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€์˜ ๋ณต์ œ๋ณธ์— ๋Œ€ํ•œ ํŠธ๋ฆญ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์•„๋งˆ๋„ ๋” ์ด์ƒ ์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ปค์Šคํ…€ ํŒŒ์ด๋„ ๋ผ์ด์ €๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ข…๋ฃŒ ์ž์— ๋Œ€ํ•œ ์ฐธ์กฐ๋ฅผ ์ œ๊ฑฐํ–ˆ์„ ๋•Œ ๊ทธ๊ฒƒ๋“ค์ด ์‚ฌ๋ผ์ง€๊ณ  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋„ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ! :)

EKS 1.10.3 ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋™์ผํ•œ ๋ฌธ์ œ :

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"}

๋ฒ ์–ด ๋ฉ”ํƒˆ ํด๋Ÿฌ์Šคํ„ฐ์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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"}

๋‚ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์‹ค์ œ๋กœ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๋‘ ๋ฒˆ์งธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ์‹ค์ œ ๋ชฉ๋ก์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. https://github.com/kubernetes/kubectl/issues/151#issuecomment -402003022

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ๊ฐœ์ฒด์— ๋Œ€ํ•ด kubectl delete ๋˜๋Š” kubectl edit ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด๋‹ˆ์…œ ๋ผ์ด์ €๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ํŠธ๋ฆญ์ด ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค ...

kubectl edit namespace annoying-namespace-to-delete ํ•˜๊ณ  ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด kubectl get -o yaml ํ™•์ธํ•˜๋ฉด ๋‹ค์‹œ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ @adampl ์„ ์ œ์•ˆํ•œ ๊ฒƒ์„ ์‹œ๋„ ํ•  ๋•Œ ์ถœ๋ ฅ์ด ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ( --ignore-not-found ์ œ๊ฑฐํ•˜๋ฉด ๋ชจ๋“  ์œ ํ˜•์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์Œ์„ ํ™•์ธ ํ•จ).

@ManifoldFR , ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  json ํŒŒ์ผ๋กœ API ํ˜ธ์ถœ์„ ๋งŒ๋“ค์–ด ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
๊ทธ๋Ÿฐ ๋‹ค์Œ tmp.json์„ ํŽธ์ง‘ํ•˜๊ณ  "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

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@slassh ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค! API ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ƒ๊ฐ ํ–ˆ์–ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ์˜์›ํžˆ ๋‹น์‹ ์˜ ์ฐฌ์–‘์„ ๋…ธ๋ž˜ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค

v1.11.1์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„์ฟ  ์œ„ํ‚ค์˜ ๋ชฉ์žฅ์ฃผ / ์กฐํƒ€ ๋ฐฐํฌ๊ฐ€ ๋ง‰ํ˜”์Šต๋‹ˆ๋‹ค. ๋จผ์ € @siXor๊ฐ€ ์ œ์•ˆํ•œ๋Œ€๋กœ ํฌ๋“œ๋ฅผ ๊ฐ•์ œ๋กœ ์‚ญ์ œ ํ•œ ๋‹ค์Œ @slassh ์กฐ์–ธ์„ ๋”ฐ๋ผ์•ผ

@slassh kubernetes-cluster-ip๋ฅผ ๋ณด๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? kubernetes ํด๋Ÿฌ์Šคํ„ฐ ๊ต์ฒด๋ฅผ ๋ฐฐํฌ ํ•œ ๋…ธ๋“œ IP ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  404๋ฅผ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” @jiuchongxiao , kubernetes-cluster-ip์˜ ๋…ธ๋“œ ๋งˆ์Šคํ„ฐ IP ์ค‘ ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค.
ํ—ท๊ฐˆ ๋ฆฌ๋ฉด ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

๋จผ์ € 'kubectl ํ”„๋ก์‹œ'๋ฅผ ์‹œ์ž‘ํ•˜๋ฉด curl์„ http://127.0.0.1 : 8001 / api / v1 / namespaces / annoying-namespace-to-delete / finalize๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•  ๋•Œ๊นŒ์ง€ ์ธ์ฆ์„๋ฐ›์„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

์ข‹์€ ํŒ @ 2stacks. https ๋ฅผ http ๋ฉ๋‹ˆ๋‹ค.

1.11.2์—์„œ ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์žฌํ˜„์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ปจํ…์ŠคํŠธ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด CRD์—์„œ๋งŒ ์ด๊ฒƒ์„ ๋ณด์•˜์Šต๋‹ˆ๋‹ค. CRD ๊ฐ์ฒด๋ฅผ ์‚ญ์ œํ•˜๋ฉด ์†Œ์œ  ํ•œ ๊ฐ์ฒด๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ์ด์ƒํ•œ ์ƒํƒœ๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ˆˆ์น˜ ์ฑ„์ง€ ๋ชปํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ์‚ญ์ œ๋ฅผ ๋ฐœํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ kubectl delete all --all -n my-namespace ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๊ฐœ์ฒด๋ฅผ ์‚ญ์ œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์–ด๋–ค ์‹ ์œผ๋กœ๋“  ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด์ด ํŠน์ • ๋ฌธ์ œ๊ฐ€ ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ ๋น„์ •์ƒ์ ์ธ ๊ฒƒ๊ณผ ๊ด€๋ จ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค. ์ œ ๊ฒฝ์šฐ์—๋Š” ๋ฒ„๊ทธ๊ฐ€ ์•„๋‹ˆ ์—ˆ์Šต๋‹ˆ๋‹ค. ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ ๋‹ค์‹œ ์˜ฌ๋ผ ๊ฐ”์„ ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@slassh ์™„๋ฒฝํ•œ ์†”๋ฃจ์…˜! ๋Œ€๋‹จํžˆ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๏ผ๏ผ๏ผ๏ผ

1.10.x์—์„œ๋„์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. @slassh ์˜ ์˜๊ฒฌ์€ ์‹ค์ œ ๋ฌธ์ œ๋ฅผ ์ˆจ๊ธฐ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ Terminating ์—์„œ ๋ฉˆ์ถ˜ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ์ด์œ ๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค (@palmerabollo).

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์ข…๋ฃŒ ์ž kubernetes ๊ฒฝ์šฐ ์ด๋Š” API ์„œ๋ฒ„์˜ ๋‚ด๋ถ€ ๋ฌธ์ œ๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

kubectl api-resources ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ˜ํ™˜๋˜๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • API์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

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

์ƒํƒœ ์กฐ๊ฑด์„ ํ™•์ธํ•˜๋ ค๋ฉด kubectl get apiservices v1beta1.metrics.k8s.io -o yaml ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.

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

์œ„์˜ ์˜ค๋ฅ˜๋Š” metrics-server์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” crashloopbackoff๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. Kubernetes์— ๋“ฑ๋ก ๋œ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž ์ง€์ • API์˜ ๊ฒฝ์šฐ์™€ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ์™€ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ๋Ÿฐํƒ€์ž„ ์ž‘์—…์„ ๋ณต์›ํ•˜๋ ค๋ฉด kube-system ์—์„œ ์„œ๋น„์Šค ์ƒํƒœ๋ฅผ ํ™•์ธํ•˜์„ธ์š”.

v1.11.3์—์„œ์ด ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ์ข…๋ฃŒ ์ž์—๋Š” ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ kubernetes ๋งŒ ์žˆ์Šต๋‹ˆ๋‹ค.

spec:
  finalizers:
  - kubernetes

@slassh ๋ฐฑ๋งŒ๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, ๊ท€ํ•˜์˜ ์†”๋ฃจ์…˜์€ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค!
ark, tiller ๋ฐ kubed์™€ ํ•จ๊ป˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ๋‹ค๋ฅธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ์‚ญ์ œ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š” ์ด์œ ๋Š” ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ค๋ฅ˜๋ฅผ ์ œ๊ณตํ•˜๋Š” kubed์˜ API ์ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@javierprovecho ๋‚˜๋Š” ๋‹จ์ง€ ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋ฅผ ๊ฐ€์ง€๊ณ 

status:
  conditions:
  - lastTransitionTime: 2018-08-24T08:59:36Z
    message: service/metrics-server in "kube-system" is not present
    reason: ServiceNotFound
    status: "False"
    type: Available

์ด ์ƒํƒœ์—์„œ ํšŒ๋ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

ํŽธ์ง‘ : ์•Œ์•„ ๋ƒˆ์Šต๋‹ˆ๋‹ค ... ์ธก์ • ํ•ญ๋ชฉ / HPA์™€ ์›๊ฒฉ์œผ๋กœ ๊ด€๋ จ๋œ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์‚ญ์ œ ํ•œ ๋‹ค์Œ ์ „์ฒด ์ œ์–ด ํ”Œ๋ ˆ์ธ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค (๋ฐฑ์—…ํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ๋ณต์ œ๋ณธ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•จ). ์—ฌ๊ธฐ์—๋Š” apiservice ์‚ญ์ œ๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. v1beta1.metrics.k8s.io ์ž์ฒด.

๋ฟก ๋นต๋€จ

$ kubectl delete apiservice v1beta1.metrics.k8s.io

์ž‘๋™ํ•˜์ง€ ์•Š๋Š” metrics API ์„œ๋น„์Šค๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ ๊ด€๋ฆฌ์ž๊ฐ€ ์˜ค๋ž˜๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ์–ด ํ”Œ๋ ˆ์ธ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@antoineco ์•„๋‹ˆ์š”, ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. apiservice๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๊ฝค ๊ธฐ๋‹ค๋ ธ์ง€ ๋งŒ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์„ ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ๊นŒ์ง€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž‘์€ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๊ณ  ๊ธด์žฅ์„ ํ’€๊ณ  ์ด์ œ k8s ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

  1. kubectl ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด
    Kubernetes ๋งˆ์Šคํ„ฐ๋Š” https : // localhost : 6443์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
    KubeDNS๋Š” https : // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns : dns / proxy์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์ง„๋‹จํ•˜๋ ค๋ฉด 'kubectl cluster-info dump'๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  1. ์ด์ œ kube-proxy๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
    kubectl ํ”„๋ก์‹œ ๋ฐ
    127.0.0.1:8001์— ๊ฒŒ์žฌ ์‹œ์ž‘

๋‚˜์ค‘์— ์‚ญ์ œํ•˜๋ ค๋ฉด ID๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. :)

  1. ์‚ญ์ œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. :) ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ€์ถ• ์‹œ์Šคํ…œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    kubectl get ns
    ๊ฐ€์ถ• ์‹œ์Šคํ…œ ์ข…๋ฃŒ 1d

ํŒŒ์ผ์— ๋„ฃ์–ด

  1. kubectl get namespace cattle-system -o json> tmp.json
  1. ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    "์ฟ  ๋ฒ ๋ฅด๋„ค ํ…Œ์Šค"
    ]
    },
    ํŽธ์ง‘ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ‘
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    ]
    },
    ๊ฑฐ์˜ ๋‹ค ์™”์–ด์š” ๐Ÿ‘

curl -k -H "Content-Type : application / json"-X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

ํŒŒ์ด๋„ ๋ผ์ด์ € kubernetes ์ด (๊ฐ€) ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์ž˜๋ชป ๊ตฌ์„ฑ๋œ ๋ฉ”ํŠธ๋ฆญ API ์„œ๋น„์Šค ์ด๋ฆ„์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋‹น์‹ ์€ ์ œ์–ด ํ”Œ๋ ˆ์ธ ๋กœ๊ทธ๋ฅผ๋ณด๊ณ  ๋ฐœ๊ฒฌ ํ•  ์ˆ˜์žˆ๋Š” ๋‹ค๋ฅธ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒ„๊ทธ ํ™•์ธ์—†์ด ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋” ์ด์ƒ ์‚ญ์ œ ๋ชฉ์ ์œผ๋กœ ๋‹ค์‹œ ์•ก์„ธ์Šค ํ•  ์ˆ˜์—†๋Š” ์ƒ์„ฑ ๋œ ํ•ญ๋ชฉ์„ ๋‚จ๊ฒจ ๋‘๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒฐ๊ณผ ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์•„์ง ์ง„ํ–‰ ์ค‘์ด๋ฏ€๋กœ :
"none"์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๋‚ด minikube ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ ํ˜ธ์ŠคํŠธ๊ฐ€ ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ์—์„œ ๊นจ์–ด ๋‚œ ํ›„ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ๊ฐ€์ • :
์ œ ๊ฒฝ์šฐ์—๋Š” ์ตœ๋Œ€ ์ ˆ์ „ ๋ชจ๋“œ๊ฐ€ ๋™์ผํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐœ์ƒ ์‹œ์ผฐ์œผ๋ฉฐ ํ™œ์„ฑํ™” ๋œ ์Šค์™‘์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์ •์„ ์‚ฐ์ถœํ•ฉ๋‹ˆ๋‹ค.
์˜ํ–ฅ์„๋ฐ›๋Š” ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์Šค์™‘์ด ํ™œ์„ฑํ™” ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ๋‹จ์ง€ ์ถ”์ธก์ž…๋‹ˆ๋‹ค. ๋‚˜์—๊ฒŒ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๋‚ด ๋กœ์ปฌ ์„ค์ •์œผ๋กœ์ด ๋ฒ„๊ทธ์— ์ฐฉ์ˆ˜ํ•˜๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ : hibernate๋Š” kubernetes์— ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค .

๋จผ์ € ์ž‘์€ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๊ณ  ๊ธด์žฅ์„ ํ’€๊ณ  ์ด์ œ k8s ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

  1. kubectl ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด
    Kubernetes ๋งˆ์Šคํ„ฐ๋Š” https : // localhost : 6443์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
    KubeDNS๋Š” https : // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns : dns / proxy์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์ง„๋‹จํ•˜๋ ค๋ฉด 'kubectl cluster-info dump'๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  1. ์ด์ œ kube-proxy๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
    kubectl ํ”„๋ก์‹œ ๋ฐ
    127.0.0.1:8001์— ๊ฒŒ์žฌ ์‹œ์ž‘

๋‚˜์ค‘์— ์‚ญ์ œํ•˜๋ ค๋ฉด ID๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. :)

  1. ์‚ญ์ œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. :) ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ€์ถ• ์‹œ์Šคํ…œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    kubectl get ns
    ๊ฐ€์ถ• ์‹œ์Šคํ…œ ์ข…๋ฃŒ 1d

ํŒŒ์ผ์— ๋„ฃ์–ด

  1. kubectl get namespace cattle-system -o json> tmp.json
  1. ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    "์ฟ  ๋ฒ ๋ฅด๋„ค ํ…Œ์Šค"
    ]
    },
    ํŽธ์ง‘ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ‘
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    ]
    },
    ๊ฑฐ์˜ ๋‹ค ์™”์–ด์š” ๐Ÿ‘

curl -k -H "Content-Type : application / json"-X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

ํฐ!!
๊ณต์žฅ

gcloud ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด (์˜ˆ : ๋…ธ๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ)์ด ๋ฌธ์ œ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด gcloud instances list ์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ ์ƒˆ ๋…ธ๋“œ๋กœ ๊ต์ฒด๋˜์ง€๋งŒ k8s ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ํฌ๋“œ๋Š” ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

Reason:                    NodeLost
Message:                   Node <old node> which was running pod <pod> is unresponsive

๊ทธ๋Ÿฌ๋ฉด ํฌ๋“œ๊ฐ€ ์•Œ ์ˆ˜์—†๋Š” ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

$ kubectl get po
NAME                               READY     STATUS    RESTARTS   AGE
<pod>                              2/2       Unknown   0          39d

์ด๋กœ ์ธํ•ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ข…๋ฃŒ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”์ง€ ๋˜๋Š” UNKNOWN ์ƒํƒœ์—์„œ ํฌ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ข…๋ฃŒ์™€ ๊ด€๋ จ๋œ ์‹ค์ œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ (๋˜๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ) ).

gcloud ์ธ์Šคํ„ด์Šค๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด (์˜ˆ : ๋…ธ๋“œ ์—…๊ทธ๋ ˆ์ด๋“œ)์ด ๋ฌธ์ œ๊ฐ€ ์ฃผ๊ธฐ์ ์œผ๋กœ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒํ•˜๋ฉด gcloud instances list ์˜ ์ด์ „ ๋…ธ๋“œ๊ฐ€ ์ƒˆ ๋…ธ๋“œ๋กœ ๊ต์ฒด๋˜์ง€๋งŒ k8s ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ํฌ๋“œ๋Š” ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค.

Reason:                    NodeLost
Message:                   Node <old node> which was running pod <pod> is unresponsive

๊ทธ๋Ÿฌ๋ฉด ํฌ๋“œ๊ฐ€ ์•Œ ์ˆ˜์—†๋Š” ์ƒํƒœ๊ฐ€๋ฉ๋‹ˆ๋‹ค.

$ kubectl get po
NAME                               READY     STATUS    RESTARTS   AGE
<pod>                              2/2       Unknown   0          39d

์ด๋กœ ์ธํ•ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ข…๋ฃŒ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ข…๋ฃŒ์ž๋ฅผ ๋ณ€๊ฒฝํ•ด์•ผํ•˜๋Š”์ง€ ๋˜๋Š” UNKNOWN ์ƒํƒœ์—์„œ ํฌ๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผํ•˜๋Š” ์ข…๋ฃŒ์™€ ๊ด€๋ จ๋œ ์‹ค์ œ ๋ฒ„๊ทธ๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€ (๋˜๋Š” ์ด์™€ ๊ฐ™์€ ๊ฒฝ์šฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๊ฐ•์ œ ์ข…๋ฃŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผํ•˜๋Š” ๊ฒฝ์šฐ) ).

๋ฉ‹์ง€๋‹ค, ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ์•ผ
๋…ธ๋“œ๋ฅผ ์œ ์ง€ ๊ด€๋ฆฌ ๋ชจ๋“œ๋กœ ์ „ํ™˜ ํ•œ ๋‹ค์Œ ์œ ์ง€ ๊ด€๋ฆฌ ๋ชจ๋“œ๊ฐ€๋˜๋ฉด ๋ชจ๋“  ํฌ๋“œ๊ฐ€ ๋น„์›Œ์ง€๊ณ  ์‚ญ์ œ / ์—…๊ทธ๋ ˆ์ด๋“œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณด์„ธ์š” ๏ผŒ https://kubernetes.io/docs/concepts/workloads/controllers/garbage-collection/ ,
๋ฆฌ์†Œ์Šค๋ฅผ ํŽธ์ง‘ํ•˜๊ณ  metadata.finalizers๋ฅผ ์‚ญ์ œํ•˜๊ณ  ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” crd๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ฐ•์ œ๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ kubernetes ์ž๋Š” ์ •ํ™•ํžˆ ๋ฌด์—‡์„ํ•ฉ๋‹ˆ๊นŒ? ์ด ํ•ดํ‚น์œผ๋กœ ๋ฆฌ์†Œ์Šค๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ •๋ฆฌ๋˜์ง€ ์•Š์„ ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋ฃจํฌ๊ฐ€ ์ข…๋ฃŒํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md

curl -k -H "Content-Type : application / json"-X PUT --data-binary @ tmp.json https : // kubernetes-cluster-ip / api / v1 / namespaces / annoying-namespace-to-delete / ๋งˆ๋ฌด๋ฆฌํ•˜๋‹ค

์„œ๋ฒ„ ์˜ค๋ฅ˜ (NotFound) : "์‚ญ์ œํ•  ์„ฑ๊ฐ€์‹  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค"๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋จผ์ € ์ž‘์€ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๊ณ  ๊ธด์žฅ์„ ํ’€๊ณ  ์ด์ œ k8s ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

  1. kubectl ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด
    Kubernetes ๋งˆ์Šคํ„ฐ๋Š” https : // localhost : 6443์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
    KubeDNS๋Š” https : // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns : dns / proxy์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

ํด๋Ÿฌ์Šคํ„ฐ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์ง„๋‹จํ•˜๋ ค๋ฉด 'kubectl cluster-info dump'๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

  1. ์ด์ œ kube-proxy๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
    kubectl ํ”„๋ก์‹œ ๋ฐ
    127.0.0.1:8001์— ๊ฒŒ์žฌ ์‹œ์ž‘

๋‚˜์ค‘์— ์‚ญ์ œํ•˜๋ ค๋ฉด ID๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. :)

  1. ์‚ญ์ œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. :) ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ€์ถ• ์‹œ์Šคํ…œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    kubectl get ns
    ๊ฐ€์ถ• ์‹œ์Šคํ…œ ์ข…๋ฃŒ 1d

ํŒŒ์ผ์— ๋„ฃ์–ด

  1. kubectl get namespace cattle-system -o json> tmp.json
  1. ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    "์ฟ  ๋ฒ ๋ฅด๋„ค ํ…Œ์Šค"
    ]
    },
    ํŽธ์ง‘ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ‘
    },
    "spec": {
    "์ข…๋ฃŒ ์ž": [
    ]
    },
    ๊ฑฐ์˜ ๋‹ค ์™”์–ด์š” ๐Ÿ‘

curl -k -H "Content-Type : application / json"-X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

์ž˜๋ชป๋œ ๊ฐ’ : "ํŽธ์ง‘ ๋œ ํŒŒ์ผ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.": ValidationError (Namespace.spec) : io.k8s.api.core.v1.NamespaceSpec์— ๋Œ€ํ•œ ์ž˜๋ชป๋œ ์œ ํ˜• : "๋ฌธ์ž์—ด"๊ฐ€์ ธ ์˜ค๊ธฐ, "๋งต"ํ•„์š”

Terminating ์ค‘์— ๋งŽ์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ฉˆ์ถ˜ ๊ฒฝ์šฐ์ด๋ฅผ ์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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" '

์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋Š” ๋ชจ๋“  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‹ค์ œ๋กœ Terminating .

์œ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด kubectl proxy ์‹คํ–‰ ๋ฐ jq ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ๋ฉ”ํŠธ๋ฆญ API ์„œ๋น„์Šค๊ฐ€ ๋‹ค์šด๋˜์—ˆ์œผ๋ฉฐ ์ž์„ธํ•œ ๋กœ๊น…์—์„œ์ด ์˜ค๋ฅ˜ ๋กœ๊ทธ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฉ”ํŠธ๋ฆญ apiservice๋ฅผ ์ˆ˜์ • ํ•œ ํ›„ ์ข…๋ฃŒ๊ฐ€ ์™„๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
์‚ญ์ œ๊ฐ€ ๋ฉ”ํŠธ๋ฆญ apiservice์— ์˜์กดํ•˜๋Š” ์ด์œ ๊ฐ€ ํ™•์‹คํ•˜์ง€ ์•Š์œผ๋ฉฐ, ๋ฉ”ํŠธ๋ฆญ apiservice๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์— ์„ค์น˜๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ญ์ œ๊ฐ€ ๋ฉ”ํŠธ๋ฆญ apiservice์— ์˜์กดํ•˜๋Š” ์ด์œ ๋ฅผ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

@manojbadam ๋ฉ”ํŠธ๋ฆญ์ด API ์„œ๋ฒ„์— ๋“ฑ๋ก๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ ํ•  ๋•Œ ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์™€ ์—ฐ๊ฒฐ๋œ (์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ) ์‚ญ์ œํ•  (๋„ค์ž„ ์ŠคํŽ˜์ด์Šค) ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์™ธ๋ถ€ API๋ฅผ ์ฟผ๋ฆฌํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ํ™•์žฅ ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ๊ฒฝ์šฐ Kubernetes๋Š” ๋ชจ๋“  ๊ฐœ์ฒด๊ฐ€ ์ œ๊ฑฐ๋˜์—ˆ์Œ์„ ๋ณด์žฅ ํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ๋ฃจํŠธ ๊ฐœ์ฒด๊ฐ€ ์ œ๊ฑฐ ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜์ค‘์— ์กฐ์ •ํ•  ์˜๊ตฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜ (๋ฉ”๋ชจ๋ฆฌ ๋˜๋Š” ๋””์Šคํฌ)์ด ์—†์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๋“ฑ๋ก ๋œ ๋ชจ๋“  API ํ™•์žฅ ์„œ๋น„์Šค์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ž‘์€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋กœ์ด๋ฅผ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns

ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , JSON์„ ์ˆ˜์ •ํ•˜๊ณ , "kubectl proxy"๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.โ€ฆ

์ €๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ด ๋ฌธ์ œ๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ž‘์€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋กœ์ด๋ฅผ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns

ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , JSON์„ ์ˆ˜์ •ํ•˜๊ณ , "kubectl proxy"๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.โ€ฆ

์ €๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

๋‚ด ์˜์›…! <3

๋‚˜๋„์ด ๋ฌธ์ œ์— ๋ถ€๋”ชํ˜”๋‹ค. ์ €๋Š” Google Kubernetes Engine์—์„œ Terraform์„ ์‚ฌ์šฉํ•˜์—ฌ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ฐ€๋™ํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด๋ถ€์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์™€ ํฌ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” terraform destroy ์‹คํ–‰ ํ›„ ์ž ์‹œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” Terraform์ด ํŒŒ๊ดด๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์ˆœ์„œ์— ๋ฌธ์ œ๊ฐ€์žˆ๋Š” ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. Terraform์€ ๋จผ์ € ๋…ธ๋“œ ํ’€์„ ์‚ญ์ œ ํ•œ ๋‹ค์Œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์™€ ํฌ๋“œ๋ฅผ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ (์œ ์ผํ•œ) ๋…ธ๋“œ ํ’€ ์‚ญ์ œ๋กœ ์ธํ•ด Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์œผ๋ฉฐ, ์ด๊ฒƒ์ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ ์˜์›ํžˆ "์ข…๋ฃŒ"๋˜๋Š” ์›์ธ์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@FooBarWidget ๋‚˜๋ฅผ ์œ„ํ•ด ๊ฐ™์€ ๋ฌธ์ œ :(

์ด ๋ฌธ์ œ๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ž‘์€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋กœ์ด๋ฅผ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns

ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , JSON์„ ์ˆ˜์ •ํ•˜๊ณ , "kubectl proxy"๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.โ€ฆ

์ €๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

[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

๋ฐ˜ํ™˜ ์ฝ”๋“œ 403์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? (

์ด ๋ฌธ์ œ๋ฅผ ์ง€์†์ ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด์„œ ์ž‘์€ ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋กœ์ด๋ฅผ ์ž๋™ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/ctron/kill-kube-ns/blob/master/kill-kube-ns
ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , JSON์„ ์ˆ˜์ •ํ•˜๊ณ , "kubectl proxy"๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.โ€ฆ
์ €๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ์•ˆ๋‚ดํ•ด ์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

[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

๋ฐ˜ํ™˜ ์ฝ”๋“œ 403์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ? (

Thx god, ์ข…๋ฃŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋งˆ์นจ๋‚ด ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐฉ๋ฒ•์€ ๋‚˜๋ฅผ ์œ„ํ•ด ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์ง€๋งŒ ๋ฉ”ํŠธ๋ฆญ ์„œ๋น„์Šค๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” digitalocean ๋ฐ gitlab auto devops์˜ k8s๋กœ ๋†€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ๊ฐ€์ •์€ ์ผ๋ถ€ digitalocean blob ์ €์žฅ์†Œ์ด์ง€๋งŒ ๋ถ„์„ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค.

@mingxingshi ํ…์‚ฌ์Šค. ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์€ ํŽธ์ง‘ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํ•ด๋ƒˆ์Šต๋‹ˆ๋‹ค.

์™€์šฐ, ๋“œ๋””์–ด ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. @mingxingshi ๋ช…๋ น์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์ €์—๊ฒŒ ํ•ด๊ฒฐ์ฑ…์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

kubectl delete apiservice v1beta1.metrics.k8s.io

์ด ๊ฒฝํ—˜์„ ์—ฌ๊ธฐ์— ๋‚จ๊ฒจ ๋‘์–ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ฆฌ์†Œ์Šค๋กœ terraform apply ์„ (๋ฅผ) ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

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"
  ...
}

ํ•˜์ง€๋งŒ ์ €๋Š” helm newb์ด๊ณ  servicer ๋ผ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“  ํ…œํ”Œ๋ฆฟ์ด์žˆ๋Š” ํ…œํ”Œ๋ฆฟ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด terraform ๋ฐ k8s๊ฐ€ terraform์ด ์‹คํŒจํ•˜๋Š”์ด ์ž˜๋ชป๋œ ์ƒํƒœ๊ฐ€๋˜๊ณ  k8s๋Š” Terminating ์ƒํƒœ์—์„œ servicer ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์˜๊ตฌ์ ์œผ๋กœ ๋‚จ๊ฒจ ๋‘ก๋‹ˆ๋‹ค. @mingxingshi ๊ฐ€ ์œ„์—์„œ

์ด ๋ฌธ์ œ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋งŒ๋“  ํ…œํ”Œ๋ฆฟ์„ ์ œ๊ฑฐํ•˜๊ณ ์ด๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ๋งก๊ฒผ์„ ๋•Œ ์ €์—๊ฒŒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ์ €์—๊ฒŒ ์™„์ „ํžˆ ๋ฐ˜๋ณต๋ฉ๋‹ˆ๋‹ค. ๋จผ์ € prometheus-operator๋ฅผ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋•Œ:

cd prometheus-operator/contrib/kube-prometheus
kubectl create -f manifests/ --validate=false
 ... wait ...
kubectl delete namespace monitoring

์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ kubectl delete -f manifests/ ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ํ”„๋กœ ๋ฉ”ํ…Œ์šฐ์Šค ์šด์˜์ž์™€ ๋˜‘๊ฐ™์€ ์‹œ๊ฐ„์„ ๋ณด๋ƒˆ์Šต๋‹ˆ๋‹ค. ๊ณ ์ •์„ ํ•ด์ œํ•˜๋ ค๋ฉด kubectl delete -f manifests/ ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
ํ”„๋กœ ๋ฉ”ํ…Œ์šฐ์Šค CRD์— ์˜ค์ž‘๋™ํ•˜๋Š” ์ผ๋ถ€ ์ข…๋ฃŒ์ž๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.์ด ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ๊ฑฐ์˜ kubernetes ์ž˜๋ชป์ด ์•„๋‹™๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ kubernetes๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฒ”์ธ์„ ๋” ์‰ฝ๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.์ด ์Šค๋ ˆ๋“œ์˜ ๊ธธ์ด๋Š” ์—ฌ๋Ÿฌ ์›์ธ์ด์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ๊ทธ ์›์ธ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์‰ฝ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ €๋Š” kubernetes noob์ด๋ฏ€๋กœ ์—ฌ๊ธฐ์— ๋งŽ์€ ์ •๋ณด๋ฅผ ์ œ๊ณต ํ•  ์ˆ˜ ์—†์ง€๋งŒ ์ข…๋ฃŒ ์ƒํƒœ์— 2 ๊ฐœ์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ถ™์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด kubernetes ์„ค์ •์€ 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

์ข…๋ฃŒ ์ƒํƒœ์—์žˆ๋Š” ๋‘ ๊ฐœ์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ์ฃผ์„์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์ข…๋ฃŒ์ž๋ฅผ ํ™•์ธํ•˜๋ฉด 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

์–ด์จŒ๋“  ์ข…๋ฃŒ ์ž์—์„œ kubernetes ์ œ๊ฑฐ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ์ฃผ์„์— ์„ค๋ช… ๋œ json / api ์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ ค๊ณ  ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๊ฐ•์ œ ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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.

์ œ ๊ฒฝ์šฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” rook-ceph์ด๊ณ , kubectl -n rook-ceph patch cephclusters.ceph.rook.io rook-ceph -p '{"metadata":{"finalizers": []}}' --type=merge ๋Š” ์ €์—๊ฒŒ ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋„ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : https://github.com/rook/rook/blob/master/Documentation/ceph-teardown.md

@ManifoldFR , ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  json ํŒŒ์ผ๋กœ API ํ˜ธ์ถœ์„ ๋งŒ๋“ค์–ด ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
๊ทธ๋Ÿฐ ๋‹ค์Œ tmp.json์„ ํŽธ์ง‘ํ•˜๊ณ  "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

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

~ 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 , ๋‚˜๋Š” ๋‹น์‹ ๊ณผ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  json ํŒŒ์ผ๋กœ API ํ˜ธ์ถœ์„ ๋งŒ๋“ค์–ด ์ž‘๋™ํ•˜๋„๋ก ๊ด€๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค.
kubectl get namespace annoying-namespace-to-delete -o json > tmp.json
๊ทธ๋Ÿฐ ๋‹ค์Œ tmp.json์„ ํŽธ์ง‘ํ•˜๊ณ  "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
๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

์ ‘๊ทผ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋Š” ๋™์•ˆ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹จ๊ณ„ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•ด ์–ด๋–ป๊ฒŒํ•ด์•ผํ•ฉ๋‹ˆ๊นŒ?

~ 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

๋‚ด ๋ฌธ์ œ๋Š”์ด ์Šคํฌ๋ฆฝํŠธ๋กœ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : 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 ๊ฐ€ ํŠธ๋ฆญ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

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"

์‹ค์ œ๋กœ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
์ œ ๊ฒฝ์šฐ kubectl get ns ๋Š” ์‚ญ์ œ ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ํ‘œ์‹œํ•˜์ง€ ์•Š์ง€๋งŒ kubectl get all -n <namespace> ๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ณ  ๊ฑด์ „ํ•˜๊ฒŒ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.
๋…ธ๋“œ์™€ ๋„์ปค ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์—ฌ์ „ํžˆ ์‹คํ–‰ ์ค‘์ธ์ง€ ํ™•์ธํ–ˆ์Šต๋‹ˆ๋‹ค.

@glouis ๋Š” ์œ„์˜ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ

๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๊ณ ์ด ๋ฐฉ๋ฒ•์„ ๋งน๋ชฉ์ ์œผ๋กœ ์˜นํ˜ธํ•˜๋Š” ๊ฒƒ์„ ๋ณด๋Š” ๊ฒƒ์€ ์ •๋ง ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ถ”ํ•˜๊ณ  ์ž ์žฌ์ ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ์— ๋งŽ์€ ์ž”์—ฌ ๋ฌผ์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. @javierprovecho๋Š” ์ด๋ฏธ ์œ„์—์„œ ์–ธ๊ธ‰ ํ–ˆ์œผ๋ฉฐ @liggitt ๋Š” ๋‹ค๋ฅธ GitHub ๋ฌธ์ œ์—์„œ๋„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค .

์†์ƒ๋œ v1beta1.metrics.k8s.io API ์„œ๋น„์Šค ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ํ•„์š”ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฐธ์กฐ # 73405

๋‘ ๋ฒˆ์งธ @antoineco ๋ฉ”์‹œ์ง€์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ณ„์†ํ•ด์„œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๊ณ ์ฐฉ๋˜์–ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒŒ๋“œ ๋ฐ•์Šค ํ™˜๊ฒฝ ์ค‘ ํ•˜๋‚˜์—์„œ ์ด๊ฒƒ์„ ํ…Œ์ŠคํŠธํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ฝ ํ•œ ๋‹ฌ ํ›„์— ๋ชจ๋“  ๋„์ปค ๋ฐ๋ชฌ์ด ์•„๋ฌด๋Ÿฐ ์ด์œ ์—†์ด ๋™๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚จ๊ฒจ ๋‘๋ฉด์„œ ์—„์ฒญ๋‚œ ๋ฉ”๋ชจ๋ฆฌ ๋ˆ„์ˆ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

๋งŽ์€ ์‹œํ–‰ ์ฐฉ์˜ค๋ฅผ ๊ฑฐ์ณ ์ด๋Ÿฌํ•œ ์ฃผ์„์„ ์ฝ์€ ํ›„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ coreos grafana ์Šคํƒ์— ๋Œ€ํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฆฌ์†Œ์Šค ์ •์˜๋กœ ํŒ๋ช…๋˜์—ˆ์Šต๋‹ˆ๋‹ค. CRD๋ฅผ ๋‚˜์—ดํ•˜๋ฉด ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•œ ํŠน์ • ๋ฆฌ์†Œ์Šค๊ฐ€ ํ‘œ์‹œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” CRD์˜ ์ด๋ฆ„์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋ถ™์–ด์žˆ์–ด์„œ ๋งค์šฐ ์šด์ด ์ข‹์•˜์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•˜๋‚˜์˜ ๊ณ ์ • ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์žˆ์œผ๋ฉด ๋” ์ด์ƒ ์‚ญ์ œํ•  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์œผ๋กœ ๋ฐํ˜€์กŒ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ CRD๊ฐ€์—†๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค A๊ฐ€ ์žˆ๊ณ  ๊ณ ์ • ๋œ CRD๊ฐ€์žˆ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค B๊ฐ€ ์žˆ์–ด๋„ B๊ฐ€ ์‚ฌ๋ผ์งˆ ๋•Œ๊นŒ์ง€ A์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ์œ ์ง€๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งค๋ฒˆ ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚จ๊ฒจ๋‘๊ณ  ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค A์—์„œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ์ˆ˜์ •์„ ์ˆ˜ํ–‰ํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์—ฌ์ „ํžˆ ๋‚˜๋ฅผ ์ฃฝ์ด๊ณ ์žˆ๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ํ‰์ƒ ๋™์•ˆ CRD ์‚ญ์ œ์— ์‹คํŒจํ•œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ •๋ฆฌ๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” ๋กœ๊ทธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ฑฐ๋‚˜ ํ˜„์žฌ ์ˆ˜ํ–‰์ค‘์ธ ์ž‘์—…์„ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์–ด๋–ค CRD์— ๋ถ™์–ด ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ ํ•œ ์‹œ๊ฐ„์„ ์†Œ๋น„ํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด ๊ต‰์žฅ ํ•  ๊ฒƒ ๊ฐ™์€ ๊ณ ์ฐฉ ๋œ ๋ฆฌ์†Œ์Šค๋ฅผ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์—„์ฒญ๋‚œ ์‹œ๊ฐ„์„ ํ• ์•  ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@jecafarelli ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์— ๋Œ€ํ•œ ์ข‹์€ ํžŒํŠธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํ•˜๊ฒŒ๋„, ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ๋Š” ์ฃฝ์ผ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋‚˜์ค‘์— ์ „์ฒด ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค ๊ฒƒ์ž„์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ๋ถ„์„ํ•ด ๋ณด์•˜์ง€๋งŒ์ด ์Šค๋ ˆ๋“œ์—์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์ด๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

์ด ๊ณต์‹ ์†”๋ฃจ์…˜์ด ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค : https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating
kubectl edit namespace rook-ceph ์™€ ๋™์ผ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์‚ญ์ œ ๋œ _ "finalizers"_์— PUT ์š”์ฒญ์„ ํ•  ๋•Œ๊นŒ์ง€์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋‚˜๋Š” coreos์™€ ํ•จ๊ป˜ ์ด๊ฒƒ์„ ๋‹ค์‹œ ๋งŒ๋‚ฌ๊ณ  ์กฐ๊ธˆ ๋” ๊นŠ์ด ํŒŒ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด ๋ฆฌ์†Œ์Šค ์ •์˜ ๋•Œ๋ฌธ์ด๋ฉฐ ๋” ๋‚˜์•„๊ฐ€ coreos์—์„œ ์ •๋ณด๋ฅผ ์ฟผ๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. api ๊ทธ๋ฃน์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์–ป์œผ๋ ค๊ณ  ํ•  ๋•Œ ์˜ค๋ฅ˜๋ฅผ ํ‘œ์‹œํ•˜๋Š” apiserver ๋กœ๊ทธ์—์„œ ์˜ค๋ฅ˜๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ ์ฐธ์กฐ ๋œ ๋ฌธ์ œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ns๊ฐ€ ์ €์—๊ฒŒ ๋ถ™์–ด์žˆ๋Š” ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๋น ๋ฅธ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋‹ค์‹œ ์‹คํ–‰ํ•˜๊ณ  ๋‚ด๊ฐ€ ์‹คํ–‰ํ•˜๋Š” ๋‹ค๋ฅธ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณ„์† ์ถ”๊ฐ€ํ•˜๋ฉด ๋‚˜์ค‘์— ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

@jecafarelli ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค ;-)

cert-manager ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€์˜ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์— cert-manager๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฉฐ์ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ข…๋ฃŒ ์ƒํƒœ์—์„œ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. oc delete apiservices v1beta1.admission.certmanager.k8s.io ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

@jecafarelli ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ œ ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค ;-)

cert-manager ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋‚ด๋ถ€์˜ OpenShift ํด๋Ÿฌ์Šคํ„ฐ์— cert-manager๋ฅผ ์„ค์น˜ํ–ˆ์œผ๋ฉฐ์ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ข…๋ฃŒ ์ƒํƒœ์—์„œ ๋ฉˆ์ท„์Šต๋‹ˆ๋‹ค. oc delete apiservices v1beta1.admission.certmanager.k8s.io ์‹คํ–‰ํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ ๋œ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ๋„ kubectl delete -f https://raw.githubusercontent.com/jetstack/cert-manager/release-0.8/deploy/manifests/00-crds.yaml ๋„์›€์ด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

GKE๋ฅผ ์‚ฌ์šฉํ•˜๋Š” 1.13.6 ๋ฒ„์ „์—์„œ๋„์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. GKE์˜ Istio ์• ๋“œ์˜จ์„ ์‚ฌ์šฉ ์ค‘์ง€ํ•˜์—ฌ ๋ชจ๋“  ๊ถŒํ•œ์„ ์ˆ˜๋™์œผ๋กœ ์„ค์น˜ ํ•œ ํ›„์— ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.
์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ์ฝ์–ด ๋ณธ ๊ฐ€์žฅ ๊ธด ๋ฌธ์ œ ์Šค๋ ˆ๋“œ์ด๋ฉฐ,์ด ๋ฌธ์ œ์˜ ๊ทผ์›์— ๋Œ€ํ•œ ์‹ค์ œ ํ•ฉ์˜ ๋‚˜ ์žฌํ˜„ ๋‹จ๊ณ„๊ฐ€ ์—†๋‹ค๋Š” ์‚ฌ์‹ค์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ๋„˜์–ด ์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JSON ๋ฐ curl / proxy ๋ฐฉ๋ฒ•์€ ์œ„์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰๋˜๊ณ  https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating์— ๋ฌธ์„œํ™”๋˜์–ด ์ €๋ฅผ ๊ตฌํ–ˆ์Šต๋‹ˆ๋‹ค.

https://success.docker.com/article/kubernetes-namespace-stuck-in-terminating ์˜ ์กฐ์–ธ์€ ์ ๊ทน์ ์œผ๋กœ ์œ ํ•ดํ•˜๋ฉฐ ๋‚˜์ค‘์— ๋™์ผํ•œ ์ด๋ฆ„์„ ๊ฐ€์ง„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ๋‹ค์‹œ ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ ๊ณ ์•„ ๋ฆฌ์†Œ์Šค๊ฐ€ ์ •๋ฆฌ๋˜์ง€ ์•Š๊ณ  ๋‹ค์‹œ ํ‘œ์‹œ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .

์ •์ง€ ๋œ ์‚ญ์ œ์˜ ๊ตฌ์ฒด์ ์ธ ์›์ธ์„ ๋ฐํžˆ๊ธฐ์œ„ํ•œ ์ž‘์—…์ด ์ง„ํ–‰ ์ค‘์ด์ง€๋งŒ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ์ •๋ฆฌ ๋œ ๊ฒƒ์œผ๋กœ ํ™•์ธํ•  ์ˆ˜์—†๋Š” API ์œ ํ˜•์ด ์žˆ์œผ๋ฏ€๋กœ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ ํ™•์ธ ๋  ๋•Œ๊นŒ์ง€ ์ฐจ๋‹จ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ์ด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ง€์ •๋œ apiservice๋ฅผ ์„ค์น˜ํ•˜๋Š” Knative๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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
---

knative-serving ns์™€ ๋‹ค๋ฅธ ๋งŽ์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œ ํ•œ ํ›„ ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ bash ์Šคํฌ๋ฆฝํŠธ์— ๋Œ€ํ•ด @jecafarelli ์—๊ฒŒ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
์—ฌ๊ธฐ ๋”์ฐํ•œ powershell ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๋‹ค.

$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

๋‚˜๋Š” ์˜ค๋Š˜ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ ์ด ์Šคํฌ๋ฆฝํŠธ ๋Š” ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์Šต๋‹ˆ๋‹ค.

@ kubernetes / sig-api-machinery-misc

์ด ๋ฒ„๊ทธ๋Š”> ๋…„ ๋™์•ˆ ์กด์žฌํ–ˆ์œผ๋ฉฐ ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค ... ์ด์™€ ๊ฐ™์€ ์ธ๋ฐ”์šด๋“œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ๊ณ„ํš์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ ์–ด๋„ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/kubernetes/kubernetes/pull/80962

๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ๋ฅผ ๊ฒช๊ณ ์žˆ๋‹ค

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

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ปจํŠธ๋กค๋Ÿฌ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ƒํƒœ์— ์กฐ๊ฑด์„๋ณด๊ณ ํ•ด์•ผํ•˜๋ฉฐ ํด๋ผ์ด์–ธํŠธ๋Š”์ด๋ฅผ๋ณด๊ณ ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. KEP๊ฐ€ ํ•„์š”ํ•˜์ง€๋งŒ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„ ๊ฒ€์ฆ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋งค์šฐ ๊ฐ„๋‹จํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

@timothysc @smarterclayton ๋งํ•œ๋‹ค ์ •ํ™•ํžˆ ๋ฌด์—‡์„ํ•˜๊ณ  ๋น„ํ–‰ (์–ด๋”˜๊ฐ€์—)์— PR์ด์žˆ๋‹ค (๋˜๋Š”์ด์—ˆ๋‹ค).

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋˜ ๋‹ค๋ฅธ github ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๊นŒ?

๋„ค PR์€ ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/kubernetes/kubernetes/pull/73405

๋‚ด๊ฐ€ ํ‘œ์ค€์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋Š” ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://github.com/kubernetes/kubernetes/issues/70916

์ €์—๊ฒŒ ๋„์›€์ด ๋œ ๋ฆฌ์†Œ์Šค๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. https://www.ibm.com/support/knowledgecenter/en/SSBS6K_3.1.1/troubleshoot/ns_terminating.html

@slassh ์—์„œ ์ œ์•ˆํ•œ ์†”๋ฃจ์…˜๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ kubectl proxy ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋กœ์ปฌ ํ”„๋ก์‹œ๋ฅผ ๋งŒ๋“ค๊ณ  curl ๋ช…๋ น์˜ ๋Œ€์ƒ IP๋ฅผ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

-

ํŽธ์ง‘ :์ด ๋‹ต๋ณ€ ์•„๋ž˜์— ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰ ํ–ˆ๋“ฏ์ด์ด ์†”๋ฃจ์…˜์€ ๋”๋Ÿฌ์šด ํ•ดํ‚น์ด๋ฉฐ ํด๋Ÿฌ์Šคํ„ฐ์— ์ผ๋ถ€ ์ข…์† ๋ฆฌ์†Œ์Šค๋ฅผ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์ฑ…์ž„ํ•˜์— ์‚ฌ์šฉํ•˜๊ณ  ๊ฐœ๋ฐœ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ๋งŒ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค (ํ”„๋กœ๋•์…˜ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ๋Š” ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค).

์œ„์˜ ๋ฌธ์„œ์— ์„ค๋ช… ๋œ๋Œ€๋กœ ์ข…๋ฃŒ์ž๋ฅผ ์ง์ ‘ ์ œ๊ฑฐํ•˜๋ฉด ๊ฒฐ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ญ์ œ ๋ณด๋ฅ˜ ์ค‘์ด๋˜ ๋ฆฌ์†Œ์Šค๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ํ•ด์ œ ๋œ ํ›„์—๋„ ํด๋Ÿฌ์Šคํ„ฐ์— ๊ณ„์† ์ •์˜๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ข…๋ฃŒ ์ž์˜ ๋ชฉ์ ์ž…๋‹ˆ๋‹ค. ns ์‚ญ์ œ๋ฅผ ํ—ˆ์šฉํ•˜๊ธฐ ์ „์— ๋ชจ๋“  ์ข…์† ํ•ญ๋ชฉ์ด ์ œ๊ฑฐ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์œ ์‚ฌํ•œ ์งˆ๋ฌธ์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

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

์œ ์‚ฌํ•œ ์งˆ๋ฌธ์—์„œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค.

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

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!
์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.
์ด ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์•ฑ์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. https://github.com/jenoOvchi/k8sdelns
๋น ๋ฅธ ์‚ญ์ œ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ๋ˆ„๊ตฐ๊ฐ€์—๊ฒŒ ๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

Kubernetes 1.12.2 ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” Terminating ์ƒํƒœ์ž…๋‹ˆ๋‹ค. ๋•Œ๋•Œ๋กœ ns์˜ yaml์„ ์ˆ˜์ •ํ•˜์—ฌ ์ข…๋ฃŒ์ž๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. api๋กœ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์‚ญ์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ƒํ™ฉ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ๊ตฌ์ฒด์ ์œผ๋กœ ์ถ”์  ํ–ˆ์Šต๋‹ˆ๊นŒ (์ „์ œ ์กฐ๊ฑด :์ด ns์—๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†์Œ), ํฌ์ธํ„ฐ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ NS์—์„œ ์‚ญ์ œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • apiservice๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ : kubectl get apiservice|grep False
  • kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ (Kudos์—์„œ Jordan๊นŒ์ง€)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ •๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹จ๋ฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ NS์—์„œ ์‚ญ์ œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • apiservice๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ : kubectl get apiservice|grep False
  • kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ (Kudos์—์„œ Jordan๊นŒ์ง€)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ •๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹จ๋ฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‹น์‹ ์ด ์–ผ๋งˆ๋‚˜ ์˜ณ์€๊ฐ€.
์ œ ๊ฒฝ์šฐ์—๋Š” Operator Framework apiservice์˜ ํฌ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๊ณ  ํ”„๋กœ์„ธ์Šค ์ข…๋ฃŒ๊ฐ€ ์ฐจ๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” apiservice ์ œ๊ฑฐ (kubectl delete apiservice) ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”, ์ฝ”๋“œ ๋™๊ฒฐ์ด ๋ฉฐ์น  (๋ชฉ์š”์ผ, ํ•˜๋ฃจ์˜ ๋, ํƒœํ‰์–‘ ํ‘œ์ค€์‹œ) ๋‚ด์— ๋ฐœ์ƒํ•˜๋ฏ€๋กœ์ด ๋ฌธ์ œ๊ฐ€ v1.16์—์„œ ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ v1.17๋กœ ์ด๋™๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ์ƒํƒœ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

ํ˜„์žฌ GKE ๋ฆด๋ฆฌ์Šค๋กœ ๋ฐฑ ํฌํŠธ ๋˜๋‚˜์š”? ์•„์ง "์ข…๋ฃŒ ์ค‘"์ธ ์†Œ์ˆ˜์˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€์žˆ๋Š” ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ผ์„ ํ•œ ํ›„์—๋„ @squarelover ? https://github.com/kubernetes/kubernetes/issues/60807#issuecomment -524772920

@josiahbjorgaard ๋ฐฉ๊ธˆ PR์„ ์Šน์ธํ–ˆ์Šต๋‹ˆ๋‹ค. 1.16์— ๋Œ€ํ•ด์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

https://github.com/kubernetes/kubernetes/pull/73405 ๋Š” ์•ž์„œ ์–ธ๊ธ‰ ํ•œ PR์ž…๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด ๋”์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, # 70916์— ๋Œ€ํ•œ ํ–ฅํ›„ ์˜๊ฒฌ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ NS์—์„œ ์‚ญ์ œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • apiservice๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ : kubectl get apiservice|grep False
  • kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ (Kudos์—์„œ Jordan๊นŒ์ง€)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ •๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹จ๋ฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ Metric-Server๊ฐ€ ์„ค์น˜๋˜์–ด์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠน์ • ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ฐฐํฌํ•˜๋Š” ํฌ๋“œ๊ฐ€ ๋ฉ”ํŠธ๋ฆญ ์ˆ˜์ง‘์„ ์ฐพ์„ ๋•Œ. Metric-server์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๋ฅผ ์‚ญ์ œ ํ•œ ํ›„์—๋„ metric-server๋Š” ์–ด๋–ป๊ฒŒ ๋“  ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์ด ๊ฒŒ์‹œ๋ฌผ์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜์—†๋Š” ์ด์œ ๋ฅผ ์‹๋ณ„ํ•˜๋Š” ๋ฐ ๋„์›€์ด๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜์‹ ๋ฐฉ๋ฒ•.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์žˆ๋Š” ๋ชจ๋“  ํ•ญ๋ชฉ์˜ ์‹ค์ œ ๋ชฉ๋ก์„ ์–ป์œผ๋ ค๋ฉด ๋‹ค์Œ์„ ์‹œ๋„ํ•˜์‹ญ์‹œ์˜ค. kubernetes / kubectl # 151 (์ฃผ์„)

๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ๊ฐœ์ฒด์— ๋Œ€ํ•ด kubectl delete ๋˜๋Š” kubectl edit ๋ฅผ ์ˆ˜ํ–‰ํ•˜์—ฌ ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์†”๋ฃจ์…˜์€ ๋‚˜์—๊ฒŒ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š” ์—ฌ๋Ÿฌ๋ถ„,

Terminating status : https://github.com/thyarles/knsk ์—์„œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‰ฝ๊ฒŒ ์‚ญ์ œํ•  ์ˆ˜์žˆ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค

๊ฐ์‚ฌ.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด '์ข…๋ฃŒ ์ค‘'์ƒํƒœ๋กœ ๋ฉˆ์ถ˜๋‹ค๋Š” ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์œ„์˜ stpes๋ฅผ ๋”ฐ๋ผ yaml ํŒŒ์ผ์˜ ์ข…๋ฃŒ ์ž์—์„œ 'kubernetes'๋ฅผ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ํšจ๊ณผ๊ฐ€์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” ์ถ”๊ฐ€ ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋Š” ์ด์œ ๋ฅผ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. kubectl delete ns foonamespace๋ฅผ ์ˆ˜ํ–‰ํ•ด์•ผํ•˜๋ฉฐ ์‚ญ์ œํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ๋‚˜์—๊ฒŒ ์ด์œ ๋ฅผ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์•ˆ๋…•ํ•˜์„ธ์š” @ xzhang007 ,

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ Terminating ์ƒํƒœ์—์„œ ๋ฉˆ์ถ˜ ์ด์œ ๋ฅผ ๋ฐœ๊ฒฌํ•˜๋ฉด ์•Œ๋ ค์ฃผ์„ธ์š”. ๋‚˜๋Š” ์ข‹์€ ๋Œ€๋‹ต์„ ์ž ์‹œ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์•„๋ฌด๊ฒƒ๋„ ์—†์—ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์›์ธ์„ ๋ฐœ๊ฒฌํ•˜๊ณ  ์ˆ˜์ •ํ•  ๋•Œ๊นŒ์ง€ ๋‚ด ์‚ถ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@thyales ์ง€๊ธˆ๊นŒ์ง€ ๋‹ต์„ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ ์šฐ๋ฆฌ๋Š” webhhoks์™€ finalizer ์ค‘ ํ•˜๋‚˜๊ฐ€
์‚ฌ์šฉ์€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ์‚ด๊ณ ์žˆ๋Š” ํฌ๋“œ์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํฌ๋“œ๊ฐ€ ์‚ญ์ œ๋˜๋ฉด ์ข…๋ฃŒ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

>

@ xzhang007 @alvaroaleman ์ด ์ œ๊ณต ํ•œ ๋‹ต๋ณ€์„ ๋ณด์…จ์Šต๋‹ˆ๊นŒ ? ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ์›์ธ์ด ๋ฌด์—‡์ธ์ง€ ์•Œ์•„๋‚ด๋Š” ๋ฐ ์ถฉ๋ถ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ NS์—์„œ ์‚ญ์ œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • apiservice๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ : kubectl get apiservice|grep False
  • kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ (Kudos์—์„œ Jordan๊นŒ์ง€)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ •๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹จ๋ฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


๋˜ํ•œ์ด ๋ฌธ์ œ๊ฐ€ ์ข…๊ฒฐ๋˜์—ˆ์„ ๋•Œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ Terminating์—์„œ ๋ฉˆ์ถ˜ ์ด์œ ๋ฅผ ๋ช…ํ™•ํžˆํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋…ผ์˜ํ•˜๊ธฐ ์œ„ํ•ด ์ฐธ์กฐ ๋œ ์ƒˆ ํ‹ฐ์ผ“์ด์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๋‹ซํžŒ ๋ฌธ์ œ ๋Œ€์‹  ๊ฑฐ๊ธฐ์—์„œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ณ‘ํ•ฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜์žˆ๋Š” ์ผ์ด ๋”์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ, # 70916์— ๋Œ€ํ•œ ํ–ฅํ›„ ์˜๊ฒฌ์„ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@ jeff-knurek ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๊ฒฝ์šฐ์—๋Š” cert-manager ์˜ ์ž˜๋ชป๋œ ์—…๊ทธ๋ ˆ์ด๋“œ๋กœ ์ข…๋ฃŒ์ž๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. 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

์•ˆ๋…•ํ•˜์„ธ์š”.
๋‚ด ์ผ€์ด์Šค ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋Š” https://github.com/rancher/rancher/issues/21546#issuecomment -553635629

์•„๋งˆ๋„ ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://medium.com/@newtondev/how -to-fix-kubernetes-namespace-deleting-stuck-in-terminating-state-5ed75792647e

์ด๊ฒƒ์€ ๋‚˜๋ฅผ์œ„ํ•œ ์ฑ”ํ”ผ์–ธ์ฒ˜๋Ÿผ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋˜ํ•œ ๋™์ผํ•œ ๋ฌธ์ œ์— ์ง๋ฉดํ–ˆ์œผ๋ฉฐ ์ด์ œ๋Š” ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฌธ์„œ๋ฅผ ์ฐธ์กฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์‹ญ์‹œ์˜ค.

@zerkms ๊ธ€์Ž„, ๋•Œ๋กœ๋Š” ํ•ฉ๋ฒ•์  ์ธ ์กฐ์–ธ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ข…์ข… ๋Œ€๊ธฐ์ค‘์ธ ์ข…๋ฃŒ์ž๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ์˜ ์ผ๋ถ€๋กœ ์‚ญ์ œ ๋œ ๊ฐœ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋” ์ด์ƒ ๊ธฐ๋‹ค๋ฆด ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์—-๋” ์ด์ƒ ๋งˆ๋ฌด๋ฆฌ๋ฅผ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค-๊ธฐ์‚ฌ์—์„œ ์„ค๋ช…ํ•˜๋Š” ๋ฐฉ์‹๋Œ€๋กœ ๊ฐ์ฒด๋ฅผ ํŒจ์น˜ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•œ ์˜ต์…˜์ž…๋‹ˆ๋‹ค _.

์ด ๊ธฐ์‚ฌ๋Š” ๊ธฐ์‚ฌ ์ƒ๋‹จ์— ๋งํฌ ๋œ ์•Œ๋ ค์ง„ ๋ฌธ์ œ ํŽ˜์ด์ง€์— ๋‚˜์—ด๋œ ๋‹จ๊ณ„๋ฅผ ์ ์šฉํ•˜์—ฌ ๋ฌธ์ œ๊ฐ€ _ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ์—๋งŒ ์ ์šฉ๋˜๋ฉฐ, ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งํฌ ํ•œ ๋Œ“๊ธ€์ด ๋ฐ˜๋ณต๋˜๋Š” ์กฐ์–ธ์ž…๋‹ˆ๋‹ค.

@zerkms ๊ธ€์Ž„, ๋•Œ๋กœ๋Š” ํ•ฉ๋ฒ•์  ์ธ ์กฐ์–ธ์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ์ข…์ข… ๋Œ€๊ธฐ์ค‘์ธ ์ข…๋ฃŒ์ž๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ์˜ ์ผ๋ถ€๋กœ ์‚ญ์ œ ๋œ ๊ฐœ์ฒด๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ spec.finalizer์— ๋Œ€ํ•ด ์ด๊ฒƒ์ด ์‚ฌ์‹ค ์ธ ๊ฒƒ์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณธ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ •๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ์™€ ๊ด€๋ จ๋˜์–ด ์žˆ์œผ๋ฉฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ์˜๊ตฌ ๊ฐœ์ฒด (์–ด๋“œ๋ฐ”์ด์Šค๊ฐ€ etcd์—์„œ ์ขŒ์ดˆ ๋  ๊ฒƒ์ž„) ๋˜๋Š” ์‘๋‹ตํ•˜์ง€ ์•Š๋Š” ์ง‘๊ณ„ API (๋„ค์ž„ ์ŠคํŽ˜์ด์Šค spec.finalizer๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๊ฑด๋„ˆ ๋›ธ ์ˆ˜ ์žˆ์Œ)๋กœ ์ธํ•ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋Œ€๊ธฐ ์ค‘์ด๋ฉฐ ํ•ด๋‹น API์—์„œ ์ง€์†๋˜๋Š” ๋ฆฌ์†Œ์Šค๋„ ์ขŒ์ดˆ)

์ด ๊ธฐ์‚ฌ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋งˆ๋ฌด๋ฆฌ๋ฅผ ์šฐํšŒํ•˜๋ฉด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋ฆฌ์†Œ์Šค๊ฐ€ ์Šคํ† ๋ฆฌ์ง€์— ์ขŒ์ดˆ ๋  ์œ„ํ—˜์ด ์žˆ๋‹ค๋Š” ๊ฒฝ๊ณ ๋ฅผํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ spec.finalizer์— ๋Œ€ํ•œ ์‚ฌ์‹ค์„ ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค.

๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€์ด ์ข…๋ฃŒ์ž๊ฐ€ kubernetes ์ž์ฒด์— ์˜ํ•ด ๊ตฌํ˜„๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋‚ด์˜ ๊ฐ์ฒด์— ๋‹ค๋ฅธ ์ข…๋ฃŒ์ž๊ฐ€์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์˜ ๊ฐ์ฒด์— ์˜ํ•ด ๊ตฌํ˜„ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋งŒ๋‚œ ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” https://appscode.com/products/stash/ ์ž…๋‹ˆ๋‹ค.

stash-operator ๋ฐฐ์น˜์—์„œ ์„œ๋น„์Šค ํ•  ์ผ๋ถ€ CRD์— ์ข…๋ฃŒ์ž๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ stash-operator๊ฐ€ ์ด๋ฏธ ์‚ญ์ œ๋˜์—ˆ์œผ๋ฏ€๋กœ ํ•ด๋‹น CRD์—์„œ ์ข…๋ฃŒ ์ž ํ‘œ์‹œ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ์—†์œผ๋ฉฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ข…๋ฃŒ์ž๋ฅผ ํŒจ์น˜ (๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๊ฐœ์ฒด)ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•˜๊ฒŒ ํ˜„๋ช…ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์ดํ•ด๊ฐ€ ๋˜๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ ํ•ด๋‹น ์ข…๋ฃŒ์ž๋ฅผ ํŒจ์น˜ (๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ•ด๋‹น ๊ฐœ์ฒด)ํ•˜๋Š” ๊ฒƒ์ด ์œ ์ผํ•˜๊ฒŒ ํ˜„๋ช…ํ•œ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

์˜ณ์€. "๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์‚ญ์ œ"์ •๋ฆฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์ด์— ๋ฐ˜๋Œ€ํ•˜์ง€ ์•Š์ง€๋งŒ ๋งํฌ ๋œ ๋ฌธ์„œ๊ฐ€ ์•ˆ๋‚ดํ•˜๋Š” ๋‚ด์šฉ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ spec.finalizer๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

๋จผ์ € ์ž‘์€ ์ปคํ”ผ๋ฅผ ๋งˆ์‹œ๊ณ  ๊ธด์žฅ์„ ํ’€๊ณ  ์ด์ œ k8s ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜์‹ญ์‹œ์˜ค.

kubectl ํด๋Ÿฌ์Šคํ„ฐ ์ •๋ณด
Kubernetes ๋งˆ์Šคํ„ฐ๋Š” https : // localhost : 6443์—์„œ ์‹คํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค.
KubeDNS๋Š” https : // localhost : 6443 / api / v1 / namespaces / kube-system / services / kube- dns : dns / proxy์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.
ํด๋Ÿฌ์Šคํ„ฐ ๋ฌธ์ œ๋ฅผ ์ถ”๊ฐ€๋กœ ๋””๋ฒ„๊ทธํ•˜๊ณ  ์ง„๋‹จํ•˜๋ ค๋ฉด 'kubectl cluster-info dump'๋ฅผ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค.

์ด์ œ kube-proxy๋ฅผ ์‹คํ–‰ํ•˜์‹ญ์‹œ์˜ค.
kubectl ํ”„๋ก์‹œ ๋ฐ
127.0.0.1:8001์— ๊ฒŒ์žฌ ์‹œ์ž‘
๋‚˜์ค‘์— ์‚ญ์ œํ•˜๋ ค๋ฉด ID๋ฅผ ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. :)

  1. ์‚ญ์ œํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•œ ์ด๋ฆ„ ๊ณต๊ฐ„์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. :) ์šฐ๋ฆฌ์—๊ฒŒ๋Š” ๊ฐ€์ถ• ์‹œ์Šคํ…œ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
    kubectl get ns
    ๊ฐ€์ถ• ์‹œ์Šคํ…œ ์ข…๋ฃŒ 1d

ํŒŒ์ผ์— ๋„ฃ์–ด

  1. kubectl get namespace cattle-system -o json> tmp.json

ํŒŒ์ผ ํŽธ์ง‘ ๋ฐ ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ
},
"spec": {
"์ข…๋ฃŒ ์ž": [
"์ฟ  ๋ฒ ๋ฅด๋„ค ํ…Œ์Šค"
]
},
ํŽธ์ง‘ ํ›„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค ๐Ÿ‘
},
"spec": {
"์ข…๋ฃŒ ์ž": [
]
},
๊ฑฐ์˜ ๋‹ค ์™”์–ด์š” ๐Ÿ‘
curl -k -H "Content-Type : application / json"-X PUT --data-binary @ tmp.json http://127.0.0.1 : 8001 / api / v1 / namespaces / $ {NAMESPACE} / finalize

๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค ๐Ÿ‘

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•˜์—ฌ NS์—์„œ ์‚ญ์ œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์œผ์‹ญ์‹œ์˜ค.

  • apiservice๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์–ด ๋ฆฌ์†Œ์Šค๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธ : kubectl get apiservice|grep False
  • kubectl api-resources --verbs=list --namespaced -o name | xargs -n 1 kubectl get -n $your-ns-to-delete ๋ฅผ ํ†ตํ•ด ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋Š” ๋ชจ๋“  ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ (Kudos์—์„œ Jordan๊นŒ์ง€)

์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์€ ์ •๋ฆฌ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๋‹จ๋ฝ์‹œํ‚ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ •๋ฆฌ๊ฐ€ ์„ฑ๊ณตํ•˜์ง€ ๋ชปํ•˜๊ฒŒํ•˜๋Š” ์›์ธ์„ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–˜๋“ค ์•„! @alvaroaleman์ด ์ œ๊ณตํ•˜๋Š” ํŒ์„ ์žˆ๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ํ•˜๋“œ ์‚ญ์ œํ•˜๊ธฐ ์ „์— ๊นจ๋—ํ•œ ์‚ญ์ œ ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ 

https://github.com/thyarles/knsk ์Šคํฌ๋ฆฝํŠธ์˜ ๊ธฐ๋Šฅ :

  1. ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” apiresources๋ฅผ ํ™•์ธํ•˜๊ณ  ์‚ญ์ œ ์š”์ฒญ
  2. ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ ๋ณด๋ฅ˜์ค‘์ธ ๋ฆฌ์†Œ์Šค๋ฅผ ํ™•์ธํ•˜๊ณ  ์‚ญ์ œ ์š”์ฒญ
  3. ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ Kubernetes๊ฐ€ ์™„์ „ ์‚ญ์ œ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š”์ง€ ํ™•์ธํ•˜๋ ค๋ฉด ์•ฝ 5 ๋ถ„ ์ •๋„ ๊ธฐ๋‹ค๋ฆฌ์‹ญ์‹œ์˜ค.
  4. ๊ณ ์ • ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๊ฐ•์ œ ์‚ญ์ œ

๋„์›€์ด ๋˜์—ˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

@thyarles ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

$ kubectl get apiservices๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด $ kubectl delete apiservice [service-name]์— ์˜ํ•ด false๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” 3 ๊ฐœ์˜ apiservices, v1beta1.admission.certmanager.k8s.io, v1beta1.metrics.k8s.io ๋ฐ v1beta1.webhook.certmanager.k8s.io๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฉ”ํŠธ๋ฆญ apiserver๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์œผ๋ฉด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋‹ค์†Œ ์†์ƒ๋˜์—ˆ์œผ๋ฉฐ APIService๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๊ทผ๋ณธ ์›์ธ์ด ์‹ค์ œ๋กœ ํ•ด๊ฒฐ๋˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@lavalamp ๋ฉ”ํŠธ๋ฆญ์€ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” apiservice์ž…๋‹ˆ๋‹ค.

์˜ˆ, ์ด๋Š” ๋ฉ”ํŠธ๋ฆญ apiserver๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, HPA๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ์—์„œ ์ž‘๋™ํ•˜์ง€ ์•Š๊ณ  ๋‹ค๋ฅธ ๊ฒƒ๋“ค๋„ ์ž‘๋™ํ•˜์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ. HPA๋Š” ์ง€๊ธˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธก์ • ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@thyarles ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์˜ ๋ฐฉ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

$ kubectl get apiservices๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์„œ๋น„์Šค๋ฅผ ํ™•์ธํ•˜๊ณ , ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์„œ๋น„์Šค๋ฅผ ์‚ญ์ œํ•˜๋ฉด $ kubectl delete apiservice [service-name]์— ์˜ํ•ด false๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๊ทธ ํ›„์—๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ์— ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ ํŒ€์—๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” 3 ๊ฐœ์˜ apiservices, v1beta1.admission.certmanager.k8s.io, v1beta1.metrics.k8s.io ๋ฐ v1beta1.webhook.certmanager.k8s.io๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

@ xzhang007 ๊ธฐ๋ป์š”! ์ด์ œ v1beta1.metrics.k8s.io๊ฐ€ ์†์ƒ๋œ ์ด์œ ๋ฅผ ํ™•์ธํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ๋˜๋Š”์ง€ ํ™•์ธํ•˜์„ธ์š” :

```
$ kubectl -n kube-system ๋ชจ๋‘ ๊ฐ€์ ธ ์˜ค๊ธฐ | grep ๋ฉ”ํŠธ๋ฆญ

pod / metrics-server-64f74f8d47-r5vcq 2/2 ์‹คํ–‰ 9119d
service / metrics-server ClusterIP xx.xx.xx.xx443 / TCP 201d
deployment.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 00 201d
replicaset.apps / metrics-server-64f74f8d471111119d
replicaset.apps / metrics-server-686789bb4b 000145d''`

$ kubectl -n kube-system ๋ชจ๋‘ ๊ฐ€์ ธ ์˜ค๊ธฐ | grep ๋ฉ”ํŠธ๋ฆญ

pod / metrics-server-5dcfd4dd9f-m2v9k 1/1 ์‹คํ–‰ ์ค‘ 0 2d20h

service / metrics-server ClusterIP xx.xx.xx.xx443 / TCP 27 ์ผ

deployment.apps / metrics-server 1/1 1 1 27d

replicaset.apps / metrics-server-5dcfd4dd9f 11 1 27d
replicaset.apps / metrics-server-7fcf9cc98b 00027d

์˜ˆ. HPA๋Š” ์ง€๊ธˆ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ธก์ • ํ•ญ๋ชฉ์„ ์‚ญ์ œํ•˜๊ณ  ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์•„์„œ๋Š” ์•ˆ๋ฉ๋‹ˆ๋‹ค.

@ xzhang007 ์‚ฌ์‹ค ๋ฌธ์ œ๋ฅผ ๋ฐœ๊ฒฌํ•˜๊ธฐ ์ „์—๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค .... ์‚ญ์ œ ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋ฉˆ์ถค ๋ชจ๋“œ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๊ธˆ ์•Œ์•„ ์ฐจ ๋ ธ์Šต๋‹ˆ๋‹ค. helm ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”ํŠธ๋ฆญ ์„œ๋ฒ„๋ฅผ ๋‹ค์‹œ ๋ฐฐํฌํ•˜๊ฑฐ๋‚˜ ๋‹ค์Œ ๋ช…๋ น์„ ํ˜ธ์ถœํ•˜์—ฌ ์ˆ˜์ •ํ•˜์‹ญ์‹œ์˜ค ( ์ ์šฉํ•˜๊ธฐ ์ „์— ๋ฐฐํฌ ํŒŒ์ผ ํ™•์ธ ).

$ curl https://raw.githubusercontent.com/kubernetes/kubernetes/master/cluster/addons/metrics-server/metrics-server-deployment.yaml | kubectl apply -f -

@slassh ์†”๋ฃจ์…˜์€ Kubernetes 1.15์—์„œ ์ €์—๊ฒŒ

v1beta1.metrics.k8s.io APIService ์‚ญ์ œ

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

์ธ์ฆ์„œ ๊ด€๋ฆฌ์ž๊ฐ€ ์ž˜๋ชป ์„ค์ • ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ˆ˜์‹  ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ž˜๋ชป๋œ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ

"certmanager.k8s.io/cluster-issuer": "letsencrypt-prod"

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€

"cert-manager.io/cluster-issuer": "letsencrypt-prod"

์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋กํ•ฉ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ์•ž์„œ kubectl replace --raw ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ kubectl์— ์˜ํ•ด ๋…ธ์ถœ๋˜์ง€ ์•Š์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ค ๋ฒ„์ „์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด kubectl proxy ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ ํ•  ํ•„์š”๊ฐ€์—†๊ณ  curl ์™€์˜ ์ข…์†์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (busybox์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ). ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์—ฌ๊ธฐ์— ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

kubectl get namespace "stucked-namespace" -o json \
            | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
            | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -

์ด๊ฒƒ์ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๊ฐ€ ํ™•์ธ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ํ•ดํ‚ค ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ ์ค‘ ๋ˆ„๊ตฌ๋„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค ....
EKS v1.14 ํด๋Ÿฌ์Šคํ„ฐ์— ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ํ•ด๊ฒฐ ๊ฐ€๋Šฅํ•œ ๋ฌธ์ œ์ธ์ง€ ์—ฌ๋ถ€๊ฐ€ ํ™•์ธ ๋˜์—ˆ์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์—๋Š” ๋งŽ์€ ํ•ดํ‚ค ์†”๋ฃจ์…˜์ด ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ ์ค‘ ๋ˆ„๊ตฌ๋„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

๊ทผ๋ณธ์ ์ธ ๋ฌธ์ œ๋Š” ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ง‘๊ณ„ ๋œ API ๊ทธ๋ฃน์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ์„ ๋•Œ๊นŒ์ง€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์ •๋ฆฌ ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ฐจ๋‹จ๋˜์–ด ๋ชจ๋“  API ๊ทธ๋ฃน์˜ ๋ชจ๋“  ๋ฆฌ์†Œ์Šค๊ฐ€ ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋Œ€ํ•ด ์ •๋ฆฌ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

API๋ฅผ ์ปฌ๋งํ•˜๋ ค๋Š” ppl์˜ ๊ฒฝ์šฐ :

# 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

๋‹ค์Œ์€์ด ์ž‘์—…์„ ์ž๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ์ž…๋‹ˆ๋‹ค. 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

๋ชจ๋‘ : ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด์ต๋ณด๋‹ค ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค . ๊ทธ๋“ค์€ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ง‘๊ณ„ ๋œ apiserver (s)์— ์‹œ๊ฐ„ ํญํƒ„์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ๊ฐ‘์ž๊ธฐ ์˜ค๋ž˜๋œ ๊ฐœ์ฒด๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ 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.

๋ชจ๋‘ : ์ข…๋ฃŒ ์ž ์ œ๊ฑฐ๋ฅผ ์ž๋™ํ™”ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๋Š” ์ด์ต๋ณด๋‹ค ํ•ด๋ฅผ ๋ผ์นฉ๋‹ˆ๋‹ค . ๊ทธ๋“ค์€ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” ์ง‘๊ณ„ ๋œ apiserver (s)์— ์‹œ๊ฐ„ ํญํƒ„์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ๋‹ค์‹œ ๋งŒ๋“ค๋ฉด ๊ฐ‘์ž๊ธฐ ์˜ค๋ž˜๋œ ๊ฐœ์ฒด๊ฐ€ ๋‹ค์‹œ ๋‚˜ํƒ€๋‚  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ค์ œ ์†”๋ฃจ์…˜์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

$ 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

์ด ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋“  ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๊ณ ์•„ ๋ฆฌ์†Œ์Šค ์ฐพ๊ธฐ๋ฅผ ํฌํ•จํ•˜์—ฌ ์™„์ „ํ•œ ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์œ„ํ—˜์„ ๊ฐ์ˆ˜ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์Šคํฌ๋ฆฝํŠธ๋Š” ๊ถŒ์žฅ๋˜์ง€ ์•Š๋Š” ์‚ญ์ œ ๋ฐฉ๋ฒ•์„ ์ˆ˜ํ–‰ํ•˜๋Š” --force ์˜ต์…˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์˜คํƒ€, apiservices ์—ฌ์•ผ ํ•จ

์ด ๋ช…๋ น์€ ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” API๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

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

์ด ๊ธฐ์‚ฌ๋Š” ํ™•์‹คํžˆ ๋‹น์‹ ์—๊ฒŒ ์œ ์šฉ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

https://access.redhat.com/solutions/5038511

์‹ค์ œ๋กœ ์กด์žฌํ•˜๋Š” ๊ฒƒ์€ apiservices์˜ ์ถฉ๋Œ์ด๋ฉฐ openshift์—์„œ API์˜ ์ƒํƒœ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

oc get apiservices -o = custom-columns = " name : .metadata.name , status : .status.conditions [0] .status"

์‹คํŒจํ•œ api๋Š” ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๋ฅผ ์‹œ๋„ํ•œ ํ›„ ํ•ด๋‹น API์— ์†ํ•œ ํฌ๋“œ ๋˜๋Š” ๋ฐฐํฌ๋ฅผ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜์—ฌ ๋‹ค์‹œ ์‹œ์ž‘ํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.

$ oc namspace ์‚ญ์ œ

๊ทธ๋ฆฌ๊ณ  ์ค€๋น„, ์‚ฌ์—… ๊ณ ์ • !!

๋ชจ๋“  ์‚ฌ๋žŒ์ด ์˜์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜๋Š” ๊ณณ์—์„œ ์ž์‹ ์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ก€ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Ž

๋ชจ๋‘๊ฐ€ ์˜์–ด๋กœ ๋งํ•˜๋Š” ๋ฐ ๋™์˜ํ•˜๋Š” ๊ณณ์€ ์–ด๋””์ž…๋‹ˆ๊นŒ?

2020 ๋…„ 4 ์›” 30 ์ผ ๋ชฉ์š”์ผ 17:58 theAkito [email protected] ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋ชจ๋‘๊ฐ€ ์ž์‹ ์˜ ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๋ฌด๋ก€ํ•ฉ๋‹ˆ๋‹ค.
์˜์–ด๋กœ ๋งํ•˜๋Š” ๊ฒƒ์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ‘Ž

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-622137770 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/ALGMKB6K4OU4X3XOYMALOBLRPHYCDANCNFSM4ETUOEPA
.

>

Chris, ์ˆ˜์„ ์•„ํ‚คํ…ํŠธ @ brace.ai

-

๊ธฐ๋ฐ€ ์œ ์ง€ ๊ณ ์ง€ :์ด ์ด๋ฉ”์ผ์€
์˜๋„ ๋œ ์ˆ˜์‹ ์ž๋ฅผ ํฌํ•จ ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ธฐ๋ฐ€, ๋…์  ๋˜๋Š”
ํŠน๊ถŒ ์ •๋ณด. ๊ท€ํ•˜๊ฐ€ ์˜๋„ ๋œ ์ˆ˜์‹ ์ž๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
์‚ฌ์šฉ, ๊ฒ€ํ† , ์œ ํฌ, ๋ณต์‚ฌ ๋˜๋Š” ์ทจํ•ด์ง„ ์กฐ์น˜๋ฅผ
์ด ๋ฉ”์‹œ์ง€ ๋˜๋Š” ์ฒจ๋ถ€ ํŒŒ์ผ (์žˆ๋Š” ๊ฒฝ์šฐ)์—์„œ ๊ธˆ์ง€๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด
์›ํ•˜๋Š” ์ˆ˜์‹ ์ž์—๊ฒŒ ํšŒ์‹  ์ด๋ฉ”์ผ๋กœ ๋ณด๋‚ธ ์‚ฌ๋žŒ์—๊ฒŒ ์—ฐ๋ฝํ•˜์‹ญ์‹œ์˜ค.
์›๋ณธ ๋ฉ”์‹œ์ง€์˜ ๋ชจ๋“  ์‚ฌ๋ณธ๊ณผ ์ฒจ๋ถ€ ํŒŒ์ผ์„ ํŒŒ๊ธฐํ•˜๊ฑฐ๋‚˜ ์‚ญ์ œํ•ฉ๋‹ˆ๋‹ค.

์ค€๋น„, ์‹ค๋ก€ํ•ฉ๋‹ˆ๋‹ค. ์†๋„ ๋•Œ๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค๊ตญ์–ด ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋„๊ตฌ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ตญ์ œํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์—ฌ๊ธฐ github์—์„œ ์นœ์ ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•ˆ๋…•ํ•˜์„ธ์š”.

์ด ๋ฌธ์ œ์—์„œ ์•ž์„œ kubectl replace --raw ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ kubectl์— ์˜ํ•ด ๋…ธ์ถœ๋˜์ง€ ์•Š์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ค ๋ฒ„์ „์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด kubectl proxy ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ ํ•  ํ•„์š”๊ฐ€์—†๊ณ  curl ์™€์˜ ์ข…์†์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (busybox์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ). ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์—ฌ๊ธฐ์— ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

kubectl get namespace "stucked-namespace" -o json \
            | tr -d "\n" | sed "s/\"finalizers\": \[[^]]\+\]/\"finalizers\": []/" \
            | kubectl replace --raw /api/v1/namespaces/stucked-namespace/finalize -f -

์ด๊ฒƒ์€ ์™„๋ฒฝํ•˜๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๋Š” ๋‹ค๊ตญ์–ด ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋„๊ตฌ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ตญ์ œํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์—ฌ๊ธฐ github์—์„œ ์นœ์ ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ๋‹ค๊ตญ์–ด ์‚ฌ์šฉ์ž ๊ธฐ๋ฐ˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ๋„๊ตฌ ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๊ตญ์ œํ™”๋˜์ง€ ์•Š์€ ๊ฒƒ์€ ์ถฉ๋ถ„ํžˆ ๋‚˜์ฉ๋‹ˆ๋‹ค. ์ ์–ด๋„ ์—ฌ๊ธฐ github์—์„œ ์นœ์ ˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์•„์ง๋„ ์ดํ•ดํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค. ์šฉ์„œ ํ•ด์ค˜. ์‹ค์ˆ˜๋กœ ์‹ซ์–ด์š”๋ฅผ ํด๋ฆญํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์˜ˆ, ์‹ค์ œ๋กœ ๋„๊ตฌ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์ˆ˜ํ–‰๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์„ค๋ช…์—†์ด ์—„์ง€ ์†๊ฐ€๋ฝ์„ ๋‚ด๋ฆฌ๋Š” ๊ฒƒ์€ ๋ง์ด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฑฐ์˜ ํ•ญ์ƒ์ด ๋ฌธ์ œ๋ฅผ ๊ฒฝํ—˜ํ•  ๋•Œ CRD์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ CRD๋ฅผ ์‚ญ์ œ ํ•œ ๋‹ค์Œ ์ข…๋ฃŒ ์ž ๋ฐ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๋ฅผ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ์—์„œ ์•ž์„œ kubectl replace --raw ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜์žˆ๋Š” ์ตœ์‹  ๋ฒ„์ „์˜ kubectl์„ ์‚ฌ์šฉํ•˜์—ฌ kubectl์— ์˜ํ•ด ๋…ธ์ถœ๋˜์ง€ ์•Š์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ข…๋ฃŒํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค (์–ด๋–ค ๋ฒ„์ „์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Œ). ์ด๋ ‡๊ฒŒํ•˜๋ฉด kubectl proxy ํ”„๋กœ์„ธ์Šค๋ฅผ ์ƒ์„ฑ ํ•  ํ•„์š”๊ฐ€์—†๊ณ  curl ์™€์˜ ์ข…์†์„ฑ์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (busybox์™€ ๊ฐ™์€ ์ผ๋ถ€ ํ™˜๊ฒฝ์—์„œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ). ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์„ ๋„์šธ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ผ๋ฉฐ ๋‚˜๋Š” ์ด๊ฒƒ์„ ์—ฌ๊ธฐ์— ๋‚จ๊ฒผ์Šต๋‹ˆ๋‹ค.

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 ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ์ด๊ฒƒ์€ ๋งˆ์นจ๋‚ด ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค!

๋•Œ๋กœ๋Š” ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์˜จ๋ผ์ธ์œผ๋กœ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฆ‰, finalizers ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ €์žฅํ•˜์‹ญ์‹œ์˜ค).
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น์„ ์‹คํ–‰ ํ•œ ํ›„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

namespace ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

kubectl edit annoying-ns ์‚ฌ์šฉํ•˜์—ฌ ์ข…๋ฃŒ ์ž ์ค„์„ ์ œ๊ฑฐํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ  ... ๋‚˜๋Š” ์ง€๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :)
์˜ค๋Š˜ ์ €๋Š” 1.15์—์„œ 1.16์œผ๋กœ eks ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ฐœ๋ฐœ ns "configcluster"๋Š” ์ผ์ข…์˜ "์†์ƒ"์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

k ns configcluster ์‚ญ์ œ
....
์ด์ œ ์ด๊ฒƒ์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค (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

๋ฐœ ๋ฌธ์ œ์—์„œ์ด ๊ฐ€์‹œ์— ๋” ๋งŽ์ด ๋…ธ์ถœ๋˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

2020 ๋…„ 6 ์›” 19 ์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 4:46 Andreas Hรถhmann [email protected]
์ผ๋‹ค :

ํ  ... ๋‚˜๋Š” ์ง€๊ธˆ์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค :)
์˜ค๋Š˜ ์ €๋Š” 1.15์—์„œ 1.16์œผ๋กœ eks ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.
์ง€๊ธˆ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ๊ดœ์ฐฎ์•„ ๋ณด์ž…๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ๊ฐœ๋ฐœ ns "configcluster"๋Š” ์ผ์ข…์˜ "์†์ƒ"์ด์—ˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์ •๋ฆฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

k ns configcluster ์‚ญ์ œ
....
์ด์ œ ์ด๊ฒƒ์€ ์ค‘๋‹จ๋ฉ๋‹ˆ๋‹ค (3h +) : /

$ kubectl get namespace configcluster -o yaml
apiVersion : v1
์ข…๋ฅ˜ : ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค
๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ :
์ฃผ์„ :
kubectl.kubernetes.io/last-applied-configuration : |
{ "apiVersion": "v1", "kind": "Namespace", "metadata": { "annotations": {}, "name": "configcluster"}}
creationTimestamp : "2020-06-19T06 : 40 : 15Z"
deleteTimestamp : "2020-06-19T09 : 19 : 16Z"
์ด๋ฆ„ : configcluster
resourceVersion : "22598109"
selfLink : / api / v1 / namespaces / configcluster
uid : e50f0b53-b21e-4e6e-8946-c0a0803f031b
ํˆฌ๊ธฐ:
์ข…๋ฃŒ ์ž :

  • Kubernetes
    ์ƒํƒœ:
    ์ •ํ™ฉ:
  • lastTransitionTime : "2020-06-19T09 : 19 : 21Z"
    ๋ฉ”์‹œ์ง€ : '์ผ๋ถ€ ๊ทธ๋ฃน์— ๋Œ€ํ•œ ๊ฒ€์ƒ‰ ์‹คํŒจ, 1 ๊ฐœ ์‹คํŒจ : ๊ฒ€์ƒ‰ ํ•  ์ˆ˜ ์—†์Œ
    ์„œ๋ฒ„ API์˜ ์ „์ฒด ๋ชฉ๋ก : metrics.k8s.io/v1beta1 : ์„œ๋ฒ„๋Š” ํ˜„์žฌ
    ์š”์ฒญ์„ ์ฒ˜๋ฆฌ ํ•  ์ˆ˜ โ€‹โ€‹์—†์Šต๋‹ˆ๋‹ค. '
    ์ด์œ  : DiscoveryFailed
    ์ƒํƒœ : "์ฐธ"
    ์œ ํ˜• : NamespaceDeletionDiscoveryFailure
  • lastTransitionTime : "2020-06-19T09 : 19 : 22Z"
    ๋ฉ”์‹œ์ง€ : ๋ชจ๋“  ๋ ˆ๊ฑฐ์‹œ kube ์œ ํ˜•์ด ์„ฑ๊ณต์ ์œผ๋กœ ํŒŒ์‹ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ์ด์œ  : ParsedGroupVersions
    ์ƒํƒœ : "False"
    ์œ ํ˜• : NamespaceDeletionGroupVersionParsingFailure
  • lastTransitionTime : "2020-06-19T09 : 19 : 22Z"
    ๋ฉ”์‹œ์ง€ : ๋ชจ๋“  ์ฝ˜ํ…์ธ ๊ฐ€ ์„ฑ๊ณต์ ์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    ์ด์œ  : ContentDeleted
    ์ƒํƒœ : "False"
    ์œ ํ˜• : NamespaceDeletionContentFailure
    ๋‹จ๊ณ„ : ์ข…๋ฃŒ

โ€”
๋Œ“๊ธ€์„ ๋‹ฌ์•˜ ๊ธฐ ๋•Œ๋ฌธ์— ์ˆ˜์‹  ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธํ•˜์„ธ์š”.
https://github.com/kubernetes/kubernetes/issues/60807#issuecomment-646543073 ,
๋˜๋Š” ๊ตฌ๋… ์ทจ์†Œ
https://github.com/notifications/unsubscribe-auth/AFLKRCLHIZ77X2Z3F5GAOCTRXMXVTANCNFSM4ETUOEPA
.

@bobhenkel ์ž˜์ด ๋ฌธ์ œ๋Š” ์ข…๊ฒฐ๋˜์—ˆ์œผ๋ฏ€๋กœ ์‹ค์ œ๋กœ ์ด๊ฒƒ์€ ๋ฌธ์ œ๊ฐ€ ์—†์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค (์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ํ•ญ๋ชฉ์— ๊ด€ํ•œ ํ•œ). ์œ ์‚ฌํ•œ ์ƒํ™ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹ค์งˆ์ ์ธ ๋„์›€์ด ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์œ„์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์ฝ์œผ์‹ญ์‹œ์˜ค. ๊ฑฐ๊ธฐ์— ์ข‹์€ ์กฐ์–ธ (๋ฐ ์ผ๋ถ€ ๋‚˜์œ ์กฐ์–ธ)์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ œ ๊ฒฝ์šฐ์—๋Š” GCP ๋„คํŠธ์›Œํฌ ์„œ๋น„์Šค ์ฝ˜์†”์—์„œ ์ธ ๊ทธ๋ ˆ์Šค ๋ถ€ํ•˜ ๋ถ„์‚ฐ๊ธฐ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์‚ญ์ œํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ˜์†”์—์„œ ์ง์ ‘๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ํ”„๋ŸฐํŠธ ์—”๋“œ๋ฅผ ์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ์˜ ์ƒํƒœ๊ฐ€ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ ์ƒํƒœ์™€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— Kubernetes๊ฐ€ ์‚ญ์ œ๋ฅผ ์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ ์ฃผ์„์„ ์‚ฌ์šฉํ•˜์—ฌ ์ˆ˜์‹  ํ”„๋ŸฐํŠธ ์—”๋“œ ์ƒ์„ฑ์„ ์ž๋™ํ™”ํ•˜๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋•Œ๋กœ๋Š” ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์˜จ๋ผ์ธ์œผ๋กœ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฆ‰, finalizers ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ €์žฅํ•˜์‹ญ์‹œ์˜ค).
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น์„ ์‹คํ–‰ ํ•œ ํ›„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

namespace ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋‹น์‹ ์€ ๊ทธ๊ฒƒ์ด ์ผํ•œ ์Šคํƒ€์ž…๋‹ˆ๋‹ค

๋•Œ๋กœ๋Š” ๋ฆฌ์†Œ์Šค ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์˜จ๋ผ์ธ์œผ๋กœ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค (์ฆ‰, finalizers ํŒŒ์ผ์„ ์ œ๊ฑฐํ•˜๊ณ  ์ €์žฅํ•˜์‹ญ์‹œ์˜ค).
๊ทธ๋ž˜์„œ ๋‚˜๋Š” ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๋กœ๋ถ€ํ„ฐ ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ•์„ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋ช…๋ น์„ ์‹คํ–‰ ํ•œ ํ›„ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์—†์–ด์•ผํ•ฉ๋‹ˆ๋‹ค.

namespace ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๋ฆฌ์†Œ์Šค๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์†”๋ฃจ์…˜์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์ด๊ฒƒ์€ ์ •๋ง๋กœ "ํ—ˆ์šฉ๋˜๋Š”"๋Œ€๋‹ต์ด์–ด์•ผํ•ฉ๋‹ˆ๋‹ค .์ด ๋ฌธ์ œ์˜ ๊ทผ์› ์ด ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค!

์œ„์˜ ๋งํฌ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ํŠนํžˆ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์•„๋‹™๋‹ˆ๋‹ค.

์˜ค๋Š˜ ๋‚˜๋Š” ๊ฐ™์€ ๋ฌธ์ œ์— ๋“ค์–ด๊ฐ”๋‹ค. ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋ฉด ๋‹ค์–‘ํ•œ ์ƒํƒœ์—์„œ ๋‚จ์€ ์Œ์‹์ด ๋‚จ๊ฒŒ๋ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ ์‚ญ์ œ๋ฅผ ์™„์ „ํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ฐพ์•„์•ผํ•ฉ๋‹ˆ๋‹ค.

https://github.com/kubernetes/kubernetes/issues/60807#issuecomment -524772920์„ ์ฐธ์กฐ

(๋˜ํ•œ ๋ถˆํ–‰ํžˆ๋„ 'kubetctl get all'์€ ๋ชจ๋“  ๊ฒƒ์„๋ณด๊ณ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งํฌ์—์„œ์™€ ๊ฐ™์€ ์œ ์‚ฌํ•œ ๋ช…๋ น์„ ์‚ฌ์šฉํ•ด์•ผํ•ฉ๋‹ˆ๋‹ค.)

๋‚ด ์‚ฌ๋ก€- 'cert-manager'๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ. 'kubectl get apiservice -o yaml'์˜ ์ถœ๋ ฅ์—์„œ โ€‹โ€‹status = False ์ธ APIService 'v1beta1.admission.certmanager.k8s.io'๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด apiservice๋Š” ๋ฐฉ๊ธˆ ์‚ญ์ œ ํ•œ cert-manager์˜ ์ผ๋ถ€์˜€์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 'kubectl delete apiservice v1beta1.admission.certmanager.k8s.io'ํ›„ 10 ์ดˆ ๋งŒ์— ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์‚ฌ๋ผ์กŒ์Šต๋‹ˆ๋‹ค.

๋„์›€์ด๋˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.


์ฆ‰, Terminating ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋งค์‹œ๊ฐ„ CronJob์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/oze4/service.remove-terminating-namespaces

์ €๋Š” Terminating ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋งค์‹œ๊ฐ„ CronJob์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/oze4/service.remove-terminating-namespaces

๋˜ ๋‹ค๋ฅธ 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

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ • ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์™œ ๋ถ™์–ด ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์ด์œ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” API ์„œ๋น„์Šค๊ฐ€์žˆ์–ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋„๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ๋Š” Knative๋ฅผ ์ œ๋Œ€๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

$ kubectl get apiservice|grep False
NAME                                   SERVICE                             AVAILABLE   AGE
v1beta1.custom.metrics.k8s.io          knative-serving/autoscaler          False (ServiceNotFound)   278d

๊ทธ๊ฒƒ์„ ์‚ญ์ œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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  

์ €๋Š” Terminating ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ž๋™์œผ๋กœ ์‚ญ์ œํ•˜๋Š” ๋งค์‹œ๊ฐ„ CronJob์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ž‘์€ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/oze4/service.remove-terminating-namespaces

์ž˜ ํ–ˆ์–ด.

๋‚˜๋Š” ๋žฉ k8s ํด๋Ÿฌ์Šคํ„ฐ์˜ 1.18์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ  ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์„ ๋•๊ธฐ ์œ„ํ•ด ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋ฉ”ํŠธ๋ฆญ API์™€ ํŠนํžˆ ์‚ฌ์šฉ์ž ์ง€์ • ๋ฉ”ํŠธ๋ฆญ์œผ๋กœ ์ž‘์—…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•ด๋‹น k8s ๊ฐ์ฒด๋ฅผ ์‚ญ์ œ ํ•œ ํ›„ ๋ฉ”ํŠธ๋ฆญ API ์—”๋“œ ํฌ์ธํŠธ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค๋Š” ์˜ค๋ฅ˜์™€ ํ•จ๊ป˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค ์‚ญ์ œ๊ฐ€ ์ค‘๋‹จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋‹ค๋ฅธ ์ด๋ฆ„ ๊ณต๊ฐ„์— ๋„ฃ์œผ๋ฉด ๋ชจ๋“  ๊ฒƒ์ด ์ฆ‰์‹œ ์ •๋ฆฌ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ 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

๋˜ ๋‹ค๋ฅธ 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

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ์ • ๋œ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ํ•ด๊ฒฐ์ฑ…์ด ์•„๋‹™๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์€ ์™œ ๋ถ™์–ด ์žˆ๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ์ด์œ ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜์—†๋Š” API ์„œ๋น„์Šค๊ฐ€์žˆ์–ด ํด๋Ÿฌ์Šคํ„ฐ๊ฐ€ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•˜๋„๋กํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๊ธฐ์—์„œ๋Š” Knative๋ฅผ ์ œ๋Œ€๋กœ ์‚ญ์ œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

$ kubectl get apiservice|grep False
NAME                                   SERVICE                             AVAILABLE   AGE
v1beta1.custom.metrics.k8s.io          knative-serving/autoscaler          False (ServiceNotFound)   278d

๊ทธ๊ฒƒ์„ ์‚ญ์ œํ•˜๋ฉด ๋ฌธ์ œ๊ฐ€ ํ•ด๊ฒฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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  

ํ™•์‹คํžˆ ๊ฐ€์žฅ ๊นจ๋—ํ•œ ๋ผ์ด๋„ˆ! ์ด๋Ÿฌํ•œ "์†”๋ฃจ์…˜"์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์‹ค์ œ๋กœ ๊ทผ๋ณธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์€ ์—ฌ๊ธฐ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

๊ทธ๊ฒƒ์€ ๋ฉ”์‹œ์ง€๊ฐ€ ํผ์ ธ ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. : smile : "์•„์ง ๋‹ค๋ฅธ ํ•˜๋‚˜์˜ ๋ผ์ด๋„ˆ"๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๊ฐ€์žฅ ๊นจ๋—ํ•œ ํ•œ ๋ผ์ด๋„ˆ! ์ด๋Ÿฌํ•œ "์†”๋ฃจ์…˜"์ค‘ ์–ด๋Š ๊ฒƒ๋„ ์‹ค์ œ๋กœ ๊ทผ๋ณธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์ง€ ๋ชปํ•œ๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

์ด ์†”๋ฃจ์…˜์€ ๋ชจ๋“  ๊ฐ€๋Šฅ์„ฑ ์ค‘ ํ•˜๋‚˜๋ฅผ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๋ชจ๋“  ๊ทผ๋ณธ ์›์ธ์„ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๋ ค๋ฉด ๋‹ค์Œ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. https://github.com/thyarles/knsk

@thyarles ์•„์ฃผ ์ข‹์€!

modify finalize ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์‚ญ์ œํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

image

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๊ฐ€ ์ข…๋ฃŒ๋˜๋Š” ์›์ธ์„ ์ฐพ์œผ์‹ญ์‹œ์˜ค. ํ˜„์žฌ ์•Œ๋ ค์ง„ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

  • ํฌ๋“œ ์ข…๋ฃŒ
  • cert-manager webhook ๋ธ”๋ก secrte

๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

# 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"}

etcdctl ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‚ญ์ œ๋˜์ง€ ์•Š์€ ๋ฆฌ์†Œ์Šค๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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>

ํ„ฐ๋ฏธ๋„์— ๋ณต์‚ฌํ•˜์—ฌ ๋ถ™์—ฌ ๋„ฃ๊ธฐ ๋งŒํ•˜๋ฉด๋ฉ๋‹ˆ๋‹ค.

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

์ด๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ์ผํ–ˆ์œผ๋ฉฐ ns์— ๋งค๋‹ฌ๋ ค์žˆ๋Š” k8s ๊ฐ์ฒด๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•œ ํ›„ ์‹คํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌ!

Terminated์—์„œ ๋ฉˆ์ถ˜ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค๋ฅผ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ์ด๊ฒƒ์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ :

kubectl get namespace openebs -o json | jq -j '.spec.finalizers=null' > tmp.json 
kubectl replace --raw "/api/v1/namespaces/openebs/finalize" -f ./tmp.json

Terminating on Rancher ํŠน์ • ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค (์˜ˆ : ๊ฐ€์ถ• ์‹œ์Šคํ…œ)์—์„œ ๊ฐ‡ํžŒ ๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์— ๋ถ€๋”ชํžŒ ๋ชจ๋“  Google ์ง์›์—๊ฒŒ ๋‹ค์Œ ์ˆ˜์ • ๋œ ๋ช…๋ น (grebois์˜ ์›๋ณธ)์ด ์ €์—๊ฒŒ ํšจ๊ณผ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

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

์—ฌ๋Ÿฌ๋ถ„, ์ฐธ๊ณ ๋กœ,์ด kubecon ํ† ํฌ ์˜ ๋น„๋””์˜ค๊ฐ€ ๋‚˜์™”์„ ๋•Œ ๋‚˜๋Š” ๊ทธ๊ฒƒ๊ณผ ์œ„์˜ ์œ ์šฉํ•œ ๋Œ“๊ธ€ ์ค‘ ์ผ๋ถ€๋ฅผ ๋งํฌํ•˜๊ณ ์ด ๋ฌธ์ œ๋ฅผ ์ž ๊ธ€ ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ 10 ๋ถ„๊ฐ„์˜ ์„ค๋ช…์„ ๋…น์Œ ํ–ˆ๊ณ ์ด SIG Deep Dive ์„ธ์…˜ ์—์„œ ๋ฐœํ‘œํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์— 65 ๊ฐœ์˜ ์ฐฌ์„ฑ ์œผ๋กœ

์œ„์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์–ธ๊ธ‰ ๋œ์ด ์ค‘๊ฐ„ ๊ฒŒ์‹œ๋ฌผ ์€ ์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค. ๊นจ์ง„ API ์„œ๋น„์Šค๋ฅผ ์ฐพ์•„ ์ˆ˜์ •ํ•ฉ๋‹ˆ๋‹ค.

๋„ค์ž„ ์ŠคํŽ˜์ด์Šค์—์„œ ์ข…๋ฃŒ์ž๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๋ชจ๋“  ๋ผ์ด๋„ˆ ๋Š” ๊ทผ๋ณธ ์›์ธ์„ ํ•ด๊ฒฐํ•˜๊ณ  ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ๊นจ๋œจ๋ ค ๋‚˜์ค‘์— ๋ฌผ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ˆ ์ œ๋ฐœ ๊ทธ๋Ÿฌ์ง€ ๋งˆ์„ธ์š”. ๊ทผ๋ณธ ์›์ธ ์ˆ˜์ •์€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์Šค๋ ˆ๋“œ์— ๋งŽ์€ ์ •๋‹ต์ด ์žˆ์ง€๋งŒ ์‚ฌ๋žŒ๋“ค์ด์ด ํ…Œ๋งˆ์— ๋Œ€ํ•œ ๋ณ€ํ˜•์„ ๊ฒŒ์‹œํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ์ด ๋Œ“๊ธ€์ด ๋งจ ์•„๋ž˜์— ๋จธ๋ฌผ๋„๋กํ•˜๊ธฐ ์œ„ํ•ด ์ง€๊ธˆ ๋ฌธ์ œ๋ฅผ ์ž ๊ธ€ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
5 / 5 - 1 ๋“ฑ๊ธ‰