NameSpace에 대해 공부한 내용을 정리한 글입니다.
쿠버네티스 공식 홈페이지 - Kubernetes Namespaces를 참고하여 진행하였습니다.
또한, 마스터 노드1, 워커노드 2로 실습 진행하였습니다.
🤣🤩😊CKA 자격증 준비 및 쿠버네티스 공부 정리입니다.
용도와 목적이 다른 오브젝트들이 존재하는 상태에서 배포되면 어떻게 될까요?
적은 수의 오브젝트면 상관 없겠지만, 수백개가 존재한다면?
어플리케이션마다 할당되는 리소스들을 일일히 관리하기는 어려울 것입니다.
따라서 쿠버네티스에서는 namespace를 제공합니다.
Kubernetes에서 네임스페이스는 단일 클러스터 내의 리소스 그룹을 격리하기 위한 메커니즘을 제공합니다.
namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위입니다.
클러스터안에 가상의 클러스터들이 존재하는 것이라고 생각하시면 됩니다!
하지만, 물질적으로 분리하는 것이 아니기 때문에 네임스페이스가 다른 리소스와 통신이 가능합니다!
위의 그림처럼 namespace를 사용하여 논리적으로 가상의 클러스터들을 꾸릴 수 있고, 각 namespace마다 컴퓨팅 자원을 설정 할 수 있습니다.
default
: kubernetes의 기본 namespace. 네임스페이스가 만들어져 있지 않고 네임스페이스를 따로 설정해주지 않으면 default로 지정됨.
kube-node-lease
: lease객체를 사용해 노드가 죽어있는지 살아있는지(가용성) 체크할 때 사용함.
kube-public
: 모든 클라이언트에서 접근할 수 있는 데이터가 포함된 네임스페이스.
kube-system
: kubernetes 시스템에서 생성된 객체의 네임스페이스. 따라서 사용자는 kube-
접두사를 사용해서 네임스페이스를 생성하면 안된다.
$ kubectl get ns
or
$ kubectl get namespaces
기본 네임스페이스는 default입니다.
따라서 default 네임스페이스에 똑같은 이름인 nginx파드를 생성하지 못합니다.
네임스페이스별 리소스를 확인할 때는 -n
옵션을 사용합니다.
기본 네임스페이스는 default이기 때문에 -n
옵션을 주지 않을 경우 default 네임스페이스의 리소스만 출력됩니다.
$ kubectl get all # namespace 리소스 확인
$ kubectl get all -n [namespace Name] # 네임스페이스 별 리소스 확인
네임스페이스를 새로 생성하고 리소스들도 생성한 뒤, 네임스페이스를 삭제하면 그 안의 리소스들도 모두 삭제됩니다.
$ kubectl get namespaces [name]
$ kubectl describe namespaces [name]
namespace 생성은 명령어 or yaml(사용자 정의 파일)로 가능하다.
$ kubectl create namespace my-ns
or
$ kubectl create ns [name]
# 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>
네임스페이스를 삭제시 네임스페이스에 포함된 리소스들은 모두 삭제됩니다.
이 삭제는 비동기식이므로 한동안 Terminating상태에 네임스페이스가 표시됩니다.
쿠버네티스 설치시 같이 생성되는 kube-system namespace 를 삭제하게 되면 쿠버네티스 클러스터 사용이 불가함으로 삭제를 해서는 안됩니다.
$ kubectl delete namespace [name]
or
$ kubectl delete ns [name]
$ kubectl delete -f [yaml 파일]
해당 컨텍스트의 모든 후속 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 등 클러스터 수준 리소스는 네임스페이스가 존재하지 않습니다.
$ kubectl api-resources --namespaced=true
$ kubectl api-resources --namespaced=false
namespace는 논리적인 클러스터 구성을 위해 필요한 object이다.
namespace에 대해 다루지 못했어서 이해를 못했었는데 직접 실습해보니 와닿는 것 같습니다. 다음 포스팅에서는 namespace와 관련된 RBAC에 대해 다루겠습니다.