studybook
  • Introduction
  • 실무 하며 깨닫는 부분 정리
    • 옵션에 대해서
    • 코드 작성의 순서
    • 자바 프로그램에 문제가 생겼다면
    • 장애 대처법
  • Logstash, Beats 정리
  • Zookeeper 정리
  • Message Queue 정리
    • RabbitMQ 삽질
  • Java 관련 정리
    • Java Primitive Wrapper class
    • Java NIO
    • Java8 Double colon operator
    • Effective Java
      • 4장
      • 5장
      • 6장 - Enum, Annotation
      • 7장 - Method
      • 8장 - 프로그래밍 일반
      • 9장 - Exception
    • Java8 Lambda expression
    • JDBC
    • Linux에서 WatchService 이상동작
  • Spring 관련 정리
    • Spring Bean init, destroy 순서
    • Spring Async Controller
    • Spring Executable jar 웹 개발 및 배포
    • Spring Boot Font 배포 에러
    • Spring AOP
      • Spring AOP로 모든 Request 로그 남기기
    • Spring Cache
    • Spring Cloud
      • Consul로 spring 설정 관리하기
    • Spring Test
      • Spring Test DirtiesContext
      • Spring Test MockBean, SpyBean
      • Spring Test Dynamic @Scheduled
    • Spring JDBC
    • Spring Validation
    • Spring Transaction Management
      • Spring with JTA 삽질
    • Spring에서 효율적으로 Static resource 관리하기
    • Zuul을 사용해서 Spring Reverse proxy 만들기
    • Spring Security
    • 스프링 어노테이션이 안 먹힐 때 의심해볼만한 것
    • Spring Data
    • Spring Webflux
      • Tobi 강연
  • 코드 리팩토링
    • 한번에 하나씩
  • 지속적 통합 (CI)
    • Jenkins pipeline 삽질기
  • Log Aggregator 정리
    • Flume 테스트
    • Fluentd 테스트
  • Web Socket 정리
  • Akka
    • Actor 모델
    • Supervision
  • IE 8 대응 정리
  • 함수형 프로그래밍
    • 모나드
  • Netty
    • Netty 기본 예제
    • Netty 주요 특징
    • Netty 부트스트랩
    • Netty 채널 파이프라인, 코덱
    • Netty 이벤트 모델
    • Netty 바이트 버퍼
  • 스칼라 관련 정리
    • Maven으로 컴파일하기
    • Scala def 괄호 여부의 차이
    • 스칼라 function, method 차이점
    • ScalaTest와 Spring 연동하기
    • Programming in Scala
  • J2S 컨퍼런스
  • Android
    • 테스트
    • NDK
  • DDOS
  • HTTP
  • HttpClient
  • Container
    • Image 개요
    • cri-o
    • kata containers
    • Open Container Initiative Image
    • Buildkit
  • Github pages
  • Static Website
  • Webhook
  • Service Discovery Tools
    • Etcd
    • Eureka
    • Consul
      • ACL
    • 비교
  • React
    • JSX
    • React Element
    • Components, Props
    • State, Lifecycle
    • Handling Event
    • Flux
  • Vagrant
    • SSH 접속
  • Linux
    • Systemd
    • Alternatives
  • Messaging protocols
    • XMPP
    • AMQP
  • Windows
    • Windows10 내장 우분투에 ssh 클라이언트로 접속하기
    • Windows10 Hyper-V와 Virtual Box가 충돌을 일으켰을 때
    • Hyper-V 기반 docker에서 Shared Drives 설정 실패할 때
    • 윈도우 개발환경 설정
    • Docker desktop 없이 docker 환경 세팅하기
    • UWP 앱을 항상 관리자권한으로 실행하는 바로가기 만들기
  • Spring camp 2017
    • Project Reactive
    • 이벤트 소싱
    • CQRS
  • Spring webflux
  • 리액티브 프로그래밍
  • Linux Settings
    • 홈서버 백업 및 복구기
    • 홈서버 트러블슈팅
  • Kubernetes
    • k3s 설치 및 삽질
    • pod resources
    • Argo workflow
    • 트러블 슈팅
      • Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때
    • 쿠버네티스 마스터
    • Knative
    • Knative Pipeline
    • Aggrerated API server
    • Accessing the API
      • Authenticating
  • Sonarqube
  • HTTP/2
  • Go
    • Go Module
    • Go dependency injection
    • Go Error handling
    • Go in Action
      • 3장 패키지
      • 4장 배열, 슬라이스, 맵
      • 5장 GO의 타입 시스템
      • 6장 동시성
      • 7장 동시성 패턴
      • 8장 표준 라이브러리
      • 9장 테스트와 벤치마킹
    • Go Channel 사용법
  • Cloud Native
Powered by GitBook
On this page
  • 원인, 해결책 분석
  • 사용한 스크립트
  1. Kubernetes
  2. 트러블 슈팅

Kubernetes namespace의 phase가 Terminating에서 멈춰있을 때

원인, 해결책 분석

  1. custom finalizer가 정리되지 않는 케이스

    1. Namespace .spec.finalizers 내용을 확인했을 때 배열에 kubernetes 를 제외한 다른 element가 남아있다면 어떤 extension controller가 namespace를 초기화는 하고 정리는 못한 케이스.

    2. 이 케이스는 우선 현재 클러스터에 namespace finalizer를 붙이는 controller가 무엇인가를 먼저 파악하고 수정해야한다.

  2. kubernetes finalizer가 정리되지 않는 케이스

    1. kubernetes 는 기본 finalizer로 namespace 내부의 모든 리소스가 정리되면 삭제된다. 그런데 이 finalizer가 삭제되지 않는다는 이야기는 리소스 정리 과정에서 에러가 발생했다는 이야기가 된다.

    2. 따라서 우선 namespace에 진짜 모든 리소스가 삭제된건지 확인해봐야한다. kubectl get all 의 경우 category all인 리소스들만 보여주므로 진짜로 모든 리소스를 보여주는게 아니다. kubectl api-resources --namespaced=true -o name 명령어로 체크해야될 모든 리소스의 이름을 확인할 수 있다. 확인 과정에서 삭제되지않고 있는 리소스가 있다면 그 리소스가 삭제되지 못하고 있는 이유를 확인해야한다. 보통은 .metadata.finalizers 에 원인이 있을 가능성이 높다.

    3. 위에서 확인해본 결과 모든 리소스가 삭제된게 맞다면 이번에는 admission webhook이나 extension api server 에서 에러가 발생했다는 이야기다. namespace가 삭제될 때 각 리소스를 삭제하기 위해서 보내는 요청은 delete가 아니라 delete-collection이므로 delete-collection에 대해서 제대로 처리했는지 다시 한번 확인해야한다.

참고로 namespace의 .spec.finalizers 는 sub resource이기 때문에 kubectl edit 또는 kubectl update 으로 수정되지 않는다. 따라서 curl 등을 통해서 직접 finalizers sub resources api를 호출해야 한다.

사용한 스크립트

모든 리소스 체크용 스크립트

#!/usr/bin/env bash
die() {
  echo "$*" 1>&2
  exit 1
}
need() {
  command -v "$1" &>/dev/null || die "Binary '$1' is missing but required"
}

need "kubectl"

echo "------------------------------------------------"
echo "get all resources in namespace..."
echo "------------------------------------------------"
FOUND=""
NOT_FOUND=""
ERROR=""
RESOURCES=$(kubectl api-resources --namespaced=true -o name)
for resource in $RESOURCES; do
  if [[ $resource =~ "metrics" ]]; then
    continue
  fi

  found=$(kubectl get "$resource" 2>&1)
  if [[ "$found" == "No resources found." ]]; then
    echo "$resource: $found"
    NOT_FOUND="$NOT_FOUND\n$resource"
  elif [[ $found =~ "Error" ]]; then
    echo "$resource: $found"
    ERROR="$ERROR\n$resource"
  else
    printf ">> %s:\n%s" "$resource" "$found"
    FOUND="$FOUND\n$resource"
  fi
done

echo "------------------------------------------------"
echo "summary"
echo "------------------------------------------------"
printf ">> found: %b\n" "$FOUND"
echo "------------------------------------------------"
printf ">> not found: %b\n" "$NOT_FOUND"
echo "------------------------------------------------"
printf ">> error: %b\n" "$ERROR"

namespace finalizers 강제로 비우는 스크립트

#!/usr/bin/env bash
set -eo pipefail

die() {
  echo "$*" 1>&2
  exit 1
}
need() {
  command -v "$1" &>/dev/null || die "Binary '$1' is missing but required"
}

need "jq"
need "curl"
need "kubectl"

TARGET_NAMEPSACE="$1"
TOKEN="$2"
API_SERVER=$(kubectl cluster-info | grep "Kubernetes master" | awk -F ' ' '{print $6}' | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g")

test -n "$TARGET_NAMEPSACE" || die "Missing arguments: $0 <namespace> <token>"
test -n "$TOKEN" || die die "Missing arguments: $0 <namespace> <token>"
test -n "$API_SERVER" || die "failed to get kubernets api address"

echo "trying to remove finalizers of namespace '$TARGET_NAMEPSACE'..."
kubectl get namespace "$TARGET_NAMEPSACE" -o json | \
jq 'del(.spec.finalizers[] | select("kubernetes"))' | \
curl -k -X PUT --insecure "$API_SERVER/api/v1/namespaces/$TARGET_NAMEPSACE/finalize" \
  -H "Authorization: Bearer ${TOKEN}" \
  -H "Content-Type: application/json" \
  --data-binary @-
Previous트러블 슈팅Next쿠버네티스 마스터

Last updated 5 years ago