Namespaces

cometLEE·2023년 10월 24일
0

kubernetes

목록 보기
13/16

NameSpace에 대해 공부한 내용을 정리한 글입니다.

쿠버네티스 공식 홈페이지 - Kubernetes Namespaces를 참고하여 진행하였습니다.
또한, 마스터 노드1, 워커노드 2로 실습 진행하였습니다.
🤣🤩😊CKA 자격증 준비 및 쿠버네티스 공부 정리입니다.


서론

용도와 목적이 다른 오브젝트들이 존재하는 상태에서 배포되면 어떻게 될까요?
적은 수의 오브젝트면 상관 없겠지만, 수백개가 존재한다면?
어플리케이션마다 할당되는 리소스들을 일일히 관리하기는 어려울 것입니다.
따라서 쿠버네티스에서는 namespace를 제공합니다.


Namespaces

Kubernetes에서 네임스페이스는 단일 클러스터 내의 리소스 그룹을 격리하기 위한 메커니즘을 제공합니다.
namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위입니다.
클러스터안에 가상의 클러스터들이 존재하는 것이라고 생각하시면 됩니다!
하지만, 물질적으로 분리하는 것이 아니기 때문에 네임스페이스가 다른 리소스와 통신이 가능합니다!

  • 리소스 이름은 네임스페이스 안에서는 고유해야 하지만, 다른 네임스페이스 안에서 같은 이름의 리소스 정의가 가능합니다.
  • 클러스터 전체에 속하는 개체인 StroageClass, Node, PV 등은 적용 x

namespace 리소스 할당량 설정

위의 그림처럼 namespace를 사용하여 논리적으로 가상의 클러스터들을 꾸릴 수 있고, 각 namespace마다 컴퓨팅 자원을 설정 할 수 있습니다.


namespace 종류

  • default
  • kube-node-lease
  • kube-public
  • kube-system

default: kubernetes의 기본 namespace. 네임스페이스가 만들어져 있지 않고 네임스페이스를 따로 설정해주지 않으면 default로 지정됨.

kube-node-lease: lease객체를 사용해 노드가 죽어있는지 살아있는지(가용성) 체크할 때 사용함.

kube-public: 모든 클라이언트에서 접근할 수 있는 데이터가 포함된 네임스페이스.

kube-system: kubernetes 시스템에서 생성된 객체의 네임스페이스. 따라서 사용자는 kube- 접두사를 사용해서 네임스페이스를 생성하면 안된다.

namespace 조회

$ kubectl get ns
or
$ kubectl get namespaces

기본 네임스페이스는 default입니다.

따라서 default 네임스페이스에 똑같은 이름인 nginx파드를 생성하지 못합니다.


namespace별 리소스 확인

네임스페이스별 리소스를 확인할 때는 -n옵션을 사용합니다.
기본 네임스페이스는 default이기 때문에 -n옵션을 주지 않을 경우 default 네임스페이스의 리소스만 출력됩니다.

$ kubectl get all	# namespace 리소스 확인

$ kubectl get all -n [namespace Name]	# 네임스페이스 별 리소스 확인

네임스페이스를 새로 생성하고 리소스들도 생성한 뒤, 네임스페이스를 삭제하면 그 안의 리소스들도 모두 삭제됩니다.

namespace 정보 확인

  • 특정 네임스페이스 요약
$ kubectl get namespaces [name]
  • 자세한 정보
$ kubectl describe namespaces [name]

namespace 생성

namespace 생성은 명령어 or yaml(사용자 정의 파일)로 가능하다.

  • 명령어
$ kubectl create namespace my-ns
or
$ kubectl create ns [name]

  • yaml
# my-namespace.yaml

apiVersion: v1
kind: Namespace
metadata:
  name: <insert-namespace-name-here>
$ kubectl create -f [yaml파일]

리소스 생성에 네임스페이스 설정

리소스 생성함과 동시에 네임스페이스를 할당할 때는 --namespace플래그를 사용합니다.

$kubectl run nginx --image=nginx --namespace=<insert-namespace-name-here>

# namespace 이름을 필터로 pod 리소스 확인
$kubectl get pods --namespace=<insert-namespace-name-here>


namespace 삭제

네임스페이스를 삭제시 네임스페이스에 포함된 리소스들은 모두 삭제됩니다.

  • 이 삭제는 비동기식이므로 한동안 Terminating상태에 네임스페이스가 표시됩니다.
  • 쿠버네티스 설치시 같이 생성되는 kube-system namespace 를 삭제하게 되면 쿠버네티스 클러스터 사용이 불가함으로 삭제를 해서는 안됩니다.
$ kubectl delete namespace [name]
or
$ kubectl delete ns [name]
$ kubectl delete -f [yaml 파일]

활성화 namespace 변경

해당 컨텍스트의 모든 후속 kubectl 명령에 대한 네임스페이스를 영구적으로 저장할 수 있습니다.

쿠버네티스의 기본 namespace는 default입니다. 현재 사용 중인 namespace인 default를 my-ns로 변경하는 작업을 진행해보겠습니다.

$ kubectl config set-context --current --namespace=<insert-namespace-name-here>

이후 kubectl의 명령은 변경된 네임스페이스에서 수행되게 됩니다.
또한, default에 존재하던 namespace가 안보이는데 삭제된 것이 아니라, my-ns라는 namespace로 이동하면서 보이지 않게 된 것입니다.

활성화된 네임스페이스 확인

$ kubectl config view | grep namespace


네임스페이스가 적용되지 않는 리소스확인

위에서 언급했던 StroageClass, PV, node 등 클러스터 수준 리소스는 네임스페이스가 존재하지 않습니다.

  • namespace가 존재
$ kubectl api-resources --namespaced=true
  • namespace가 없음
$ kubectl api-resources --namespaced=false


정리

namespace는 논리적인 클러스터 구성을 위해 필요한 object이다.

namespace에 대해 다루지 못했어서 이해를 못했었는데 직접 실습해보니 와닿는 것 같습니다. 다음 포스팅에서는 namespace와 관련된 RBAC에 대해 다루겠습니다.

profile
server, kubernetes에 관심이 많이 있습니다

0개의 댓글