✔️ 이름과 UID
클러스터의 각 오브젝트는 해당 유형의 리소스에 대하여 고유한 이름을 가지고 있다. 이름은 Namespace 내에서 유일하면 된다.
Namespace
는 분리하기 위한 용도와, DNS이름이 분리되는 용도를 위해 사용한다.
기본적으로는 default Namespace
를 사용한다.
오브젝트를 리소스로 만들 때 쿠버네티스의 컨트롤러 매니저는 해당되는 리소스에 UID
를 붙이게 되고,
모든 쿠버네티스 오브젝트는 전체 클러스터에 걸쳐 고유한 UID를 가지고 있다.
✔️ Namespace
namespace란, 쿠버네티스 클러스터 내의 논리적인 분리 단위이다.
다음과 같이 리소스를 분리할 수 있다.
리소스 분리
- 서비스 별
- 사용자 별
- 환경: 개발, 스테이징, 프로덕션
기본 작업 공간은 default
namespace이다.
네임스페이스 확인하기
$ kubectl get namespaces
$ kubectl get ns
--namespace
옵션을 명시하지 않으면 모두 default 네임스페이스에서 수행된다.
-n
== --namespace
예시 : default
네임스페이스에서 생성된 포드 확인하기
$ kubectl get pods --namespace default
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 47m
모든 네임스페이스의 리소스 확인
-A
== --all-namespaces
$ kubectl get <RESOURCE> namespaces -A
$ kubectl get <RESOURCE> --all-namespaces
예시
$ kubectl get pods --all-namespaces
- kube-system: Kubernetes의 핵심 컴포넌트
- kube-public: 모든 사용자가 읽기 권한(슈퍼유저는 어떤
Namespace
든 읽고 쓸 수 있다) - kube-node-lease: 노드의 HeartBeat 체크를 위한 Lease 리소스가 존재
- default: 기본 작업 공간
$ kubectl get pods -n kube-public
lease
leases
는 HB(Heart Beat) 즉, 노드가 죽어있는지 살아있는지 체크할 때 사용하는 리소스이다.
$ kubectl get leases -n kube-node-leases
결과는 노드의 목록과 같다.
$ kubectl get leases -n kube-node-lease
NAME HOLDER AGE
node1 node1 20h
node2 node2 20h
node3 node3 20h
$ kubectl get nodes
NAME STATUS ROLES AGE VERSION
node1 Ready control-plane,master 20h v1.22.8
node2 Ready <none> 20h v1.22.8
node3 Ready <none> 20h v1.22.8
Namespace 생성하기
- 명령형 커맨드로 생성하기
$ kubectl create namespace developments
- yaml 파일로 생성하기
예시 1
ns-dev.yaml
apiVersion: v1
kind: Namespace
metadata:
name: dev
$ kubectl create -f dev-ns.yaml
namespace/dev created
예시 2
myweb-dev.yaml
apiVersion: v1
kind: Pod
metadata:
name: myweb
namesapce: dev
spec:
containers:
- name: myweb
image: httpd
ports:
- containerPort: 80
protocol: TCP
생성한 yaml
파일로 파드를 생성한다.
$ kubectl create -f myweb-dev.yaml
$ kubectl get ns
NAME STATUS AGE
default Active 14h
dev Active 3s
kube-node-lease Active 14h
kube-public Active 14h
kube-system Active 14h
namespace가 다르면 pod의 이름은 같아도 되고, 아래 2개의 myweb
는 서로 다른 것이다.
--> default
네임스페이스의 myweb
과 dev
네임스페이스의 myweb
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 33m
$ kubectl get pods -n dev
NAME READY STATUS RESTARTS AGE
myweb 1/1 Running 0 38m
Namespace 삭제하기
단, 지울 때는 네임스페이스에 리소스가 없어야 한다.
$ kubectl delete ns <NAMESPACE>
$ kubectl delete pods <Pod> -n <NAMESPACE>
pod
삭제 시, -n
옵션을 붙이지 않으면 default namespace
에서 삭제되므로 주의해야 한다.
👉 참고 사항 1
namespace.spec
을 확인하면 finalizers
라는 필드를 확인할 수 있다.
$ kubectl explain namespace.spec
KIND: Namespace
VERSION: v1
RESOURCE: spec <Object>
DESCRIPTION:
Spec defines the behavior of the Namespace. More info:
https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#spec-and-status
NamespaceSpec describes the attributes on a Namespace.
FIELDS:
finalizers <[]string>
Finalizers is an opaque list of values that must be empty to permanently
remove object from storage. More info:
https://kubernetes.io/docs/tasks/administer-cluster/namespaces/
Finalizers는
리소스를 지울 때 어떻게 할 것인지에 대한 설정을 하는 것이다.
yaml
파일을 통해 파드를 생성할 때, 아주 드물게 spec
이 없는 경우가 있는데,
namespace는 Finalizers
라는 필드가 없으면 spec
을 설정할 이유가 없다.
👉 참고 사항2
$ kubectl api-resource
kubectl api-resources | more
NAME SHORTNAMES APIVERSION NAMESP
ACED KIND
bindings v1 true
Binding
componentstatuses cs v1 false
ComponentStatus
configmaps cm v1 true
ConfigMap
endpoints ep v1 true
Endpoints
events ev v1 true
...
여기서 NAMESPACED 는 네임스페이스의 사용 여부이다.
true는 네임스페이스를 사용하는 것이고,
false는 네임스페이스를 사용하지 않는 것으로 Global 리소스이다.
--->특정 네임스페이스가 아닌 클러스터 전체에 영향을 미친다.)