본문 바로가기
Framework and Tool/Kubernetes

Kubernetes - Namespace

by ocwokocw 2022. 10. 9.

- 출처: Kubernetes in action

- 출처: https://github.com/ahmetb/kubectx
 

- 네임스페이스

앞에서 배운 레이블을 통해 리소스를 그룹화할 수 있었다. 레이블은 하나의 오브젝트에 여러 개를 할당할 수 있으므로 오브젝트 그룹이 서로 겹칠 수 있다. 만약 레이블이 어떤 구조로 되어있는지 모르는 사용자가 kubectl을 통해 처음 리소스를 조회할 때 셀렉터를 지정하지 않고 조회하면 모든 오브젝트를 봐야 한다. 쿠버네티스는 한번에 하나의 그룹에서만 작업할 수 있도록 오브젝트를 그룹화해주는 네임스페이스 개념을 제공한다.
 
네임스페이스를 사용하면 많은 구성요소를 가진 복잡한 시스템을 더 작은 개별그룹으로 분리할 수 있다. 리소스를 개발, QA 같은 환경으로 나누거나 원하는 방법으로 나눌 수 있게 된다. 대부분에 리소스 유형은 네임스페이스에 속하지만 일부는 속하지 않는데 노드의 경우 전역(global) 리소스에 해당한다.
 
클러스터에 있는 네임스페이스를 조회하려면 "kubectl get ns" 명령어를 이용한다.
 
 
 
여태까지 파드를 생성하는 작업을 하면서 네임스페이스를 특별히 지정하거나 신경쓰지 않고 작업했었다. 특별히 지정을 하지 않았다면 기본적으로 default 네임스페이스 공간에서 작업하게 된다.
 
다른 네임스페이스의 파드를 조회해보기 위해 kube-system 네임스페이스의 파드를 조회해보자. 파드를 조회하는 명령어까지는 같고, 네임스페이스에 대한 옵션(--namespace)만 추가해주면 된다.
 
 
 
로컬 환경에서 작업할때에는 네임스페이스의 이점을 크게 체감하기 힘들다. 보통 규모가 있는 회사의 경우 쿠버네티스 관련 인프라가 구축된곳이 많은데, 이런 경우 하나의 클러스터에 다수의 사용자가 있게 된다. 이런 경우 네임스페이스를 사용하게 되면 단순 분리와 더불어 아래와 같은 이점이 있다.
 
  • 실수로 다른 사람 리소스를 삭제/수정하는것을 방지
  • 특정 사용자와 리소스 접근제어 설정 가능
 
네임 스페이스는 "kubectl create namespace" 명령어를 이용하거나 yaml 파일을 사용해서 생성할 수 있다.
 
apiVersion: v1
kind: Namespace
metadata:
  name: custom-namespace
 
yaml 파일을 통해 네임스페이스를 생성해보자.
 
 
 
새로 생성한 custom-namespace 안에 kubia-manual 파드를 생성해보자. 이럴 경우 2가지 방법으로 생성이 가능한데, yaml 파일에서 metadata 섹션에 namespace: custom-namespace를 기술해주거나 "kubectl create" 명령어 이용시 옵션을 주는 방법이 있다. 앞에서 yaml 파일을 통해서 네임스페이스를 생성해봤으니 "kubectl create" 명령어에 -n 옵션을 주고 생성해보겠다.
 
 
 
default 네임스페이스와 custom-namespace의 파드들을 조회해보면 의도한 대로 파드가 생성됐음을 알 수 있다. 또한 같은 파드 이름이어도 네임스페이스가 다르면 상관없다는것을 알 수 있다.
 
kubectl 이용시 다른 네임스페이스의 오브젝트 연산을 할 때마다 --namespace 옵션을 전달해야 하는 번거로움이 있다. 이런 경우 멀티 클러스터와 네임스페이스 관련한 작업 context 전환을 쉽게 해줄 수 있는 툴을 사용하면 편리하다. 다음 URL을 참조하여 각자 OS 환경에 맞게 설치하자. (https://github.com/ahmetb/kubectx)
 
설치하고나면 클러스터와 네임스페이스 전화을 대화형으로 선택할 수 있다. 아래는 각각 "kubectx" 명령과 "kubens" 명령을 순차적으로 실행한 모습이다.
 
 
 
 
네임스페이스가 리소스를 속한 대상을 분리해주긴 하지만 실행중인 오브젝트에 대한 격리는 해주지 않는다. 예를 들어 파드들이 서로 다른 네임스페이스에 속했다고 해서 통신할 수 없다고 생각할 수 있겠지만 반드시 그런것은 아니다. 이는 쿠버네티스와 함께 배포하는 네트워킹 솔루션에 따라 다르다.
 

- 파드 중제 및 제거

파드를 중지하려면 "kubectl delete pod [파드명]" 명령어를 이용해서 삭제하면 된다. 여러 개를 삭제하고 싶은 경우 파드명에 공백으로 여러 개의 파드명을 나열하면 된다.
 
파드를 삭제하면 파드내의 컨테이너를 종료하라고 명령한다. 이때 내부적으로는 SIGTERM 을 전달한 후 30초(default)를 대기한다. 만약 그래도 종료되지 않으면 SIGKILL 신호를 전달한다.
 
레이블을 할당했으니 레이블 셀렉터를 이용하여 파드를 삭제해보자. 레이블 셀렉터를 이용한 조회 연산은 "kubectl get" 명령어와 함께 "-l" 옵션을 이용했는데 이와 유사하게 "kubectl delete" 명령어와 "-l" 옵션을 활용하면 된다.
 
 
 
네임스페이스 삭제를 통해서도 파드를 삭제할 수 있다.
 
 
 
이번엔 네임스페이스를 유지하면서 파드들만 삭제해보자. 현재 작업 공간인 default 네임 스페이스의 모든 파드들을 삭제 한다. "kubectl delete pod --all" 명령어를 실행해보자.
 
 
 
존재하던 파드는 삭제 됐지만 갑자기 새로운 파드가 생겨났다. 이는 파드를 1개로 유지시켜주는 디플로이먼트를 삭제하지는 않았기 때문에 파드를 삭제했을 때 곧바로 신규 파드를 하나 생성해주었기 때문이다. 네임스페이스내의 모든 리소스를 삭제해주자.
 
 
 
"kubectl delete all --all" 명령어가 헷갈릴 수 있다. 단일 파드 삭제할 때 명령어를 떠올리면 이해가 수월한데 "kubectl delete pod [파드명]" 명령어 실행시 리소스 유형과 리소스 인스턴스(파드명)를 지정했었다. 따라서 "kubectl delete all(모든 리소스 유형) --all(모든 리소스 인스턴스)"식으로 이해하면 된다.
 
 
 

'Framework and Tool > Kubernetes' 카테고리의 다른 글

Kubernetes - Replication controller  (0) 2022.10.11
Kubernetes - Liveness probe  (0) 2022.10.10
Kubernetes - Label 및 Annotation  (0) 2022.10.09
Kubernetes - Pod  (0) 2022.10.09
Kubernetes - deploy app tutorial  (0) 2022.10.06

댓글